Autor |
Beitrag |
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 08.08.17 05:42
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 08.08.17 18:20
Frühlingsrolle hat folgendes geschrieben : | 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.
Frühlingsrolle hat folgendes geschrieben : | 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!
Frühlingsrolle hat folgendes geschrieben : | 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
|
Verfasst: Di 08.08.17 19:15
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 08.08.17 19:37
Frühlingsrolle hat folgendes geschrieben : | Ich kann nicht so gut hellsehen oder vermuten, wo du deine Controls genau hast, oder gar wieviele.
Man kann es natürlich auf deine Gegebenheit anpassen, wenn du bereit bist sie zu nennen. |
War ja kein Vorwurf, nimm's nicht persönlich!
Frühlingsrolle hat folgendes geschrieben : | Noch besser: Ich lasse dir den Vortritt und du darfst Verbesserungen daran durchführen, als Übungszweck. |
Damit wären wir bei:
Frühlingsrolle hat folgendes geschrieben : | 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! Naja...
Frühlingsrolle hat folgendes geschrieben : | 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
|
Verfasst: Di 08.08.17 20:07
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 09.08.17 21:11
Frühlingsrolle hat folgendes geschrieben : | 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
|
Verfasst: Do 10.08.17 00:32
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.08.17 17:58
Frühlingsrolle hat folgendes geschrieben : | 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
|
Verfasst: Do 10.08.17 18:02
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.08.17 18:35
_________________ 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
|
Verfasst: Do 10.08.17 19:02
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.08.17 19:16
Frühlingsrolle hat folgendes geschrieben : | 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
|
Verfasst: Do 10.08.17 19:47
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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.
Frühlingsrolle hat folgendes geschrieben : | 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:
Delphi-Quelltext 1: 2: 3:
| for j := 0 to wndCtrl.ControlCount - 1 do 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
|
Verfasst: Do 10.08.17 21:07
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 12.08.17 07:17
Frühlingsrolle hat folgendes geschrieben : | 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").
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
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 12.08.17 10:25
Bist du sicher, dass es an FindControl liegt? Die Zugriffsverletzung tritt erst bei SendMessage auf:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| for j := 0 to wndCtrl.ComponentCount - 1 do begin if wndCtrl.Components[j].ClassName = ControlClassName then begin hnd := TWinControl(wndCtrl.Components[j]).Handle; SendMessage(hnd, WM_SETTEXT, 0, Integer(PChar(Msg))); 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:
Delphi-Quelltext 1: 2: 3: 4:
| hnd := StrToInt(list[i]); wndCtrl := FindControl(hnd); if wndCtrl <> nil then for j := 0 to wndCtrl.ComponentCount - 1 do |
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
|
Verfasst: Di 15.08.17 07:27
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 16.08.17 18:21
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));
_________________ 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
|
Verfasst: Mi 16.08.17 18:26
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|