Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MDI-ClientForm erzeugen (https://www.delphipraxis.net/39427-mdi-clientform-erzeugen.html)

Quake 2. Feb 2005 14:36


MDI-ClientForm erzeugen
 
Hallo,

in meiner MDI-Anwendung möchte ich verschiedene MDI-Client Formulare auf Anforderung öffnen. Wenn ich in jedem Menüpunkt folgenen Code Verwende funktioniert das auch:
Code:
procedure THauptForm.ErsteMenuPunktClicken(Sender: TObject);
  var
    i: integer;
  begin
    for i:=0 to pred(MDIChildCount) do
      if MDIChildren[i] is TMeinErstesMDIClienForm then
      begin
        MDIChildren[i].BringToFront;
        MDIChildren[i].WindowState:=wsNormal;
        Exit;
      end;
    TMeinErstesMDIClienForm.Create(self);
  end;
Was micht daran stört? Ich muss für jeden Menüpunkt diesen Code eingeben da ich ja bei jedem Münüpunkt ein anderes Formular öffnen möchte und deswegen unterscheiden sich auch die Klassen der Formulare.
Deswegen dachte ich man könnte es auch so machen:
Code:
procedure THauptForm.ErsteMenuPunktClicken(Sender: TObject);
  begin
    MDIClientFormErzeugen(TMeinErstesMDIClienForm);
  end;

procedure THauptForm.MDIClientFormErzeugen(FormularKlasse: TClass);
  var
    i: integer;
  begin
    for i:=0 to pred(MDIChildCount) do
      if MDIChildren[i] is FormularKlasse then
      begin
        MDIChildren[i].BringToFront;
        MDIChildren[i].WindowState:=wsNormal;
        Exit;
      end;
    TForm(FormularKlasse).Create(self);
  end;
Aber leider bekomme ich eine Zugriffsverletzung beim Create.

Wie bekomme ich dies denn aber nun richtig hin?

ciao
Quake

Quake 3. Feb 2005 07:10

Re: MDI-ClientForm erzeugen
 
Moin moin,

:coder: ich habs jetzt selber heraus bekommen wie das geht :bounce2:
Code:
procedure THauptForm.ErsteMenuPunktClicken(Sender: TObject);
  begin
    MDIClientFormErzeugen(TMeinErstesMDIClienForm);
  end;

function THauptForm.MDIClientFormErzeugen(FormularKlasse: TFormClass): TForm;
  var
    i: integer;
  begin
    for i:=0 to pred(MDIChildCount) do
      if MDIChildren[i] is FormularKlasse then
      begin
        result:=MDIChildren[i];
        MDIChildren[i].BringToFront;
        MDIChildren[i].WindowState:=wsNormal;
        Exit;
      end;
    Application.CreateForm(FormularKlasse,result);
  end;
ciao
Quake :)

Quake 3. Feb 2005 08:53

Re: MDI-ClientForm erzeugen
 
sorry, dass funktioniert nur auf den ersten Blick.

mason 3. Feb 2005 09:54

Re: MDI-ClientForm erzeugen
 
Was geht denn auf den zweiten Blick schief?
Ich hab das mal bei mir mit 2 MDI-Childs probiert - es funktioniert. Aber vielleicht ist das nur der erste Blick, den ich bisher getestet habe?
Wobei es auch mit einer Mischung aus deinen beiden Vorschlägen funktioniert (pack ich mal noch mit rein, weil mir diese Variante am besten gefällt :-D ):
Delphi-Quellcode:
procedure THauptForm.MDIClientFormErzeugen(FormularKlasse: TFormClass);
  var
    i: integer;
  begin
    for i:=0 to pred(MDIChildCount) do
      if MDIChildren[i] is FormularKlasse then
      begin
        MDIChildren[i].BringToFront;
        MDIChildren[i].WindowState:=wsNormal;
        Exit;
      end;
    FormularKlasse.Create(self);
  end;

Quake 3. Feb 2005 10:25

Re: MDI-ClientForm erzeugen
 
Hallo, erstmal danke für dein mühen, aber dies von dier ist der erste Blick :wink:
Ich hab jetzt aber den Fehler heraus gefunden. Das Problem ist ich möchte das Fenster zurück geliefert bekommen. Deswegen habe ich bei meinem 2. Beitrag aus der Procedure eine Function gemacht. Das Problem in dieser Function trat auf, wenn das Formular schon existiert. Da ich in meinem Programm eine kleine Änderung gegenüber dem 2. Beitrag gemacht hatte. Undzwar hat ich in der Function zuerst MDIChildren[i].BringToFront; und erst danach result:=MDIChildren[i]; :wall:. Das hat zur folge, das i nicht mehr die nummer des gleichen MDIChildren ist. Wird der Code in der Reihenfolge verwendet wie er im Beitrag 2 steht liefert result das richte Formular zurück. Und das Create habe ich auch noch verändert. Mit Application.CreateForm(FormularKlasse,result) hat das MDIChild den falschen Owner.

ciao
Quake
Delphi-Quellcode:
function TApplikationsForm.MDIClientFormErzeugen(FormularKlasse: TFormClass): TForm;
  var
    i: integer;
  begin
    result:=nil;
    for i:=0 to pred(MDIChildCount) do
    begin
      if MDIChildren[i] is FormularKlasse then
      begin
        result:=MDIChildren[i];
        result.BringToFront;
        result.WindowState:=wsNormal;
        Exit;
      end;
    end;
    result:=FormularKlasse.Create(self);
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 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