Autor Beitrag
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.08.17 05:42 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 08.08.17 18:20 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Man muss also beim Filtern der Fenster sogleich auch die momentanen Fenster-Handle-Werte mitschreiben:
Mit meiner Komponente TWideHLEditorX funktioniert es immer noch nicht, wobei ich dazu sagen muss, dass diese Kompenenten dynamisch zur Laufzeit erzeugt werden.
Mit TMemo oder TEdit wird der Text zwar in allen Instanzen eingefügt, aber jeweils nur in die zuerst erstellte Komponente, und dann auch nur, wenn diese direkt auf der Form liegt. Wenn sie auf einer Toolbar oder auf einem Panel liegt, klappt es nicht.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
PS: Wenn dein Projekt (T)SynEdit heißt und du außerdem die TSynEdit Komponente darin nutzt, sind Probleme vorgrogrammiert.
Ich verwende u.a. aus genau diesem Grund nicht TSynEdit, sondern eine von TJvWideHLEditor abgeleitete Komponente: TWideHLEditorX!

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Warum es mit der TJvWideHLEditor Komponente nicht so funktioniert, müsste man es sich genauer anschauen. Ihren Ursprung hat sie im TCustomControl, ebenso wie die bereits angesprochene TSynEdit Komponente.
Weil dynamisch erzeugt? Obwohl: Parent ist Form1...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.08.17 19:15 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 08.08.17 19:37 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Ich kann nicht so gut hellsehen oder vermuten, wo du deine Controls genau hast, oder gar wieviele. :twisted:
Man kann es natürlich auf deine Gegebenheit anpassen, wenn du bereit bist sie zu nennen. :mrgreen:
War ja kein Vorwurf, nimm's nicht persönlich!

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Noch besser: Ich lasse dir den Vortritt und du darfst Verbesserungen daran durchführen, als Übungszweck.
Damit wären wir bei:
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wenn sich ein Control z.B. auf einem Panel befindet, dann musst du zunächst das Panel mit FindWindowEx() suchen, den Handle-Wert dir merken, dann erneut mit FindWindowEx() nach dem besagten Control suchen, wobei dieses FindWindowEx() im ersten Parameter den Handle-Wert des Panels bekommt.
Wenn die "Ziel"-Komponente auf einer weiteren Komponente liegt, und - aus welchem Grund auch immer - diese wiederum auf einer weiteren Komponente, muss ich a) wissen, nach welchen Komponenten ich suchen muss und b) die Suche für jede der Komponenten durchführen, bis ich bei der Komponente angelangt bin, die ich eigentlich meine! :eyecrazy: Naja... :?

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es Probleme mit den deckungsgleichen Klassennamen gibt, wie in deinem Projekt zu TSynEdit, dann nenn' deine Hauptklasse z.B. TgaSynEdit und alles ist gut.
Es gibt keine Probleme mit TSynEdit, das kommt in meinem Programm gar nicht vor!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.08.17 20:07 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 09.08.17 21:11 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Ganz kurz gesagt: Mit FindWindowEx() suchst du von der Form weg, die nächst-untere Ebene auf, bis du an dein Ziel angelangst.
Erst dachte ich, wozu soll ich mir die ganze Arbeit machen? Aber jetzt werde ich mich wohl doch damit beschäftigen! Deine Lösung hat was! Ich wünschte nur, man könnte das allgemeiner halten, also statt nach TPanel zu suchen, sucht man nach TObject oder so ähnlich. Mal sehen, was ich rausfinde! Wird aber dauern.

Wenn ich es mit meiner Lösung, also mit Prozedur ReceiveData, mache, kann ich dort rein schreiben, was immer ich will. Nachteil: Die Fenster müssen zwingend eine Prozedur haben, die als Empfänger fungiert. Fenster, bei denen zwar die Caption stimmt, die aber keinen "Empfangsteil" haben, machen klarerweise nichts.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.08.17 00:32 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.08.17 17:58 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Man könnte es schon allgemeiner halten, wenn man sich den Zugriff zum Hauptfenster verschafft. Dann geht man mit .ControlCount alle Controls durch und sucht nach einem bestimmten Typen/Klasse:
Es funktioniert nicht, auch nicht mit if wndCtrl.Controls[j].ClassNameIs(ControlClassName) then statt if string(wndCtrl.Controls[j].ClassName) = ControlClassName then. (Hier kann man string doch weglassen!)
Das Control wird nur gefunden, wenn es direkt auf dem Fenster liegt. Wenn also ein Memo auf einem Panel liegt, welches auf dem Fenster liegt, dann klappt es mit dem Panel, wenn man 'TPanel' angibt: Die Caption ändert sich. Wenn man 'TMemo' angibt, tut sich mit dem Memo aber nichts.

Ich verstehe den Code, und eigentlich müsste ja alles stimmen...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.08.17 18:02 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.08.17 18:35 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Hast du den Code nun wirklich verstanden?
Ich denke schon, und mir fällt kein Fehler auf.
Mit Kommentaren versehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure SendText2(const CaptionSub, ControlClassName, Msg: string);
var
  i, j: Integer;
  list: TStringList;
  wndCtrl: TWinControl;
  hnd: HWND;
begin
  list := TStringList.Create;
  try
    GetSpecificWindowCaption(list, CaptionSub);  //Liste aller in Frage kommender Fenster samt Handles erstellen
    for i := 0 to list.Count - 1 do
    begin
      hnd := StrToInt(list[i]);  //Handle zuweisen
      wndCtrl := FindControl(hnd);  //Control suchen und zuweisen
      for j := 0 to wndCtrl.ControlCount - 1 do  //Alle Controls des Fensters durchgehen
      begin
        if string(wndCtrl.Controls[j].ClassName) = ControlClassName then  //Wenn Classname des Controls mit dem des 
        begin                                                         //angegebenen Controls übereinstimmt, dann
          hnd := TWinControl(wndCtrl.Controls[j]).Handle;             //Handle des Controls an hnd zuweisen und
          SendMessage(hnd, WM_SETTEXT, 0, Integer(PChar(Msg)));       //senden. Bei mehreren Fenstern Zugriffsverletzung.
        end;
      end;
    end;
  finally
    list.Free;
  end;
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.08.17 19:02 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.08.17 19:16 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Das Problem stellt FindControl() dar, und ich hätte gern gewusst, warum?!
Ich auch, aber vor allem möchte ich wissen, warum nur Controls gefunden werden, die auf dem Fenster liegen!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.08.17 19:47 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.08.17 20:50 
Ich möchte den Code so allgemein gestalten, dass ich ihn wieder verwenden kann, ohne ihn jedesmal anpassen zu müssen. Ein oder mehrere TEdit(s) zB. kann/können ohne Weiteres auf einem TPanel liegen.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Geht man nun den Zähler durch, kann man mit der Eigenschaft .Controls[i] auf alle Controls zugreifen, die auf dem Ausgangs-Control zur Verfügung stehen, TPanel inklusive, ist ja auch ein (sichtbares) Control. ;)
Kann man offensichtlich nicht, denn es werden nur solche Controls berücksichtigt, die direkt auf der Form liegen.
"auf alle Controls, die auf dem Ausgangs-Control zur Verfügung stehen" - das bedeutet, es müsste funktionieren. Wenn ich also TEdit angebe, und es liegt ein TEdit auf einem TPanel, warum funktioniert es dann nicht? Steht doch eindeutig da:
ausblenden Delphi-Quelltext
1:
2:
3:
for j := 0 to wndCtrl.ControlCount - 1 do  //Alle Controls des Fensters durchgehen
begin
  if string(wndCtrl.Controls[j].ClassName) = ControlClassName then


wndCtrl.Controls[j] ist doch das mit Index j "gelistete" TControl von wndCtrl, also von einem TWinControl. Wo es rumliegt, muss doch egal sein! Ich verstehe das nicht.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.08.17 21:07 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 12.08.17 07:17 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Das gibt's doch nicht! Na schön, dann ersetz' ControlCount durch ComponentCount, und Controls[i] durch Components[i].
Das habe ich zwar gemacht, aber dabei vergessen, auch
hnd := TWinControl(wndCtrl.Controls[j]).Handle; anzupassen, es also zu
hnd := TWinControl(wndCtrl. Components[j]).Handle; zu ändern, und natürlich hat das dann nicht funktioniert ("Listenindex außerhalb des gültigen Bereichs"). :oops:

Bleibt noch die Zugriffsverletzung bei mehreren Fenstern zu lösen!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 12.08.17 10:25 
Bist du sicher, dass es an FindControl liegt? Die Zugriffsverletzung tritt erst bei SendMessage auf:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for j := 0 to wndCtrl.ComponentCount - 1 do  //Alle Components des Fensters durchgehen
begin
  if wndCtrl.Components[j].ClassName = ControlClassName then
  begin
    hnd := TWinControl(wndCtrl.Components[j]).Handle;
    SendMessage(hnd, WM_SETTEXT, 0, Integer(PChar(Msg)));  //<-- Bei zwei Fenstern hält Delphi das Programm, wenn ich hier einen Haltepunkt setze, 2x an
  end;
end;

Alles bis zum SendMessage funktioniert also.

Andererseits kann man die Fehlermeldung verhindern, indem man wndCtrl auf nil überprüft, was mir sagt, es legt also doch an FindControl: Da ist also 1x etwas an wndCtrl zugewiesen, 1x nicht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
hnd := StrToInt(list[i]);  //Handle zuweisen
wndCtrl := FindControl(hnd);  //Control suchen und zuweisen
if wndCtrl <> nil then
  for j := 0 to wndCtrl.ComponentCount - 1 do  //Alle Components des Fensters durchgehen

Dennoch funktioniert es nur bei jener Instanz, aus der der Code aufgerufen wurde.
Ratlosigkeit macht sich breit...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 15.08.17 07:27 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 16.08.17 18:21 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Die Lösung wäre z.B. mit EnumChildWindows() an die Controls zu kommen, oder wie bereits erwähnt, mit FindWindowEx() alle Controls durchgehen und gegen den gesuchten Typ/Klasse prüfen.
Aber in Prozedur GetSpecificWindowCaption wird doch schon EnumWindows verwendet! Das erstellt doch schon eine Liste aller gefundenen Fenster samt deren Handles: AList.AddObject(wndCaption, TObject(hWnd)); // <-- Fenstertitel und zugehörige Handle mitschreiben

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.08.17 18:26 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher