Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Formular soll beim Schließen ein Wert zurückgeben (https://www.delphipraxis.net/199863-formular-soll-beim-schliessen-ein-wert-zurueckgeben.html)

delphicoder123 26. Feb 2019 15:58

Formular soll beim Schließen ein Wert zurückgeben
 
Hallo zusammen,

wie schaffe ich es, dass beim Schließen des zweiten Formulars, ein Wert(z.B. string) an das erste Formular übergeben wird?

Wenn möglich, ohne globale oder public Variablen zu verwenden.

Wäre nett, wenn ihr mir eine ausführliche Antwort geben könntet, da ich noch Anfänger bin und manchmal Verständnisprobleme habe.

Vielen Dank

timog 26. Feb 2019 16:11

AW: Formular soll beim Schließen ein Wert zurückgeben
 
Was spricht für diesen Anwendungsfall denn gegen ein öffentliches Feld?

Code:
...
public
// in Form2
  FVariable: string;
...
Code:
// in Form1 der Aufruf
Form2:=TForm2.Create(self);
try
  if Form2.ShowModal = mrOK then
  begin
    ShowMessage(Form2.FVariable);
  end;
finally
  Form2.free
end;
Alternativ kannst Du auch eine dritte unit nehmen, in der die Datenhaltung in einem eigenen Objekt gemacht wird. Kommt wie so oft auf den Anwendungsfall an und ob es wirklich nur eine Variable ist oder ein Dutzend.

dummzeuch 26. Feb 2019 16:56

AW: Formular soll beim Schließen ein Wert zurückgeben
 
Ich füge für solche Fälle (also Dialoge, die immer modal angezeigt werden und (geänderte) Werte zurückliefern), eine public class function Execute hinzu:

Delphi-Quellcode:
class function TMyDialog.Execute(_Owner: TWinControl; var _SomeValue: integer): boolean;
var
  frm: TMyDialog;
begin
  frm := TMyDialog.Create(_Owner);
  try
    TForm_CenterOn(frm, _Owner);
    frm.SetData(_SomeValue);
    Result := (frm.ShowModal = mrOK);
    if Result then
      frm.GetData(_SomeValue);
  finally
     FreeAndNil(frm);
  end;
end;
Statt nur eines Wertes kann man natürlich beliebig viele als Parameter übergeben.

Dazu kommen dann noch jeweils die .SetData und .GetData Methoden mit passenden const bzw. out Parametern. Die setzen die Controls entsprechend der Werte bzw. lesen die Werte aus den Controls aus.

Aufruf dann mit
Delphi-Quellcode:
 if TMyDialog.Execute(Self, SomeValue) then
   WriteLn('Wert wurde auf ', SomeValue, ' gesetzt.');

delphicoder123 26. Feb 2019 21:38

AW: Formular soll beim Schließen ein Wert zurückgeben
 
Zitat:

Zitat von timog (Beitrag 1426465)
Was spricht für diesen Anwendungsfall denn gegen ein öffentliches Feld?

Code:
...
public
// in Form2
  FVariable: string;
...
Code:
// in Form1 der Aufruf
Form2:=TForm2.Create(self);
try
  if Form2.ShowModal = mrOK then
  begin
    ShowMessage(Form2.FVariable);
  end;
finally
  Form2.free
end;
Alternativ kannst Du auch eine dritte unit nehmen, in der die Datenhaltung in einem eigenen Objekt gemacht wird. Kommt wie so oft auf den Anwendungsfall an und ob es wirklich nur eine Variable ist oder ein Dutzend.


Wäre es auch irgendwie mit einer private Variablen möglich?
Würde ModalResult := mrCancel oder ModalResult := mrOK etwas bringen?

bcvs 27. Feb 2019 06:53

AW: Formular soll beim Schließen ein Wert zurückgeben
 
Zitat:

Zitat von delphicoder123 (Beitrag 1426476)
Wäre es auch irgendwie mit einer private Variablen möglich?

Ja, über ein property:
Delphi-Quellcode:
TForm2 = class(TForm)
  private
    fMyVar:String;
  public
    ...
  property MyVar:string read fMyVar;
end;
in Form1 der Aufruf
Delphi-Quellcode:
Form2:=TForm2.Create(self);
try
  if Form2.ShowModal = mrOK then
  begin
    ShowMessage(Form2.MyVar);
  end;
finally
  Form2.free
end;
Du könntest dem property dann auch noch einen Getter und Setter verpassen und darin in Form2 die entsprechenden Controls setzen bzw auslesen.

Andreas L. 27. Feb 2019 09:50

AW: Formular soll beim Schließen ein Wert zurückgeben
 
Zitat:

Zitat von delphicoder123 (Beitrag 1426476)
Würde ModalResult := mrCancel oder ModalResult := mrOK etwas bringen?

Ja wenn du das Formular mit ShowModal anzeigst. Da kannst du ganz einfach deinem z. B. OK-Button im Objekt-Inspektor das ModalResult setzen. Bei einem Abbrechen Button genau so. Da brauchst du gar keinen Code schreiben. Das ModalResult wird beim Button-Click automatisch im Form gesetzt. So kannst du es auswerten:

Delphi-Quellcode:
  if DeinForm.ShowModal = mrOK then
    //OK gedrückt
  else
    // anderes ModalResult
Wenn du mehr als nur OK und Abbrechen Button hast gehts auch so:
Delphi-Quellcode:
var
  FormResult: TModalResult;
begin
  FormResult := DeinForm.ShowModal;
  case FormResult of
    mrOK: // OK gedrückt;
    mrYes: // Ja gedrückt;
    ...
  end;

  // Du kannst das case auch um einen Else-Zweig erweitern:
  FormResult := DeinForm.ShowModal;
  case FormResult of
    mrOK: // OK gedrückt;
    mrYes: // Ja gedrückt;
  end
  else
    // ein anderes modalresult das nicht im case ist...
end;

sakura 27. Feb 2019 10:28

AW: Formular soll beim Schließen ein Wert zurückgeben
 
Zitat:

Zitat von dummzeuch (Beitrag 1426468)
Ich füge für solche Fälle...
Delphi-Quellcode:
class function TMyDialog.Execute(_Owner: TWinControl; var _SomeValue: integer): boolean;...
...

@delphicoder123: Was spricht gegen den Vorschlag von dummzeuch? Das ist der eleganteste und direkteste Weg.

...:cat:...

Jasocul 27. Feb 2019 10:34

AW: Formular soll beim Schließen ein Wert zurückgeben
 
Zitat:

Zitat von sakura (Beitrag 1426511)
Zitat:

Zitat von dummzeuch (Beitrag 1426468)
Ich füge für solche Fälle...
Delphi-Quellcode:
class function TMyDialog.Execute(_Owner: TWinControl; var _SomeValue: integer): boolean;...
...

@delphicoder123: Was spricht gegen den Vorschlag von dummzeuch? Das ist der eleganteste und direkteste Weg.

Und auch die Variante, die ich seit Jahren in fast identischer Form so nutze.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz