![]() |
Problem mit Freigeben von CreateMessageDialog
Hallo Jungs und Mädels,
ich erzeuge im OnCreate einer Form eine MessageForm mit CreateMessageDialog:
Delphi-Quellcode:
die Variable MessageForm ist im private-Bereich als TForm deklariert.
//Meldungs-Form erzeugen und beschreiben
MessageForm := CreateMessageDialog(Msg3, mtInformation, []); with MessageForm do begin BorderIcons := []; BorderStyle := bsNone; Font.Height := 15; Font.Style := [fsBold]; Color := $00F8E4D8; Height := 55; Width := 320; FormStyle := fsStayOnTop; OnPaint := OnPaintMessageForm; end; Soweit so gut - es funktioniert bestens. Nur, soviel ich weiss, muss man "alles" was man erzeugt auch wieder im OnDestroy der Form freigeben. Also mach ich im OnDestroy der Form:
Delphi-Quellcode:
Nur erhalte ich dabei folgende AccessViolation:
FreeAndNil(MessageForm);
Zitat:
Die Variable existiert - wird createt und müsste doch ganz einfach freizugeben sein, oder irre ich da mich? Oder sind CreateMessageDialogs spezielle Forms? |
Re: Problem mit Freigeben von CreateMessageDialog
So, ich hab mir nochmal die Funktion in der Hilfe angeguckt und kann dir jetzt die Antwort auf deine Frage geben:
Delphi-Quellcode:
Wie du siehst ist das Ergebnis von Typ TForm. Letztendlich ist es nur ein Zeiger den du bekommst, d.h. du erstellst keine Formular, das macht CreateMessageDialog für dich, du erhälst nur den Zeiger auf den Formular. Das ist nichts anderes wie eine Integer Variable. Um das Freigeben kümmert sich in diesem Fall Delphi selbst.
function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons): TForm;
|
Re: Problem mit Freigeben von CreateMessageDialog
@Popov: Die Aussage ist schlichtweg falsch. Ein Constructor gibt auch nichts anderes zurück als einen Zeiger auf die Instanzdaten. Trotzdem sollte man wie der Fragesteller bereits erwähnt hat alles wieder freigeben was man vorher selbst erstellt hat.
Die Accessviolation deutet übrigens darauf hinn das zu diesem Zeitpunkt die Instanzvariable bereits auf nil gesetzt wurde. Rufst du eventuell vorher schonmal FreeAndNil oder ähnliches auf? |
Re: Problem mit Freigeben von CreateMessageDialog
Hallo Sir Thornberry,
ich setz die Variable "MessageForm" zwischendurch nicht auf nil. Auch wenn ich den o. s. Code rauslöse aus dem Projekt und in einem Test-Projekt allein laufen lasse (also nur erzeugen in OnCreate und in einem Button z. B. mit MessageForm.Show anzeigen lassen), passiert das gleiche im OnDestroy mit FreeAndNil(MessageForm). |
Re: Problem mit Freigeben von CreateMessageDialog
ich würde das ganze nicht im OnDestroy plazieren sondern direkt hinter dem ShowModal. Denn genau dort wird der MessageDialog nicht mehr benötigt. Kommt dann auch der Fehler wenn du genau dort das ganze schon wieder freigibst?
|
Re: Problem mit Freigeben von CreateMessageDialog
Geht.
Delphi-Quellcode:
type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } MessageForm: TForm; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin MessageForm.ShowModal; end; procedure TForm1.FormCreate(Sender: TObject); begin MessageForm := CreateMessageDialog('Test', mtInformation, []); with MessageForm do begin BorderIcons := []; BorderStyle := bsDialog; Font.Height := 15; Font.Style := [fsBold]; Color := $00F8E4D8; Height := 55; Width := 320; FormStyle := fsStayOnTop; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FreeAndNil(MessageForm); end; |
Re: Problem mit Freigeben von CreateMessageDialog
Hallo Sir,
ich kann es dort leider nicht hinsetzen, da ich die MessageForm nur mit Show/Hide anzeige bzw. verstecke weil ich es mehrmals anzeige bzw auch wieder verstecke. Deswegen wird es im OnCreate auch einmal verwendet und dann nur immer mit show und hide angezeigt/versteckt |
Re: Problem mit Freigeben von CreateMessageDialog
Hallo Helmi,
wenn du in deine MessageForm einen Handler für das Ereignis OnDestroy einhängst, wirst du feststellen, daß der Dialog bereits freigegeben wurde, bevor dein Hauptformular zerstört wird. Deine lokale Variable MessageForm zeigt danach also auf ein bereits ungültiges Objekt. Entweder verzichtest du auf die (überflüssige) Freigabe, oder du gibst das Formular - wie von Michael vorgeschlagen - im OnClose frei, oder du löschst im OnDestroy-Handler der MessageForm deine lokale Referenz. Gruß Hawkeye |
Re: Problem mit Freigeben von CreateMessageDialog
@SirThornberry
Da muß ich dir leider Recht geben. Hab gerade deswegen noch die Enterprise installiert um an den Quellcode der Funktion zu kommen. Tatsächlich wird Create auf Result ausgeführt. Wie es aussieht habe ich es mit einer anderen Funktion verwechselt die mit den Parametern lediglich Änderung der Eigenschaften vornimmt, sonst aber nichts erstellt. Die hatte auch Create im Namen. Wie auch immer, Tests haben gezeigt, daß jeder Aufruf der Funktion neuen Speicher verbraucht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 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