Formulardaten auslesen

Für Fragen von Einsteigern und Programmieranfängern...

Formulardaten auslesen

Beitragvon dummy » 27. Aug 2017, 15:50 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
dummy
 
Beiträge: 8
Registriert: 28. Mär 2015, 02:05

Beitragvon Mathias » 27. Aug 2017, 16:01 Re: Formulardaten auslesen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon dummy » 27. Aug 2017, 16:07 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
dummy
 
Beiträge: 8
Registriert: 28. Mär 2015, 02:05

Beitragvon Mathias » 27. Aug 2017, 16:09 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. :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon braunbär » 27. Aug 2017, 17:07 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.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon Mathias » 27. Aug 2017, 17:11 Re: Formulardaten auslesen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon gladio » 27. Aug 2017, 19:45 Re: Formulardaten auslesen

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.
gladio
 
Beiträge: 69
Registriert: 21. Jun 2014, 05:15
Wohnort: Ostseestrand
OS, Lazarus, FPC: Win7/10-32/64 | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 27. Aug 2017, 21:27 Re: Formulardaten auslesen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon braunbär » 27. Aug 2017, 21:54 Re: Formulardaten auslesen

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 27. Aug 2017, 22:01, insgesamt 1-mal geändert.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon Mathias » 27. Aug 2017, 22:01 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.

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

Siehe Anhang.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon gladio » 28. Aug 2017, 07:07 Re: Formulardaten auslesen

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.
gladio
 
Beiträge: 69
Registriert: 21. Jun 2014, 05:15
Wohnort: Ostseestrand
OS, Lazarus, FPC: Win7/10-32/64 | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon braunbär » 28. Aug 2017, 12:30 Re: Formulardaten auslesen

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.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon wp_xyz » 28. Aug 2017, 15:53 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;
wp_xyz
 
Beiträge: 2251
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 28. Aug 2017, 17:03 Re: Formulardaten auslesen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon braunbär » 28. Aug 2017, 23:12 Re: Formulardaten auslesen

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.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried