Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 14:49
Hi Delphimagnet,

ich hab das jetzt mal kurz gelesen und komme selber schon mit deinen Bezeichnern und dem was du da machst durcheinande.

Wenn ich solche Sachen machen muß lege ich mir erst mal folgende Grundprinzipien fest um spätere Verwirrung zu vermeiden:

1. Alle modalen Fenster werden global erzeugt und bleiben während der gesamten Programmlaufzeit existent, oder ich erzeuge sie generell lokal und sorge auch lokal für die Freigabe (generell).
Erste Methode hat den Vorteil, dass man sich nicht lokal um die Instanz kümmern muß. Es müssen beim Aufruf immer nur die Initialisierungswerte neutralisiert werden (vom Vorherigen Eintrag bleiben keine Werte bestehen, außer das ist so gewünscht).
Zweite Methode ist dann sinnvoll wenn relativ viel an Werten übergeben werden soll und das bereinigen der Daten zuviel Schreibarbeit kostet. Außerdem weden nicht alle Dialoge zur Startzeit erstellt und man spart somit natürlich Resourcen.

Du scheinst aber offensichtlich die zweite Methode zu bevorzugen. Dann mache ich folgendes:

In der automatisch erzeugten Formular-Unit lösche ich den globalen Var-Eintrag auf das Fenster (aus reiner Sicherheit, falls man doch mal aus reiner Dummheit diese verwenden will).

Der Button zum Schließen des Fensters erhält bei mir nur das ModalResult (z.B. mrOK). Somit wird das Fenster zwar geschlossen, aber die Instanz noch erhalten. Jetzt werte ich modalResult des Fensters aus und reagiere dementsprechend mit der Übernahme von Werten. Danach wird die Instanz mittels Destroy, Free oder FreeAndNil freigegeben. Damit bei Fehlern keine Speicherleiche zurück bleibt kapsel ich alles in einen try finally Block.

So funzt es bei mir schon ewig und ohne Murren.

Codebsp.:
Delphi-Quellcode:
procedure TMDIvertreterkonto.act_HVSuchenExecute(Sender: TObject);
var
  dlg : TDLGsuchergebnissUebernahme;

Begin
  dlg := TDLGsuchergebnissUebernahme.create(self);
  try
    dlg.Showmodal();
    IF DLG.ModalResult = mrcancel then Exit;
    // hier mit DLG machen was du willst
  filally
    dlg.Free;
  end;
end;
Wenn es so nicht klappt, dann steckt bei dir ein Problem an ganz anderer Stelle. Die hab ich bis jetzt aber noch nicht gesehen.

Gruß oki
  Mit Zitat antworten Zitat