Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen (https://www.delphipraxis.net/215316-form-2-aus-form-1-oeffnen-und-nach-schliessen-von-form-2-form-1-witermachen.html)

Walter Landwehr 12. Jun 2024 10:20

Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Hallo, ich öffne form 2 so.
Delphi-Quellcode:
TPatientenblattFrm.Create(Application.MainForm, Patient1Qry.FieldByName('PatientNr').AsInteger, TiereQry.FieldByName('TiereNr').AsInteger);
nun schließe ich die form 2 und möchte direkt an der Pos. in Form 1 weitermachen wo ich Form 2 aufgerufen habe.

Hier weitermachen.
Delphi-Quellcode:
 PatBlattQry.close;
    PatBlattQry.ParamByName('PATIENTNR').AsInteger := TiereQry.FieldByName('PATIENTNR').AsInteger;
    PatBlattQry.Open;
    if (PatBlattQry.RecordCount > 0) then
      btnPatblatt.Font.Color := clred
    else
      btnPatblatt.Font.Color := clWindowText;
    btnPatblatt.Refresh;
Geht das? Wenn ja wie.

DeddyH 12. Jun 2024 10:24

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Und Du bist Dir sicher, dass irgendwer versteht, was Du tust und was Du erreichen willst?

Gausi 12. Jun 2024 10:28

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Zeige die zweite Form per ShowModal an. Wenn diese dann geschlossen wird, geht's in der ersten Form genau da weiter. Man kann dann auch abfragen, ob die Form per Klick auf den "OK-Button" geschlossen wurde, oder ob der Dialog abgebrochen wurde.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Form2.ShowModal = mrOK then begin
     ShowMessage('Form 2 wurde geschlossen');
  end;
end;

bcvs 12. Jun 2024 11:11

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1537655)
Hallo, ich öffne form 2 so.
Delphi-Quellcode:
TPatientenblattFrm.Create(Application.MainForm, Patient1Qry.FieldByName('PatientNr').AsInteger, TiereQry.FieldByName('TiereNr').AsInteger);

Wenn die Form im Create gleich geöffnet wird, dann muss bei der Form im Objektinspektor visible auf true stehen. Setze das man auf false. Dann kannst du selbst bestimmen, ob du sie modal oder nicht modal öffnen willst. Und ich würde die Form auch selbst erzeugen und wieder freigeben.

Also:
Delphi-Quellcode:
Form2:=TPatientenblattFrm.Create(nil, Patient1Qry.FieldByName('PatientNr').AsInteger, TiereQry.FieldByName('TiereNr').AsInteger);
try
  if Form2.ShowModal = mrOK then begin
    // mach irgendwas
  end;
finally
  Form2.Free;
end;

Walter Landwehr 12. Jun 2024 12:36

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Alle meine Forms sind MDI Forms, die möchte ich nicht auf Modal setzen. Gibt es sonst keine andere Möglichkeit?
Wenn Form 2 geschlossen wird sollte in Form 1 dieser Coder verarbeitet werden.
Delphi-Quellcode:
PatBlattQry.close;
    PatBlattQry.ParamByName('PATIENTNR').AsInteger := TiereQry.FieldByName('PATIENTNR').AsInteger;
    PatBlattQry.Open;
    if (PatBlattQry.RecordCount > 0) then
      btnPatblatt.Font.Color := clred
    else
      btnPatblatt.Font.Color := clWindowText;
    btnPatblatt.Refresh;

lxo 12. Jun 2024 12:43

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1537668)
Alle meine Forms sind MDI Forms, die möchte ich nicht auf Modal setzen. Gibt es sonst keine andere Möglichkeit?
Wenn Form 2 geschlossen wird sollte in Form 1 dieser Coder verarbeitet werden.
Delphi-Quellcode:
PatBlattQry.close;
    PatBlattQry.ParamByName('PATIENTNR').AsInteger := TiereQry.FieldByName('PATIENTNR').AsInteger;
    PatBlattQry.Open;
    if (PatBlattQry.RecordCount > 0) then
      btnPatblatt.Font.Color := clred
    else
      btnPatblatt.Font.Color := clWindowText;
    btnPatblatt.Refresh;

Du könntest dem Form2 ein OnClose/OnDestroy-Event zuweisen, wenn du dieses aus Form1 verwendest.
In dem du definierst was passieren soll wenn die Form geschlossen/freigegeben wurde.


Delphi-Quellcode:
lForm2 := TPatientenblattFrm.Create(Application.MainForm, Patient1Qry.FieldByName('PatientNr').AsInteger, TiereQry.FieldByName('TiereNr').AsInteger);
lForm2.OnClose := MeineProzedurAusForm1DieAusgeführtWerdenSollWennForm2GeschlossenWurde;
lForm2.OnDestroy:= MeineProzedurAusForm1DieAusgeführtWerdenSollWennForm2FreigegebenWurde;

Klaus01 12. Jun 2024 13:01

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
oder eine Nachricht (postMessage) an die Form1 senden wenn die Form2 geschlossen wird.

Grüsse Klaus

TomyN 12. Jun 2024 15:09

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Werden MDI Fenster nicht sowieso im 'Parent' verwaltet? (Hab glaub ich in 40 Jahren noch nie eine MDI Fenster erzeugt).
Ansonsten im Programm1 verwalten (handle anlegen, create ) und am Ende von Programm2 eine Nachricht an Form1 schicken. Bei mir inzwischen immer eine 'Bitte schließe mich' Nachricht. Alternativ kann man natürlich auch nur melden 'Programm 2' beendet, bitte Handle löschen und Processing starten.

Walter Landwehr 14. Jun 2024 14:16

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Also ich rufe in Form 2 bei OnDestroy eine Procedure in Form 1 auf. das geht auch nur erkennt die procedure nicht mein Button 'btnPatblatt' kommt Zugriffsverletzung.
Delphi-Quellcode:
procedure TTierhalterFrm.BtnPatblattFarbe;
begin
  if (ToolsOperation.Farbe = True) then
    btnPatblatt.Font.Color := clred  // Hier kommt Zugriffsverletzung
  else
    btnPatblatt.Font.Color := clWindowText;
  btnPatblatt.Refresh;
end;
Keine Ahnung warum.
Ist die Form 1 nicht aktiv?

TomyN 14. Jun 2024 14:44

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Schick doch einfach eine Message an Form1. Wenn Du das mit Postmessage machst, dann ist das ganze entkoppelt.
Ansonsten wäre ich bei Zugriffen nach außen bei Destroy seehr vorsichtig, weil da einiges im Hintergrund abläuft.

Uwe Raabe 14. Jun 2024 14:54

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1537764)
Also ich rufe in Form 2 bei OnDestroy eine Procedure in Form 1 auf.

Wie machst du das denn genau?

himitsu 14. Jun 2024 17:40

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Joar, was nach dem Schließen gemacht werden soll, an OnClose/OnDestroy der zweiten Form hängen, oder als Callback übergeben beim Erstellen übergeben.

Nja, den Code für Form1 nicht in die Form2.
Entweder wird ein Callback (Methode) von Form1 als Callback an Form2 übergeben.
Oder, falls OnClose/OnDestroy der Form2 nicht verwendet wird, dann ein Event von Form1 an dieses OnClose/OnDestroy.



Du nutzt aber nicht zufällig die globale Variable der Form1?
Wenn ja, bist'e dir sicher, dass diese Form1 zu dem Zeitpunkt noch da ist?


SendMessage/PostMessage haben den Vorteil, dass wenn die Zielform verschwindet, verbleibende Messages gelöscht werden.
Gibt es die Form beim Senden nicht mehr, geht die Message ins Nirvana und wird nie ausgelöst, ABER gibt es zwischenzeitlich ein neues Fenster (WinControl ala Form/Edit/sonstwas), dann geht die Message an jenes.
Hier kann man sich nur schützen, indem man vorher explizit eine Message-ID reserviert, welche niemand anderes nutzt.

Walter Landwehr 15. Jun 2024 10:44

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Wie funktioniert PostMessage? (von form zu form) habe es noch nie benutzt. Gibt es irgendwo ein Beispiel.

Uwe Raabe 15. Jun 2024 12:21

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Ich möchte nochmal auf den meiner Meinung nach wesentlichen Code zurückkommen, den wir bisher noch nicht sehen konnten:
Zitat:

Zitat von Uwe Raabe (Beitrag 1537766)
Zitat:

Zitat von Walter Landwehr (Beitrag 1537764)
Also ich rufe in Form 2 bei OnDestroy eine Procedure in Form 1 auf.

Wie machst du das denn genau?


Walter Landwehr 15. Jun 2024 12:30

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Form 1
Delphi-Quellcode:
TPatientenblattFrm.Create(Application.MainForm, Patient1Qry.FieldByName('PatientNr').AsInteger, TiereQry.FieldByName('TiereNr').AsInteger);


Form 2
Delphi-Quellcode:
procedure TPatientenblattFrm.FormDestroy(Sender: TObject);
begin
  TierhalterFrm.BtnPatblattFarbe;
end;
in form 1
Delphi-Quellcode:
procedure TTierhalterFrm.BtnPatblattFarbe;
begin
  if (ToolsOperation.Farbe = True) then
    btnPatblatt.Font.Color := clred
  else
    btnPatblatt.Font.Color := clWindowText;
  btnPatblatt.Refresh;
end;

Uwe Raabe 15. Jun 2024 12:39

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1537797)
wie in #1 beschrieben.

Vielleicht übersehe ich ja was, aber ich kann nirgendwo den Code entdecken, der dieser Beschreibung entspricht:
Zitat:

ich rufe in Form 2 bei OnDestroy eine Procedure in Form 1 auf.

Walter Landwehr 15. Jun 2024 13:58

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
siehe #15.

Uwe Raabe 15. Jun 2024 19:09

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Und TierhalterFrm ist auch wirklich die Instanz von Form1, in der der gezeigte Aufruf von Form2 ausgeführt wurde, und die Instanz ist auch noch nicht anderweitig freigegeben worden?

himitsu 15. Jun 2024 20:00

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1537809)
Und TierhalterFrm ist auch wirklich die Instanz von Form1, in der der gezeigte Aufruf von Form2 ausgeführt wurde,

Zitat:

Zitat von himitsu (Beitrag 1537774)
Du nutzt aber nicht zufällig die globale Variable der Form1?
Wenn ja, bist'e dir sicher, dass diese Form1 zu dem Zeitpunkt noch da ist?

Niemand weiß, wie TTierhalterFrm erstellt wurde, aber wenn ich den Hauch von Code sehe, wie TPatientenblattFrm erstellt wurde, dann hätte ich da auch große Zweifel.

Was ist nun eigentlich das Problem, oder hab ich hier wirklich übersehn, dass irgendwo der "Fehler" genannt wurde?

Zitat:

Zitat von Walter Landwehr (Beitrag 1537790)
Wie funktioniert PostMessage? (von form zu form) habe es noch nie benutzt.

Genauso, wie immer Form.Handle, Edit.Handle .... das THandle (eigentlich HWND) des WinControl.

Dieses gibt man zu Beginn dem mit, welcher es dann später aufrufen soll.

in der Fomm dann entweder global reinhängen
Delphi-Quellcode:
procedure WndProc(var Message: TMessage); override;

oder explit
Delphi-Quellcode:
procedure WMMyMessage(var Message: TMessage); message WM_MYMESSAGE;


Als MessageID entweder mit WM_USER+x oder MSDN-Library durchsuchenRegisterWindowMessage.




Will man den Code ordentlich trennen, dann darf Form2 garnichts von Form1 wissen,
drum übergibt man im Constructor oder via Property das Event.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  ...
  public
    procedure MyCallback;
  end;

  // hab hier einen vordefinieren Typen aus System.Classes verwendet
  //TThreadMethod = procedure of object;

  TForm2 = class(TForm)
  ...
  private
    FCallback: TThreadMethod;
  public
    constructor Create(Owner: TComponent; ....; Callback: TThreadMethod);
  end;

TForm2.Create(...., MyCallback);

constructor TForm2.Create(Owner: TComponent; ....; Callback: TThreadMethod);
begin
  inherited Create(Owner);
  FCallback := Callback;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  if Assigned(FCallback) then
    Callback();
end;

Walter Landwehr 16. Jun 2024 10:13

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Was steht in procedure MyCallback;

Stolle58 16. Jun 2024 10:51

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1537822)
Was steht in procedure MyCallback;

Diese Callback Methode wird benötigt um in From1 aufzuräumen.
Das heißt von Dir erstellte Objekte freigeben, um Deadleaks zuvermeiden.

himitsu 16. Jun 2024 11:44

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Alles was dann in/mit der TTierhalterFrm gemacht werden soll,
steht steht auch innerhalb dieser Form.

Also in diesem Fall TierhalterFrm.BtnPatblattFarbe; (natürlich ohne die Variable), bzw. direkt der Inhalt dieser Prozedur.

Der Callback kann auch Parameter bekommen, wenn die TPatientenblattFrm der TTierhalterFrm irgendwas übergeben soll.
Klar, TTierhalterFrm könnte im Callback selbst auf die PatientenblattFrm zugreifen, aber natürlich nicht über die globale Variable, sondern sie bekommt die Instanz der TPatientenblattFrm als Parameter, somit ist es dann auch immer die richtige Instanz. (kennst du bestimmt, von den normalen NotifyEvents, wo der Button im OnClick sich selbst als Sender übergibt)


Die TPatientenblattFrm braucht dafür nichts von der TTierhalterFrm zu wissen.

Erstmal ist so der Code schön getrennt,
es gibt keine Kreuzreferenzen zwischen diesen Units,
und die TTierhalterFrm kann zukünftig auch von irgendwem Anderes aufgerufen werden (anderes Fenster oder sogar komplett anderes Programm) ... der gibt dann einfach seinen eigenen Callback rein (oder nil) und fertig.

Walter Landwehr 16. Jun 2024 13:09

AW: Form 2 aus Form 1 öffnen und nach schließen von Form 2 in Form 1 witermachen
 
Danke, Danke. Gelöst habe es kapiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.

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