Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MDIChild- wie gehts am besten? (https://www.delphipraxis.net/2695-mdichild-wie-gehts-am-besten.html)

Mirilin 4. Feb 2003 14:42

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

Christian Seehase 4. Feb 2003 15:03

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:
// 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;
Falls da sonst nichts drin ist, könnten nun die FormCreate und CloseChild entfallen.

lowell 4. Feb 2003 17:46

Hallo zusammen...

schaut euch mal dies an- funzt einwandfrei!
Delphi-Quellcode:
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.
Es gibt einen Unterschied:
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:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree
end;
und nicht vergessen:

Delphi-Quellcode:
procedure TForm2.FormDestroy(Sender: TObject);
begin
Form2 := nil;
end;
...sonst gibts wieder Fehlermeldungen!

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.
Seite 2 von 2     12   

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