SOLVED -Mehrmaliges öffnen des gleichen Forms

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

SOLVED -Mehrmaliges öffnen des gleichen Forms

Beitrag von Bernie110 »

Hallo Zusammen,

mit folgendem Code öffne ich mehrmals das gleiche Form

Code: Alles auswählen

  Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN);
  Frm_AUFTRAEGE_ERFASSEN.show;


Wenn jetzt z.b. 2 Forms gleichzeitig geöffnet wurden , kann man ermitteln aus welchem Form gerade ein ganz anderes Form geöffnet wurde ?

Hier hab ich mal ein Bild. Dann kann man es sich vll besser vorstellen:
Ich möchte jetzt egal aus welchem der beiden Forms Daten aus einem dritten Form übernehmen.
Solange nur ein Frm_AUFTRAEGE_ERFASSEN (im Bild Form1) geöffnet ist, ist das kein Problem.
Öffne ich aber 2 x Frm_AUFTRAEGE_ERFASSEN und öffne im Anschluss das Form Kunde auswählen, dann schreibt er mit die Daten in das zuletzt geöffnete Frm_AUFTRAEGE_ERFASSEN
Ich möchte die Daten aus Form Kunde_Auswählen aber in das Form schreiben, aus welchem es geöffnet wurde.

Im Bild möchte ich jetzt die KD_ID aus dem Form KUNDEN Auswählen in das zu erst geöffnete Form in das Feld AG_ID schreiben.
Gibt es da eine Form Id oder Ähnliches auf welche man verweisen könnte ?

Bild

Wie macht Ihr das ?
Danke für eure Antworten.
Lg Bernie
Zuletzt geändert von Bernie110 am Di 14. Apr 2020, 09:28, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von af0815 »

Das Form hat normalerweise einen Parent, anhand dessen kann man das Elternfenster feststellen. Da du die Forms an die Applikation bindest wird das nicht gehen. Alternativ hat jede Form ein Tag Feld das du verwenden kannst, dort kann sogar ganze Objekte hinterlegen, weil es Zeiger halten kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von Bernie110 »

af0815 hat geschrieben:Das Form hat normalerweise einen Parent, anhand dessen kann man das Elternfenster feststellen. Da du die Forms an die Applikation bindest wird das nicht gehen. Alternativ hat jede Form ein Tag Feld das du verwenden kannst, dort kann sogar ganze Objekte hinterlegen, weil es Zeiger halten kann.

Hi danke für deine Antwort.
Ok so kann ich beim Öffnen jedem Formular einen eignen Wert via diesem Tag geben. Verstanden.
Und wie kann ich mich dann aus dem Fremdformular (Form KUNDEN Auswählen) wieder zurück genau auf dieses Tag beziehen und meinen Wert in das richte Form schreiben ?

Lg Bernie

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von m.fuchs »

Ich würde mir in Form Kunde auswählen eine eigene Methode schreiben, die es öffnet und die Daten zurückgibt.

Du brauchst auf deinem Auswahlform zwei Buttons (Ok und Abbrechen) die in der Eigenschaft ModalResult den Wert mrOK bzw. mrCancel haben.

Dann wäre folgender Beispielcode funktionsfähig:

Code: Alles auswählen

type
  TResult = record
    IsSuccess: Boolean;
    KundeId: Integer;
  end;
 
  TForm2 = class(TForm)
    Button1: TButton;
    OkButton: TButton;
    ComboBox1: TComboBox;
  private
 
  public
    function GetKunde: TResult;
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.lfm}
 
 
function TForm2.GetKunde: TResult;
begin
  Result.IsSuccess := (Self.ShowModal = mrOK);
  if Result.IsSuccess then
    Result.KundeId := ComboBox1.ItemIndex;
end;


Aufrufen kannst du es dann von deinen anderen Forms aus so:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  KundeResult: TResult;
begin
  KundeResult := Form2.GetKunde;
  if KundeResult.IsSuccess then
    Button1.Caption := IntToStr(KundeResult.KundeId);
end;


Das Auswahlform muss dann nicht wissen, wer es aufgerufen hat. Der Aufrufer bekommt direkt das Ergebnis und kann es wie er will verarbeiten.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von Bernie110 »

Hi m.fuchs danke.

Prima das funktioniert schon mal.

Kann man das irgend wie so machen, dass das durch eine Var die entweder True oder False lautet erfolgt ?
Ursprünglich wollte ich die Daten mit doppelklick aoder bei Vk_Return im DBGrid übergeben.

Würde das auch gehen ?

Lg Bernie

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von kupferstecher »

Bernie110 hat geschrieben:Hallo Zusammen,

mit folgendem Code öffne ich mehrmals das gleiche Form

Code: Alles auswählen

  Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN);
  Frm_AUFTRAEGE_ERFASSEN.show;


D.h. du erzeugst ein neues Formular bei jedem Öffnen? Das hört sich nach einem Memory-Leak an.
Du müsstest das Formular nach Benutzung wieder löschen. Ober eben für jede Stelle, an der du das Formular öffnen kannst, ein eigenes erzeugen. In beiden Fällen ist der Zugriff auf die Daten auch einfach, jedes "Mutterformular" hat ja dann seine eigene Kundenauswahl.

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von Bernie110 »

kupferstecher hat geschrieben:
Bernie110 hat geschrieben:Hallo Zusammen,

mit folgendem Code öffne ich mehrmals das gleiche Form

Code: Alles auswählen

  Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN);
  Frm_AUFTRAEGE_ERFASSEN.show;


D.h. du erzeugst ein neues Formular bei jedem Öffnen? Das hört sich nach einem Memory-Leak an.
Du müsstest das Formular nach Benutzung wieder löschen. Ober eben für jede Stelle, an der du das Formular öffnen kannst, ein eigenes erzeugen. In beiden Fällen ist der Zugriff auf die Daten auch einfach, jedes "Mutterformular" hat ja dann seine eigene Kundenauswahl.


Ja so oft man den Button betätigt wird immer wieder ein neues Formular erzeugt.
Memory-Leak heisst ?
Das macht den Speicher voll oder ?
Was würdest du machen ?
Lg Bernie

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von m.fuchs »

Bernie110 hat geschrieben:Ursprünglich wollte ich die Daten mit doppelklick


Code: Alles auswählen

procedure TForm2.ListBox1DblClick(Sender: TObject);
begin
  Self.ModalResult := mrOK;
end;


Bernie110 hat geschrieben:oder bei Vk_Return im DBGrid übergeben.Würde das auch gehen ?

Code: Alles auswählen

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_RETURN then
    Self.ModalResult := mrOK;
end;


Der Aufruf von

Code: Alles auswählen

Self.ModalResult := mrOK;

setzt das Modale Ergebnis UND schließt das Fenster auch gleich. Die Methode GetKunde bleibt wie sie ist und funktioniert auch so weiter.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von Bernie110 »

m.fuchs hat geschrieben: 
Der Aufruf von

Code: Alles auswählen

Self.ModalResult := mrOK;

setzt das Modale Ergebnis UND schließt das Fenster auch gleich. Die Methode GetKunde bleibt wie sie ist und funktioniert auch so weiter.


Alles klar ! Genau so meinte ich das ! Klasse !! Danke M.Fuchs
Lg Bernie

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von kupferstecher »

Bernie110 hat geschrieben:Das macht den Speicher voll oder ?
Was würdest du machen ?
Lg Bernie

Ja, das legt jedes Mal eine neue Form im Speicher an und belässt die alten dort.

Entweder dynamisch erstellen und wieder löschen:
https://wiki.freepascal.org/Form_Tutori ... _erstellen

Oder eben für jeden aufrufende Stelle einmalig ein Formular anlegen, z.B. zu Programmstart.

Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN_Stelle1);
Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN_Stelle2);
Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN_Stelle3);
dann bspw.
Frm_AUFTRAEGE_ERFASSEN_Stelle2.ShowModal;

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

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von wp_xyz »

Ein Speicherleck ist es nicht, weil Application intern alle erzeugten Formulare verwaltet. Aber wenn dieselbe Variable verwendet wird, kann man auf das zuerst erzeugte, zumindest unter diesem Namen, nicht mehr zugreifen.

Code: Alles auswählen

Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN_Stelle1);
Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN_Stelle2);
Application.CreateForm(TFrm_AUFTRAEGE_ERFASSEN, Frm_AUFTRAEGE_ERFASSEN_Stelle3);

Bernie110, siehst du hier, warum ich in dem anderen Thread darauf hingewiesen habe, niemals den Formularnamen im Code der Klasse zu verwenden? Wenn im Code von Frm_AUFTRAEGE_ERFASSEN die Rede ist, das Formular aber
Frm_AUFTRAEGE_ERFASSEN_Stelle1 heißt, werden seltsame Dinge passieren: entweder ein Absturz, wenn Frm_AUFTRAEGE_ERFASSEN unter diesem noch nie erzeugt wurde, oder du wirst Stunden mit dem Debugger verbringen, um herauszubekommen, dass das gerade öffnete Formular nicht richtig funktioniert und ein anderes Formular verändert.

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von kupferstecher »

wp_xyz hat geschrieben:Ein Speicherleck ist es nicht, weil Application intern alle erzeugten Formulare verwaltet.

Application "freed" die verwaisten Formulare aber auch erst am Programmende, oder? Streng genommen wäre es dann kein Speicherleck, praktisch gesehen aber schon?

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

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von wp_xyz »

ja

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Mehrmaliges öffnen des gleichen Forms

Beitrag von Bernie110 »

wp_xyz hat geschrieben:Bernie110, siehst du hier, warum ich in dem anderen Thread darauf hingewiesen habe, niemals den Formularnamen im Code der Klasse zu verwenden?


Jep ! Habs verstanden :wink:
Herzlichen Dank @all
Lg Bernie

Antworten