Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MDI Problem :-( (https://www.delphipraxis.net/61243-mdi-problem.html)

dorisdoloris 18. Jan 2006 18:13


MDI Problem :-(
 
Hallo ihr lieben ich habe folgendes Problem. Wenn ich eine Hauptform habe die "FormStyle (fsMDIForm)" ist und ich dann von dieser Hauptform aus im "OnActivate" Ereignis ein neues MDIChild aufrufen will dann klappt das. Hier mal der Code.

Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ChildWin,
  StdCtrls;

type
  TfMain = class(TForm)
    procedure FormActivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure CreateMDIChild(const Name: string);
  public
    { Public-Deklarationen }
  end;

var
  fMain: TfMain;

implementation

{$R *.DFM}

procedure TfMain.CreateMDIChild(const Name: string);
var
  Child: TMDIChild;
begin
  //new MDI child window
  Child := TMDIChild.Create(Application);
  Child.Caption := Name;
end;

procedure TfMain.FormActivate(Sender: TObject);
begin

CreateMDIChild('NewWindow');

end;

procedure TfMain.FormCreate(Sender: TObject);
begin

end;

end.
Soweit so gut das klappt ja, aber wenn ich eine Hauptform habe die nur "FormStyle (fsNormal)" ist und ich auf dieser einen Button platziere und ich dann über diesen eine neue Form von "FormStyle (fsMDIForm)" öffne dann klappt es nicht mehr. Es wird zwar die neue Form geöffnet aber beim erzeugen eines MDIChild im "OnActivate" Ereignis der "MDI-Form" tritt folgender Fehler auf "Formular kann nicht erstellt werden. Zur Zeit sind keine MDI-Formulare aktiv."

Delphi-Quellcode:

// Code wo der Fehler auftritt

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TfMain = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  fMain: TfMain;

implementation

uses Unit2;

{$R *.DFM}


procedure TfMain.BitBtn1Click(Sender: TObject);
begin

fMDI.Show();


end;

end.

//-----------------------------------------------------------------------------

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ImgList, ComCtrls, ToolWin,ChildWin;

type
  TfMDI = class(TForm)
    MainMenu1: TMainMenu;
    Einstellungen1: TMenuItem;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ImageList1: TImageList;
    ToolButton3: TToolButton;
    procedure FormCreate(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
    procedure CreateMDIChild(const Name: string);
  end;

var
  fMDI: TfMDI;


implementation

uses Unit1;

{$R *.DFM}


procedure TfMDI.CreateMDIChild(const Name: string);
var
  Child: TMDIChild;
begin
  //new MDI child window
  Child := TMDIChild.Create(Application);
  Child.Caption := Name;
end;


procedure TfMDI.FormCreate(Sender: TObject);
begin

CreateMDIChild('NewWindwow' + IntToStr(MDIChildCount + 1));

end;


end.

//-------------------------------------------------------------------------------
lg: doris

Der Jan 18. Jan 2006 18:46

Re: MDI Problem :-(
 
AFAIK funktioniert der normale MDI-Mechanismus der VCL nur, wenn das Hauptformular MDIForm ist. SOnst wirds nix.

CG2003 18. Jan 2006 19:17

Re: MDI Problem :-(
 
Zitat:

Zitat von Der Jan
AFAIK funktioniert der normale MDI-Mechanismus der VCL nur, wenn das Hauptformular MDIForm ist. SOnst wirds nix.

Korrekt. Wäre ja vom Sinn her auch Blödsinn. Dann könnte man auch gleich ein normales TForm nehmen.

dorisdoloris 18. Jan 2006 20:50

Re: MDI Problem :-(
 
Danke für eure schnelle Hilfe. Wenn man ein MDIChild nur von einem Hauptformular das auch MDIForm ist aufrufen kann dann hilft mir das leider nicht weiter. Ich müsste bei ButtonClick beliebig viele neue Fenster öffnen können. Kann man das vielleicht noch anders lösen ?

lg: doris

CG2003 18. Jan 2006 20:57

Re: MDI Problem :-(
 
Zitat:

Zitat von dorisdoloris
Kann man das vielleicht noch anders lösen ?

Klar.

Einfach ein Form erstellen, das den "Rohling" darstellt, es aus der Liste der autmatisch erstellten Formulare
rausnehmen und bei

Delphi-Quellcode:
Button.OnClick
einfach

Delphi-Quellcode:
TForm1.Create;
eintragen. Wobei TForm1 evtl. durch den Namen des Formulars zu ersetzen ist, welches Du als "Rohling" erstellt hast.

dorisdoloris 18. Jan 2006 21:18

Re: MDI Problem :-(
 
Ich weis doch aber nicht wieviel neue Fenster der User haben will wenn er auf den Button clickt. Also wenn er zb. einmal klickt soll sich ein neues Fenster öffnen (Fenster 1). Wenn er noch einmal draufklickt wieder ein neues Fenster (Fenster 2)usw. Wenn ich das begrenzen würde bräuchte ich ja nur so viele Formulare wie maximal geöffnet werden dürfen erstellen und diese dann aufrufen mit Form1.Show; Form2.Show usw. Aber genau das möchte ich nicht es soll so sein wie bei den MDIChilds also Dynamisch.

lg: doris

CG2003 18. Jan 2006 21:25

Re: MDI Problem :-(
 
Deswegen mach' es so, wie in meinem letzten Post. Dadruch wird bei jedem Klick auf den Button ein neues Fenster "erzeugt".
Ist auch dynamisch und zur Laufzeit.

dorisdoloris 18. Jan 2006 22:08

Re: MDI Problem :-(
 
Also entweder versteh ich was falsch oder ich bin blond. Wenn ich TForm2.Create; aufrufe dann ist das doch immer das gleiche Fenster und nicht wirklich ein neues. Das heist wenn ich es einmal aufrufe und dann nocheinmal wird doch das gleiche wieder geöffnet oder nicht ? Ich habe also ein Hauptformular (Form1) und noch ein weiteres erstellt (Form2) Form2 hab ich also unter Projekt Optionen Formulare von "Automatisch erzeugen" nach rechts verschoben in "Verfügbare Formulare" wie du es sagtest. Dann hab ich in der Form1 bei ButtonClick "TForm1.Create;" reingeschrieben darauf kommt der Fehler "Undifinierter Bezeichner TForm2" Also hab ich folglich noch unter "implementation" "uses Unit2;" eingetragen darauf jetzt dieser Fehler "Nicht genügend wirkliche" Parameter

3_of_8 18. Jan 2006 22:21

Re: MDI Problem :-(
 
Wenn du TForm2.create aufrufst, erzeugst du eine neue Instanz der Klasse TForm2.

Normalerweise macht Delphi das automatisch in die Variable Form2. Aber wenn du das manuell instantiierst, dann hast du mit jedem Aufruf von Create eine komplett neue Form2 die von den anderen unabhängig ist.

Verwechsle nicht TForm.create mit TForm.show.

dorisdoloris 18. Jan 2006 22:30

Re: MDI Problem :-(
 
Delphi-Quellcode:


procedure TForm1.Button1Click(Sender: TObject);
begin

TForm2.Create(self);
Form2.Show();

end;



Also ich hab es jetzt so gemacht aber wie ich schon sagte wenn ich ein zweites mal draufklicke bleibt das Fenster Form2 und es kommt kein neues wie mei MDI-Child. Ich könnte jetzt TForm3.Create(self); machen aber dazu müsste ja wieder erst eine neue Form (Form3) erstellt werden also ist es doch wieder abhängig wieviele Formulare ich vorher erstelle oder doch nicht ? Ich verzweifel langsam 'g


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 Uhr.
Seite 1 von 3  1 23      

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