![]() |
AW: dynamisch erzeugte Forms richtig freigeben
Wenn man von der Überschrift ausgeht :
Zitat:
Delphi-Quellcode:
vorkam.
caFree
Wenn das OnClose so aussieht :
Delphi-Quellcode:
dann ist die Form freigegeben und fertig. Egal, ob sie mit Alt-F4, Schliess-x usw. geschlossen wird.
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; |
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:
holen kann.
ShowModal
|
AW: dynamisch erzeugte Forms richtig freigeben
Zitat:
|
AW: dynamisch erzeugte Forms richtig freigeben
Zitat:
Hier wird die Dialog-Instanz immer freigegeben:
Delphi-Quellcode:
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.
LDialog := TDialog.Create(nil);
try LDialog.Assign( LDialogData ); if LDialog.ShowModal = mrOK then LDialogData.Assign( LDialog ); finally LDialog.Free; end; 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 ... |
AW: dynamisch erzeugte Forms richtig freigeben
Zitat:
|
AW: dynamisch erzeugte Forms richtig freigeben
Zitat:
Wer weiß schon, was sich der ursprüngliche Programmierer gedacht hat bei seinem (eventuell bewußten?) Verzicht auf ShowModal... LG |
AW: dynamisch erzeugte Forms richtig freigeben
Zitat:
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. |
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:
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; |
AW: dynamisch erzeugte Forms richtig freigeben
Zitat:
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. |
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 09:22 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