Envent Handling zum erbenden Fenster
Envent Handling zum erbenden Fenster
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.
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.
Re: Envent Handling zum erbenden Fenster
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;
Re: Envent Handling zum erbenden Fenster
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?
Re: Envent Handling zum erbenden Fenster
Ist das Hauptfenster denn nicht im Hintergrund bei Showmodal?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?
Und welches "Event Handling" schaffst du weshalb nicht?
Ich kann dein Problem nicht wirklich nachvollziehen.
Re: Envent Handling zum erbenden Fenster
bei showModal erscheint nur form4, wenn ich diese schließe kommt erst das Hauptfenster form1
-
- 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
Das liegt nicht an ShowModal, sondern daran, dass das Fenster in dem Ereignishandler von OnShow generiert wird, welches eintritt, bevor das Hauptfenster angezeigt wird.pasti hat geschrieben:bei showModal erscheint nur form4, wenn ich diese schließe kommt erst das Hauptfenster form1
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 ...
-
- 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
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 mitpasti 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.
Code: Alles auswählen
form4 = new TForm4.Create(nil);
try
form4.ShowModal;
finally
form4.free;
end;
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;
Ich hoffe, ich habe dir den nötigen Schubs gegeben, dass du weiterkommst.
greetz, Dets ...
Re: Envent Handling zum erbenden Fenster
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.
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.
Re: Envent Handling zum erbenden Fenster
Hallo Dets!
Ich habe deinen zweiten Beitrag leider zu spät gesehen. Deine Variante ist wohl die Optimalere.
Danke!
Ich habe deinen zweiten Beitrag leider zu spät gesehen. Deine Variante ist wohl die Optimalere.
Danke!
-
- 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
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.
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein