Form ueber Handle ansprechen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Form ueber Handle ansprechen

Beitrag von piper62 »

Hallo,

weiss Jemand eine Lösung, die platformunabhängig läuft bei der ich eine Form über das Handle ansprechen kann.
Unter MS-Win geht es ja über:
ShowWindow(v_handle,SW_SHOW);
wobei: v_handle: HWND;

Ich kann auch beim erzeugen einer Form über: v_handle:=form1.handle;
das Handle der Form bekommen.
Nur würde ich jetzt gerne die Form wieder über das Handle aktivieren können.
In der Unit "Forms" gibt es zwar die Methode "ShowWindow" aber da streikt der Compiler unter Linux und meldet:
Error: Identifier not found

Weiss Jemand Rat?

Gruss,
Tibor

Benutzeravatar
theo
Beiträge: 11010
Registriert: Mo 11. Sep 2006, 19:01

Re: Form ueber Handle ansprechen

Beitrag von theo »

piper62 hat geschrieben: bei der ich eine Form über das Handle ansprechen kann.
Wozu?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Es gibt mehrer gründe z.b. um Botschaften an ein Fenster zu senden. Von einem anderen Programm z.b. Aber SowWindow sollte in lclproc oder lclinft drin sein....
MFG
Michael Springwald

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Beitrag von piper62 »

Ganz einfach: Ich erzeuge mehrere Forms, die alle ein unterschiedliches Handle bekommen.
Das kann ich sehen. Bis hierhin ist Alles OK.
Nun muss es doch möglich sein diese Forms wieder ueber das Handle anzusprechen, oder?
In der Forms Unit wäre die Methode ja auch drin aber ich bekomme - wie gesagt - eine Fehlermeldung.

Benutzeravatar
theo
Beiträge: 11010
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:Es gibt mehrer gründe z.b. um Botschaften an ein Fenster zu senden.
Wozu?

Benutzeravatar
theo
Beiträge: 11010
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

piper62 hat geschrieben:Ganz einfach: Ich erzeuge mehrere Forms, die alle ein unterschiedliches Handle bekommen.
Aber du kriegst doch v.a. ein TForm Objekt zurück. Was kümmert dich das Handle?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

um ein Fenster von außen zu aktivieren oder um bestimmte Komponenten im Fenster anzusprechen. oder ein Fenster von außen zu schließen.

Mit Außen meine ich jetzt von einem anderen Programm aus oder so.... gemacht habe ich sowas auch noch nie...
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 11010
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:um ein Fenster von außen zu aktivieren oder um bestimmte Komponenten im Fenster anzusprechen. oder ein Fenster von außen zu schließen.
Joh, sehr sinnvoll... ;-)

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Beitrag von piper62 »

Pluto: Danke! Es war die LCLIntf die gefehlt hat.
Nun klappt es.

Theo: Ich erzeuge mehrere Forms, die den gleichen Namen haben. Ausserdem möchte ich auch externe Programme steuern können. Meines Wissens nach geht das nur über das Handle?
Siehst Du noch eine andere Möglichkeit wenn etwas in dieser Art mehrfach durchgeführt wird:
Application.CreateForm(TForm1,Form1);
??
Nach dem Create kann ich mir über Form1.Handle das Handle holen und dann diese Form darüber ansprechen.

Bin offen für Verbesserungsvorschläge.

Gruss,
Tibor

Benutzeravatar
theo
Beiträge: 11010
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

piper62 hat geschrieben: Nach dem Create kann ich mir über Form1.Handle das Handle holen und dann diese Form darüber ansprechen.
Aber die Form sprichst du hier doch über Form1 an. Dazu brauchst du doch nicht dessen Widgetset- Handle.

Ich kapier dich nicht.

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Beitrag von piper62 »

Es gibt mehrere Form1, die auch zur gleichen Zeit existieren. Unterscheiden lassen Sie sich meines Wissens nach nur anhand der Instanz, d.h. in der Repräsentation des Betriebssystems über das Handle.
Oder liege ich da falsch?
Wenn ich einfach nur Form1.Activate mache, erwische ich immer nur die zuketzt erzeugte Form.
Über das Handle kann ich nun auch davor erzeugte Instanzen ansprechen.

So klarer?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Was genau hast du eigentlich vor ? Warum erzeugst du mehrer TForm1 Instanzen ?
Das Verhalten ist für mich normal. Da ja in Form1 die zuletzte erstelle Form gespeichert wird.
Nun musst du entweder auf API zurückgreifen z.b. Sendmessger oder so. oder du musst alle instanzen in einer Liste Speichern.

Aber beschreibt bitte erst was du genau erreichen möchtest. So eine art MDI Anwendung ?
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 11010
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

piper62 hat geschrieben: So klarer?
Irdendwo speicherst du ja die Handles auch, wie willst du sonst zugreifen?
Wieso speicherst du stattdessen nicht das Objekt (bzw den Pointer drauf),

Also bspw statt:
MyHandleList.Add(Form1.Handle);
Das:
MyFormList.Add(Form1);
Ist doch viel logischer.

Genauso wie das Handle ändert, ändert auch die Speicherstelle der Instanz, wenn du die im Loop erzeugst.
Also kannste das Handle vergessen.
Form1 zeigt immer auf die aktuelle Form im Loop, also am Ende natürlich auf die letzte, deshalb jeden Instanzzeiger in Liste speichern.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Form1 zeigt immer auf die aktuelle Form im Loop, also am Ende natürlich auf die letzte, deshalb jeden Instanzzeiger in Liste speichern.
genau so habe ich es auch gemeint *G*
MFG
Michael Springwald

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Beitrag von piper62 »

die Lösung über die Handles funktioniert. Aber ich werde es auch über Euren Ansatz probieren.
Danke!
Wir können das ja dann in Nürnberg diskutieren...

Gruss

Antworten