AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MDIChild- wie gehts am besten?

Ein Thema von lowell · begonnen am 3. Feb 2003 · letzter Beitrag vom 4. Feb 2003
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Mirilin
Mirilin

Registriert seit: 21. Dez 2002
Ort: Lenzburg
861 Beiträge
 
Delphi 6 Professional
 
#11
  Alt 4. Feb 2003, 15: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
Tobias
Die Physik ist für die Physiker eigentlich viel zu schwer.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#12
  Alt 4. Feb 2003, 16: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
lowell

Registriert seit: 3. Feb 2003
Ort: Frankfurt
13 Beiträge
 
#13
  Alt 4. Feb 2003, 18: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
Danke für die Hilfe im vorraus- hoffe auch irgendwann mal helfen zu können
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 Uhr.
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