Formulardaten auslesen

Für Fragen von Einsteigern und Programmieranfängern...
dummy
Beiträge: 10
Registriert: Sa 28. Mär 2015, 02:05

Formulardaten auslesen

Beitrag von dummy »

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

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Formulardaten auslesen

Beitrag von Mathias »

ich habe mir ein Formular gebastelt, in dem mehrere Eingaben möglich sind.

Meinst du zB Edit-Felder ?

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

dummy
Beiträge: 10
Registriert: Sa 28. Mär 2015, 02:05

Re: Formulardaten auslesen

Beitrag von dummy »

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

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Formulardaten auslesen

Beitrag von Mathias »

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. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Formulardaten auslesen

Beitrag von braunbär »

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.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Formulardaten auslesen

Beitrag von Mathias »

caFree: Das Formular wird geschlossen und freigegeben, danach kannst du natürlich auf die Daten nicht mehr zugreifen.

Mit dem würde ich aber aufpassen, wen ein zweites mal ein ShowModal kommt, dann knallt es.

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

Benutzeravatar
gladio
Beiträge: 217
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

Beitrag von gladio »

Mathias hat geschrieben:Mit dem würde ich aber aufpassen, wen ein zweites mal ein ShowModal kommt, dann knallt es.

Das kann ich so nicht bestätigen.
Ich schreibe fast immer

Code: Alles auswählen

procedure Tabc.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
 ...
  CloseAction:=caFree;
end;

und das lässt sich problemlos mehrmals öffnen (mit ShowModal) und schließen ohne daß mich da was anspringt.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Formulardaten auslesen

Beitrag von Mathias »

Das kann ich so nicht bestätigen.

Das verwundert mich, da es angeblich frei gegeben wird.
Aber vielleicht wird es mit ShowModal wieder neu erzeugt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Formulardaten auslesen

Beitrag von braunbär »

gladio hat geschrieben:
Mathias hat geschrieben:Mit dem würde ich aber aufpassen, wen ein zweites mal ein ShowModal kommt, dann knallt es.

Das kann ich so nicht bestätigen.
Ich schreibe fast immer

Code: Alles auswählen

procedure Tabc.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
 ...
  CloseAction:=caFree;
end;

und das lässt sich problemlos mehrmals öffnen (mit ShowModal) und schließen ohne dass mich da was anspringt.

Kann ich mir schwer vorstellen. Sollte es der Fall sein, dann wäre das ein ernster Fehler der Runtime, der zu melden wäre.
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.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Formulardaten auslesen

Beitrag von Mathias »

Kann ich mir schwer vorstellen. Sollte es der Fall sein, dann wäre das ein ernster Fehler der Runtime, der zu melden wäre.

Also ich habe es jetzt probiert. Einmal geht das Form2 auf, aber beim zweiten Versuch schmiert es wie erwartet ab.

Siehe Anhang.
Dateianhänge
free_test.tar.gz
(126.34 KiB) 61-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
gladio
Beiträge: 217
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

Beitrag von gladio »

Ist korrekt.
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;

und wieder schließen

Code: Alles auswählen

procedure TForm2.Button1Click(Sender: TObject);
begin
  close;
end;
 
procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction:=caFree;
end;

Das aufgerufene Formular darf dann natürlich nicht in der *.lpr erzeugt werden.

Code: Alles auswählen

begin
  RequireDerivedFormResource:=True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
 // Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Formulardaten auslesen

Beitrag von braunbär »

Klar, aber das

gladio hat geschrieben:und das lässt sich problemlos mehrmals öffnen (mit ShowModal) und schließen ohne daß mich da was anspringt.


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.

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.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Formulardaten auslesen

Beitrag von wp_xyz »

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;

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Formulardaten auslesen

Beitrag von Mathias »

Du brauchst da nicht einmal die variable Form2, sondern kannst sogar direkt schreiben
TForm2.Create(self).ShowModal;

Wie willst du dann auf die Daten des Formes zugreifen ?
Irgendwie über FindForm oder was ähnliches, viel zu kompliziert, wen es überhaupt geht.

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:

Ich würde auch diesen Weg wählen, ist nach meiner Meinung auch am übersichtlichsten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Formulardaten auslesen

Beitrag von braunbär »

Mathias hat geschrieben:Wie willst du dann auf die Daten des Formes zugreifen ?

Gar nicht. Kannst du sowieso nicht, wenn im Onclose

Code: Alles auswählen

 CloseAction:=caFree;

steht. Wenn das Programm vom Showmodal zurückkommt, gibt es das Formular nämlich nicht mehr. Deswegen habe ich ja geschrieben
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.


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.

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.

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.

Antworten