Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi dynamisch erzeugte Forms richtig freigeben (https://www.delphipraxis.net/185719-dynamisch-erzeugte-forms-richtig-freigeben.html)

Hansa 2. Jul 2015 19:56

AW: dynamisch erzeugte Forms richtig freigeben
 
Wenn man von der Überschrift ausgeht :

Zitat:

dynamisch erzeugte Forms richtig freigeben
dann bin ich etwas erstaunt, dass bisher kein einziges mal das Wort
Delphi-Quellcode:
caFree
vorkam.

Wenn das OnClose so aussieht :

Delphi-Quellcode:
procedure Tfrm.FormClose(Sender: TObject; var Action: TCloseAction);
var FensterIni,
    SonstIni : TIniFile;
begin
  inherited;
// wenn nötig hier noch andere Aktionen ausführen.
  Action := caFree;
end;
dann ist die Form freigegeben und fertig. Egal, ob sie mit Alt-F4, Schliess-x usw. geschlossen wird.

Sir Rufo 2. Jul 2015 20:23

AW: dynamisch erzeugte Forms richtig freigeben
 
Was sich bei einem Dialog - der auch noch dynamisch erzeugt wird und man den direkt an der festen Leine hat - richtig gut macht. Da ist der weg, bevor ich mir das Ergebnis nach dem
Delphi-Quellcode:
ShowModal
holen kann.

BadenPower 2. Jul 2015 20:46

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1307520)
Da ist der weg, bevor ich mir das Ergebnis nach dem
Delphi-Quellcode:
ShowModal
holen kann.

Dann gehst Du den anderen Weg und läßt die Modal-Form vorher die Werte an den Aufrufer übergeben.

Sir Rufo 2. Jul 2015 20:57

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von BadenPower (Beitrag 1307521)
Zitat:

Zitat von Sir Rufo (Beitrag 1307520)
Da ist der weg, bevor ich mir das Ergebnis nach dem
Delphi-Quellcode:
ShowModal
holen kann.

Dann gehst Du den anderen Weg und läßt die Modal-Form vorher die Werte an den Aufrufer übergeben.

Ja, das würde schon gehen, allerdings ist es schwierig, das in einem robusten Code zu gießen.

Hier wird die Dialog-Instanz immer freigegeben:
Delphi-Quellcode:
LDialog := TDialog.Create(nil);
try
  LDialog.Assign( LDialogData );
  if LDialog.ShowModal = mrOK then
    LDialogData.Assign( LDialog );
finally
  LDialog.Free;
end;
wenn der Dialog sich selber aus dem Speicher räumt und vorher aber noch die Daten irgendwo hinschreiben soll, dann kann es aufgrund einer Exeption dazu kommen, dass die Instanz doch nicht freigegeben wird.

Gut ich kann dort natürlich im Dialog die Exception fangen und dann irgendwie durchreichen, oder so ... oder ich mache es mir einfach (s.o.) und bekomme dort alles mit und trotzdem ist alles immer sauber.

Jeder wie er mag, aber ich mag halt robust und sauber ...

Stevie 2. Jul 2015 21:32

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1307522)
ich mag halt robust und sauber ...

Ich auch, aber bisher seh ich da eher 8 Zeilen Boilerplate code. Das kannst du doch besser, oder? ;)

redox 3. Jul 2015 00:36

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von Stevie (Beitrag 1307525)
Zitat:

Zitat von Sir Rufo (Beitrag 1307522)
ich mag halt robust und sauber ...

Ich auch, aber bisher seh ich da eher 8 Zeilen Boilerplate code. Das kannst du doch besser, oder? ;)

..und vor Allem mit einem Backup zu viel als einem Backup zu wenig :!:

Wer weiß schon, was sich der ursprüngliche Programmierer gedacht hat bei seinem (eventuell bewußten?) Verzicht auf ShowModal...

LG

BadenPower 3. Jul 2015 08:37

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von redox (Beitrag 1307531)
Wer weiß schon, was sich der ursprüngliche Programmierer gedacht hat bei seinem (eventuell bewußten?) Verzicht auf ShowModal...

Unter Umständen, sogar sehr viel.

Ich für meinen Teil benutze auch nie ShowModal und keine Standard-Dialog-Fenster, da sonst der Rest der Anwendung nicht mehr bedient werden kann.

Beispiel:
Die Anwendung hat ein Hauptfenster, welches oben an Bildschirm angezeigt wird und einfach (fast) nur ein Menu hat.

Wenn ich jetzt aber ein Fenster Modal aufrufen würde (auch zum Beipiel ein Unterfenster eines Unterfensters), dann könnte ich kein anderes Fenster öffnen und müsste die Bearbeitung abbrechen um nur einmal schnell einem Kunden an Telefon eine andere Auskunft geben zu können.

mm1256 3. Jul 2015 10:27

AW: dynamisch erzeugte Forms richtig freigeben
 
Hallo,

es geht wieder zurück zur ursprünglichen Problematik und da hab ich in #7 schon geschrieben

Zitat:

Also weg mit allen BorderIcons und Alt+F4 abfangen, und gut isses. Dann wird auch sauberer Code daraus.
Damit ist es so was von egal, ob ich das Fenster modal anzeige, wobei in dem Fall vom ursprünglichen Programmierer modale Anzeige aus welchen Gründen auch immer nicht gewollt war, oder ob das Fenster normal angezeigt wird. Und wenn ich das Verhalten öfter brauche, vererbe ich das Fenster einfach. Ich hab noch keine Uni von innen gesehen, und mir das Programmieren selber beigebracht. Meine Kenntnisse sind daher mit Euren nicht vergleichbar, aber das wäre für mich - in diesem speziellen Fall - wiederverwendbarer, flexibler, leicht nachvollziehbarer und lesbarer Code. Wir wissen ja, Code wird öfter gelesen als geschrieben :roll:

Delphi-Quellcode:
unit Foo;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TFoo = class(TForm)
    ButtonSave: TButton;
    ButtonClose: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure ButtonSaveClick(Sender: TObject);
    procedure ButtonCloseClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

procedure TFoo.ButtonCloseClick(Sender: TObject);
begin
  // wenn Daten verändert, dann User fragen, ob er speichern möchte
  // und dann schließen
  Close;
end;

procedure TFoo.ButtonSaveClick(Sender: TObject);
begin
  // Daten speichern
end;

procedure TFoo.FormClose(Sender: TObject; var Action: TCloseAction);
begin // Formular freigeben
  Action := caFree;
end;

procedure TFoo.FormCreate(Sender: TObject);
begin // Formulareigenschaften vorbereiten
  BorderIcons := [];
  KeyPreview := true;
end;

procedure TFoo.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin // Schließen des Fensters mit [Alt] + [F4] verhindern
  if ((ssAlt in Shift) and (Key = VK_F4)) then Key := $0000;
end;

end.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TFoo.Create(Application) do ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TFoo.Create(Application) do Show;
end;

BadenPower 3. Jul 2015 11:44

AW: dynamisch erzeugte Forms richtig freigeben
 
Zitat:

Zitat von mm1256 (Beitrag 1307555)
Hallo,

es geht wieder zurück zur ursprünglichen Problematik und da hab ich in #7 schon geschrieben

Zitat:

Also weg mit allen BorderIcons und Alt+F4 abfangen, und gut isses. Dann wird auch sauberer Code daraus.

Auch wenn Du das in #7 schon geschrieben hast, es wird nicht besser.

Durch das Entziehen aller BorderIcons nimmst Du dem Benutzer, welcher mit der Tastatur arbeitet, unnötigerweise (weil Du es so willst), einfach die Möglichkeit seine gewohnte Weise ein Fenster zu verschieben oder in der Größe zu ändern.

mm1256 3. Jul 2015 12:43

AW: dynamisch erzeugte Forms richtig freigeben
 
Da mag die Frage erlaubt sein: Wie viele Anwender wenden es in der Praxis an, bzw. wissen überhaupt, dass man mit [Alt]+[Leertaste] das Menü öffnen, hier "Verschieben" auswählen, und dann das Fenster mit den Pfeiltasten verschieben kann? Und für den Fall, dass das gewünscht ist, dann reicht eine einzige Zeile Code, ohne dass die übrige Funktionalität/logik verändert werden muss:

Delphi-Quellcode:
BorderIcons := [biSystemMenu];


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.
Seite 3 von 4     123 4      

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