Formulardaten auslesen
Formulardaten auslesen
Hi,
ich habe mir ein Formular gebastelt, in dem mehrere Eingaben möglich sind. Wie kann ich nun auf diese Werte zugreifen, wenn ich das Formular mit ShowModal öffne und es dann durch Klick auf "OK" geschlossen wird?
Danke
ich habe mir ein Formular gebastelt, in dem mehrere Eingaben möglich sind. Wie kann ich nun auf diese Werte zugreifen, wenn ich das Formular mit ShowModal öffne und es dann durch Klick auf "OK" geschlossen wird?
Danke
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Formulardaten auslesen
Meinst du zB Edit-Felder ?ich habe mir ein Formular gebastelt, in dem mehrere Eingaben möglich sind.
Dann würde die etwa so aussehen:
Code: Alles auswählen
Wert := Form2.Edit1.Text;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Formulardaten auslesen
Ja...
Heisst das, ich kann in dem Form, aus dem ich heraus FormEingabe.ShowModal aufgerufen habe, nach dem Schcliessen von FormEingabe dennoch vom aufrufenden Form aus darauf zugreifen?
MfG
Heisst das, ich kann in dem Form, aus dem ich heraus FormEingabe.ShowModal aufgerufen habe, nach dem Schcliessen von FormEingabe dennoch vom aufrufenden Form aus darauf zugreifen?
MfG
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Formulardaten auslesen
Dies müsste eigentlich gehen, da das Fenster nach dem schliessen immer noch vorhanden ist, aber nicht mehr angezeigt wird.
Probiere es doch einfach mal.
Probiere es doch einfach mal.

Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Formulardaten auslesen
Im OnClose des Formulars legst du über den var-Parameter Closeaction fest, was passieren soll.
caNone: Das Formular wird gar nicht geschlossen, das ist z.B. sinnvoll, wenn eine Eingabe als ungültig erkannt wird und noch korrigiert werden muss, bevor dein Programm weitermachen kann.
caHide: Das Formular wird unsichtbar, der Zugriff auf die Daten ist aber danach immer noch möglich
caMinimize: Das Formular wird minimiert, der Zugriff auf die Daten ist aber danach immer noch möglich
caFree: Das Formular wird geschlossen und freigegeben, danach kannst du natürlich auf die Daten nicht mehr zugreifen. Du musst daher im OnClose selbst die Daten des Formulars in Variable kopieren, die das Close des Formulars überleben.
caNone: Das Formular wird gar nicht geschlossen, das ist z.B. sinnvoll, wenn eine Eingabe als ungültig erkannt wird und noch korrigiert werden muss, bevor dein Programm weitermachen kann.
caHide: Das Formular wird unsichtbar, der Zugriff auf die Daten ist aber danach immer noch möglich
caMinimize: Das Formular wird minimiert, der Zugriff auf die Daten ist aber danach immer noch möglich
caFree: Das Formular wird geschlossen und freigegeben, danach kannst du natürlich auf die Daten nicht mehr zugreifen. Du musst daher im OnClose selbst die Daten des Formulars in Variable kopieren, die das Close des Formulars überleben.
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Formulardaten auslesen
Mit dem würde ich aber aufpassen, wen ein zweites mal ein ShowModal kommt, dann knallt es.caFree: Das Formular wird geschlossen und freigegeben, danach kannst du natürlich auf die Daten nicht mehr zugreifen.
Aber generell würde ich die Daten des Forms in einen Record speichern, es könnte ja sein, das der Benutzer "abbrechen" drückt und dann will man die alten Daten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- gladio
- Beiträge: 223
- Registriert: Sa 21. Jun 2014, 06:15
- OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: Formulardaten auslesen
Das kann ich so nicht bestätigen.Mathias hat geschrieben: Mit dem würde ich aber aufpassen, wen ein zweites mal ein ShowModal kommt, dann knallt es.
Ich schreibe fast immer
Code: Alles auswählen
procedure Tabc.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
...
CloseAction:=caFree;
end;
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Formulardaten auslesen
Das verwundert mich, da es angeblich frei gegeben wird.Das kann ich so nicht bestätigen.
Aber vielleicht wird es mit ShowModal wieder neu erzeugt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Formulardaten auslesen
Kann ich mir schwer vorstellen. Sollte es der Fall sein, dann wäre das ein ernster Fehler der Runtime, der zu melden wäre.gladio hat geschrieben:Das kann ich so nicht bestätigen.Mathias hat geschrieben: Mit dem würde ich aber aufpassen, wen ein zweites mal ein ShowModal kommt, dann knallt es.
Ich schreibe fast immerund das lässt sich problemlos mehrmals öffnen (mit ShowModal) und schließen ohne dass mich da was anspringt.Code: Alles auswählen
procedure Tabc.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin ... CloseAction:=caFree; end;
caFree bedeutet, das Formular soll nach dem Schließen freigegeben werden. Wenn das nicht passiert, gibt das für die Laufzeit des Programms ein Speicherleck, auch wenn dann ganz am Ende beim Schließen des Programms alle Komponenten, die Application untergeordnet sind, und damit auch alle untergeordneten Formulare freigegeben werden.
Showmodal kann das Formular nicht neu erzeugen, weil Showmodal eine Methode des Formulars ist. Jeder Methode wird als unsichtbarer Parameter per Compilermagic die Adresse der Klassenvariable mitgegeben, und wenn es die Klassenvariable nicht gibt, dann knallt es. Deshalb ist ja auch kein Klassenvariable.Create zum Erstellen einer neuen Variable möglich, sondern nur Klassenvariable := Klassenbezeichner.Create;
Zuletzt geändert von braunbär am So 27. Aug 2017, 23:01, insgesamt 1-mal geändert.
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Formulardaten auslesen
Also ich habe es jetzt probiert. Einmal geht das Form2 auf, aber beim zweiten Versuch schmiert es wie erwartet ab.Kann ich mir schwer vorstellen. Sollte es der Fall sein, dann wäre das ein ernster Fehler der Runtime, der zu melden wäre.
Siehe Anhang.
- Dateianhänge
-
free_test.tar.gz
- (126.34 KiB) 91-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- gladio
- Beiträge: 223
- Registriert: Sa 21. Jun 2014, 06:15
- OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: Formulardaten auslesen
Ist korrekt.
Beim normalen Erzeugen eines Formulars und anschließendem Aufruf mit ShowModal.
Aber so kann man das beliebig oft öffnen:
und wieder schließen
Das aufgerufene Formular darf dann natürlich nicht in der *.lpr erzeugt werden.
Beim normalen Erzeugen eines Formulars und anschließendem Aufruf mit ShowModal.
Aber so kann man das beliebig oft öffnen:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.Create(self);
Form2.ShowModal;
end;
Code: Alles auswählen
procedure TForm2.Button1Click(Sender: TObject);
begin
close;
end;
procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
CloseAction:=caFree;
end;
Code: Alles auswählen
begin
RequireDerivedFormResource:=True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
// Application.CreateForm(TForm2, Form2);
Application.Run;
end.
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Formulardaten auslesen
Klar, aber das
Du brauchst da nicht einmal die variable Form2, sondern kannst sogar direkt schreiben
TForm2.Create(self).ShowModal;
Das setzt allerdings voraus, dass du in den Methoden der Form nie die Variable Form2 referenzierst, sondern, so wie es gehört, statt dessen self verwendest.
stimmt dann natürlich nicht, denn es ist ja jedes mal ein neues Formular (per create neu erstellt), das du mit Showmodal öffnest. Natürlich gehört es in Verbindung mit caFree genau so gemacht.gladio hat geschrieben:und das lässt sich problemlos mehrmals öffnen (mit ShowModal) und schließen ohne daß mich da was anspringt.
Du brauchst da nicht einmal die variable Form2, sondern kannst sogar direkt schreiben
TForm2.Create(self).ShowModal;
Das setzt allerdings voraus, dass du in den Methoden der Form nie die Variable Form2 referenzierst, sondern, so wie es gehört, statt dessen self verwendest.
Re: Formulardaten auslesen
Für modale Formulare, die nach dem Schließen gelöscht werden sollen, ist der Weg über FormClose und caFree meiner Meinung nach der falsche Ansatz, weil es zu kompliziert und zu unübersichtlich ist. Da das Programm, im Gegensatz zur nicht-modalen Anzeige per Formular.Show, bei Formular.Showmodal nicht weiterläuft, bietet es sich an, das Formular zur Laufzeit zu erzeugen und nach ShowModal explizit zu zerstören. Damit ist der Lebenszyklus des Formulars mit einem Blick zu übersehen:
Code: Alles auswählen
var
F: TModalesFormular;
begin
F := TModalesFormula.Create(nil);
// nil --> niemand kümmert sich um die automatische Freigabe, ich mache das selbst direkt am Ende dieser Routine
try
F.Formular_mit_Daten_fuellen;
if F.Showmodal = mrOK then
F.Daten_aus_Formular_auslesen;
finally
F.Free;
end;
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Formulardaten auslesen
Wie willst du dann auf die Daten des Formes zugreifen ?Du brauchst da nicht einmal die variable Form2, sondern kannst sogar direkt schreiben
TForm2.Create(self).ShowModal;
Irgendwie über FindForm oder was ähnliches, viel zu kompliziert, wen es überhaupt geht.
Ich würde auch diesen Weg wählen, ist nach meiner Meinung auch am übersichtlichsten.Für modale Formulare, die nach dem Schließen gelöscht werden sollen, ist der Weg über FormClose und caFree meiner Meinung nach der falsche Ansatz, weil es zu kompliziert und zu unübersichtlich ist. Da das Programm, im Gegensatz zur nicht-modalen Anzeige per Formular.Show, bei Formular.Showmodal nicht weiterläuft, bietet es sich an, das Formular zur Laufzeit zu erzeugen und nach ShowModal explizit zu zerstören. Damit ist der Lebenszyklus des Formulars mit einem Blick zu übersehen:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Formulardaten auslesen
Gar nicht. Kannst du sowieso nicht, wenn im OncloseMathias hat geschrieben:Wie willst du dann auf die Daten des Formes zugreifen ?
Code: Alles auswählen
CloseAction:=caFree;
braunbär hat geschrieben:caFree: Das Formular wird geschlossen und freigegeben, danach kannst du natürlich auf die Daten nicht mehr zugreifen. Du musst daher im OnClose selbst die Daten des Formulars in Variable kopieren, die das Close des Formulars überleben.
Naja, modale Formulare sind meines Erachtens ohnedies nur für "quick and dirty" Programme geeignet, viel bedienerunfreundlicher geht es wohl nicht. Ich habe mir in meinem Framework eine Routine für einen quasimodalen Formularaufruf gebastelt, die auf das Schliessen der Form wartet, ohne dass dabei durch diesen Aufruf die restliche Anwendung komplett blockiert wird. Sehr oft braucht man als Anwender zum Ausfüllen eines modalen Formulars Informationen, für die man irgendwo anders im Programm nachschauen müsste - geht nicht, erst das modale Formular mit Abbrechen schliessen, nachschauen und dann das modale Formular erneut aufrufen. Eigentlich grauslich.wp_xyz hat geschrieben:Für modale Formulare, die nach dem Schließen gelöscht werden sollen, ist der Weg über FormClose und caFree meiner Meinung nach der falsche Ansatz, weil es zu kompliziert und zu unübersichtlich ist.
Und oft dient ein modales Formular nur dazu, den Anwender eine Auswahl treffen zu lassen, die dann als Funktionsergebnis von Showmodal zur Verfügung steht. Bei solchen modalen Formularaufrufen ist die Freigabe mittels Closeaction die einfachste Methode.