Envent Handling zum erbenden Fenster

Rund um die LCL und andere Komponenten
Antworten
pasti
Beiträge: 7
Registriert: Fr 3. Dez 2010, 23:47

Envent Handling zum erbenden Fenster

Beitrag von pasti »

Hallo

Lazarus auf Windows 7
Mein Problem: ich habe ein Hauptfenster (Form1) und mit OnPaint erscheint das Anmeldungsfenster (Form4). Damit man nicht ins Hauptfenster kommt, ihne angemeldet zu sein, ist Form1.enabled:= false; . Bei gültiger Anmeldung (Button 'Ok') bzw. Abruch (Button 'Exit') sollte sich nun das Fenster form4 schließen (close) und Form1.enabled:=true; sein. Nur von Form1 habe ich keine Eventbehandlung für Form4.Button1 gefunden und von Form4 kann ich natürlich nicht auf Form1 zugreifen. Hat wer eine Idee? Kann ja eigentlich nicht so schwer sein.

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

Re: Envent Handling zum erbenden Fenster

Beitrag von theo »

Zeige das zweite Fenster im OnShow Event des Ersten modal, dann brauchst du den "enabled" Kram nicht.

Code: Alles auswählen

procedure TForm1.FormShow(Sender:TObject);
begin
  Form2.ShowModal;
end;

pasti
Beiträge: 7
Registriert: Fr 3. Dez 2010, 23:47

Re: Envent Handling zum erbenden Fenster

Beitrag von pasti »

ShowModal ist nicht übel, aber ich hätte ja gerne das Hauptfenster im Hintergrund und das Event Handling schaffe ich trotzdem nicht. Vielleicht hab ich ja von der Denkweise einen Fehler. Hat jemand eine bessere Idee?

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

Re: Envent Handling zum erbenden Fenster

Beitrag von theo »

pasti hat geschrieben:ShowModal ist nicht übel, aber ich hätte ja gerne das Hauptfenster im Hintergrund und das Event Handling schaffe ich trotzdem nicht. Vielleicht hab ich ja von der Denkweise einen Fehler. Hat jemand eine bessere Idee?
Ist das Hauptfenster denn nicht im Hintergrund bei Showmodal?
Und welches "Event Handling" schaffst du weshalb nicht?

Ich kann dein Problem nicht wirklich nachvollziehen.

pasti
Beiträge: 7
Registriert: Fr 3. Dez 2010, 23:47

Re: Envent Handling zum erbenden Fenster

Beitrag von pasti »

bei showModal erscheint nur form4, wenn ich diese schließe kommt erst das Hauptfenster form1

Dets
Beiträge: 61
Registriert: Di 11. Sep 2007, 16:59
OS, Lazarus, FPC: Ubuntu Maverick (L 0.9.28.2-10, FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Lage
Kontaktdaten:

Re: Envent Handling zum erbenden Fenster

Beitrag von Dets »

pasti hat geschrieben:bei showModal erscheint nur form4, wenn ich diese schließe kommt erst das Hauptfenster form1
Das liegt nicht an ShowModal, sondern daran, dass das Fenster in dem Ereignishandler von OnShow generiert wird, welches eintritt, bevor das Hauptfenster angezeigt wird.
Wenn du es in OnPaint hängst, dann wird zwar das Hauptfenster angezeigt - aber ohne Inhalt, denn OnPaint wird jedesmal ausgelöst, wenn der Fensterinhalt neu gezeichnet werden muss. Das passiert entweder, wenn das Fenster angezeigt wird, oder wenn Teile des Fensters verdeckt waren und jetzt sichtbar werden. Schlimmstenfalls verdeckt dein modales Fenster einen Teil vom Hauptfenster, dann bist du in einer Endlosschleife: es erzeugt beim Schließen wieder ein neues OnPaint-Ereignis, was wieder ein neues modales Fenster erzeugt.

greetz, Dets ...

Dets
Beiträge: 61
Registriert: Di 11. Sep 2007, 16:59
OS, Lazarus, FPC: Ubuntu Maverick (L 0.9.28.2-10, FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Lage
Kontaktdaten:

Re: Envent Handling zum erbenden Fenster

Beitrag von Dets »

pasti hat geschrieben:Nur von Form1 habe ich keine Eventbehandlung für Form4.Button1 gefunden und von Form4 kann ich natürlich nicht auf Form1 zugreifen. Hat wer eine Idee? Kann ja eigentlich nicht so schwer sein.
Ist es auch nicht. Grundsätzlich solltest du die Erzeugung aller Dialog-Formulare nicht automatisch durchführen lassen (im Menü Projekt - Projekteinstellungen - Formulare) sondern im Code, dort wo du sie benötigst, z.B. bei einem modalen Formular mit

Code: Alles auswählen

form4 = new TForm4.Create(nil);
try
  form4.ShowModal;
finally
  form4.free;
end;
dann wird das Formular nur für den Moment der Benutzerinteraktion erzeugt und gammelt nicht die ganze Zeit im Hauptspeicher rum.
Außerdem kannst du jetzt auf die Eigenschaften und Ereignisse von Form4 zugreifen (aber bitte erst nach dem try und vor ShowModal), z.B. indem du die Zeile

Code: Alles auswählen

form4.OnClick:=@Form4Click;
einbaust. Dazu musst du jetzt nur noch eine Funktion (den Eventhandler) mit Namen Form4Click in deinem TForm1 haben.

Ich hoffe, ich habe dir den nötigen Schubs gegeben, dass du weiterkommst.

greetz, Dets ...

pasti
Beiträge: 7
Registriert: Fr 3. Dez 2010, 23:47

Re: Envent Handling zum erbenden Fenster

Beitrag von pasti »

Danke Theo!

ShowModal hat mir doch sehr weitergeholfen. Nun habe ich auch eine Lösung gefunden. Sie ist vielleicht nicht die kürzeste, aber es funktioniert.
Die eigentliche Steuerung geschieht über eine Integervariable (status), die zu Form4 gehört. Dieser Wert kann 0,1 und 2 annehmen und ist auf 2 gesetzt.
procedure ButtonOk.OnCklik status = 1; Form4.Close;
procedure ButtonExit.OnClick status = 0; Form4.Close;
Form4.showModal habe ich bei procedure form1.Activiate eingebaut, wo als erster der wert von 'status' abgefragt wird, ist der Wert 2 dann Form4.ShowModal, status = 1 ist Form1 aktiv (bzw. Form4 geschlossen), status = 0 (Form4.ButtonExit) wird alles geschlossen.

Danke für Eure Hilfe, vielleicht kann meinen Lösungsweg auch wer brauchen.

pasti
Beiträge: 7
Registriert: Fr 3. Dez 2010, 23:47

Re: Envent Handling zum erbenden Fenster

Beitrag von pasti »

Hallo Dets!

Ich habe deinen zweiten Beitrag leider zu spät gesehen. Deine Variante ist wohl die Optimalere.

Danke!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Envent Handling zum erbenden Fenster

Beitrag von Socke »

Ganze Funktionen, die du suchst, gibt es bereits.
TForm.ShowModal liefert einen TForm.ModalResult zurück. Das kann man über TButton/TBitBtn/etc. automatisch setzen lassen, indem man diesen Steuerelementen den gewünschten Wert zuweist (ebenfalls Eigenschaft ModalResult).
Beachte bitte auch, dass du einen gültigen (und intuitiv richtigen) Status hast, wenn der Benutzer den Schließen-Button in der Fenster-Leiste (üblicherweise ein Kreuz) anklickt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten