![]() |
Frage, geht es auch so, oder gebe ich etwas nicht frei, oder stimmt sonst alles oder weniges nicht?
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, Forms, StdCtrls, ExtCtrls, Dialogs, Classes, Controls, Unit2, Unit3; type TMainForm = class(TForm) PanelBar: TPanel; ButtonShow: TButton; procedure ButtonShowClick(Sender: TObject); procedure FormCreate(Sender: TObject); private Child : TChildForm; procedure CloseChild; { Private-Deklarationen } public { Public-Deklarationen } end; var MainForm : TMainForm; WProc : Pointer; implementation {$R *.DFM} function MyWndProc(Handle : hWnd; Msg, wParam, lParam : longint):longint;stdcall; begin if Msg = Msg_SetToNil then begin MainForm.CloseChild; end; Result := CallWindowProc(WProc,Handle,Msg,wParam,lParam); end; procedure TMainForm.ButtonShowClick(Sender: TObject); begin if Child = nil then begin Child := TChildForm.Create(MainForm); end else begin showMessage('Schon eine ChildForm vorhanden'); end; end; procedure TMainForm.CloseChild(); begin Child := nil; end; procedure TMainForm.FormCreate(Sender: TObject); begin WProc := Pointer(SetWindowLong(Application.Handle,GWL_WNDPROC,Integer(@MyWndProc))); end; end.
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Forms, Unit3; type TChildForm = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; var ChildForm: TChildForm; implementation {$R *.DFM} procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction); begin SendMessage(Hnd,Msg_SetToNil,0,0); Action := caFree; end; end.
Delphi-Quellcode:
unit Unit3;
interface uses Messages, Forms, Windows; var hnd : THandle; const Msg_SetToNil = WM_USER+100; implementation initialization hnd := Application.Handle; end. Also Unit1 beinhaltet die MDIForm, Unit2 die MDIChildForm und Unit3 Globales. (Ps. Wenn der Code zu lang ist, lösche ich ihn wieder.) Danke für antworten, Mirilin |
Moin Mirlin,
soweit ich das überblicke wird wieder alles freigegeben: Dadurch, dass Du beim Create MainForm als Owner angibst, würde das ChildForm spätestens beim zerstören (freigeben) von Mainform mit freigegeben werden. Durch Action := caFree wird es dann beim Schliessen auch wieder freigegeben. Das mit der WindowProcedure kannst Du auch einfacher haben:
Delphi-Quellcode:
Falls da sonst nichts drin ist, könnten nun die FormCreate und CloseChild entfallen.
// Unter FormCreate in TMainForm = class(TForm)
procedure WndProc(var msg: TMessage); override; // In Implementation procedure TMainForm.WndProc(var msg: TMessage); begin if Msg = Msg_SetToNil then begin Child := nil; exit; // Die "normale" WndProc kennt die Message ja sowieso nicht end; inherited WndProc(msg); end; |
Hallo zusammen...
schaut euch mal dies an- funzt einwandfrei!
Delphi-Quellcode:
Es gibt einen Unterschied:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Menus, StdCtrls; type TForm1 = class(TForm) MainMenu1: TMainMenu; StatusBar1: TStatusBar; N11: TMenuItem; N21: TMenuItem; Button1: TButton; procedure N11Click(Sender: TObject); procedure N21Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses Unit2, Unit3; {$R *.dfm} procedure TForm1.N11Click(Sender: TObject); begin If not Assigned(Form2) then Form2:=TForm2.Create(Application); end; procedure TForm1.N21Click(Sender: TObject); begin If not Assigned(Form3) then begin Form3:=TForm3.Create(Application); end else Freeandnil(Form3); end; end. Form drei wird mit selbigen Button der sie aufruft auch wieder geschlossen. Bei Form eins muß man wie gewohnt (über das "X") schließen. Probiert es mal aus- bei mir klappts einwandfrei. OH- bevor ich es vergesse- wichtig: In der Unit der jeweiligen Forms wie gewohnt:
Delphi-Quellcode:
und nicht vergessen:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action:=caFree end;
Delphi-Quellcode:
...sonst gibts wieder Fehlermeldungen!
procedure TForm2.FormDestroy(Sender: TObject);
begin Form2 := nil; end; Also, danke euch nochmal!!! Bis bald, Grüße Alex...der bestimmt bald wieder was textet;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 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