Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konzeptfrage FormCreate (https://www.delphipraxis.net/133918-konzeptfrage-formcreate.html)

WIng2005 12. Mai 2009 07:45


Konzeptfrage FormCreate
 
Hallo Gemeinde,

ich möchte aufgrund der mehrfachen Nutzung das Erzeugen meiner Formulare in eine Funktion auslagern.
Meine Ansätze hierzu funktionieren soweit auch, jedoch verhält sich das ganze in manchen Fällen ein wenig mehrwürdig:

Delphi-Quellcode:
function createform(AOwner:TFormClass;nform:TForm):boolean;
Begin
try
  application.CreateForm(aowner,nform);
  nform.Parent:=mainform.panel_df;
  mainform.Notebook1.Visible:=false;
  nform.Show;
  result:=true;
except
  result:=false;
end;
end;

//Aufruf:
createform(TForm1,Form1); //Funktioniert
aber: nachdem die Form erzeugt wurde prüfe ich mit:
Delphi-Quellcode:
if assigned(form1) then machwas
Hier wird seltsamerweise immer false zurückgegeben. Setze ich anstelle des Aufrufes der Funktion, die Funktion selbst mit den entsprechenden Werten ein, wird auf die Prüfung der zugehörige Code ausgeführt. Meine Vermutung ist nun, dass ich mit den Typen der Parameter etwas vermasselt habe. Leider ist die Delphi 7 Hilfe hier jedoch nicht sehr auskunftsfreudig....also hoffe ich, dass ihr mir helfen könnt.
Vielen Dank!

//EDIT: ist die Funktionsbezeichnung kritisch?

PMM 12. Mai 2009 08:30

Re: Konzeptfrage FormCreate
 
Probier mal
Delphi-Quellcode:
function createform(AOwner:TFormClass; VAR nform:TForm):boolean;
Ohne VAR wird innerhalb der function eine Kopie von "nform" benutzt (call by value), du möchtest aber das Ergebnis (die Adr. der TForm Instanz) ausserhalb der function verwenden (call by reference)
PMM

WIng2005 12. Mai 2009 08:37

Re: Konzeptfrage FormCreate
 
Hallo,
danke für die Rückmeldung.
Mit der Version bekomme ich Probleme beim Aufruf:

Delphi-Quellcode:
createform(TForm1,Form1)
"[Fehler] Customize.pas(378): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen"

PMM 12. Mai 2009 08:44

Re: Konzeptfrage FormCreate
 
Wie hast du den Form1 deklariert?

WIng2005 12. Mai 2009 08:50

Re: Konzeptfrage FormCreate
 
Naja, wie eine Form halt deklariert wird:

Delphi-Quellcode:
TForm1 = class(TForm)
   
   private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

nahpets 12. Mai 2009 08:54

Re: Konzeptfrage FormCreate
 
Hallo,

Form1 ist ja auch vom Type TForm1 und nicht vom Type TForm, Du benötigst hier also noch einen entsprechenden Typecast. Ob das so in der von Dir gewünschten Form geht, weiß ich nicht.

Eventuell könnte ja sowas in dieser Art funktionieren (nicht getestet)
Delphi-Quellcode:
function createform(AOwner: TFormClass ; var nform {typloser Parameter} ):boolean;
Begin
  result := false;
  try
    if nForm is TForm then begin
      application.CreateForm(AOwner,nform);
      nform.Parent := mainform.panel_df;
      mainform.Notebook1.Visible := false;
      nform.Show;
      result := true;
    end;
  except
  end;
end;

PMM 12. Mai 2009 09:04

Re: Konzeptfrage FormCreate
 
Noch was:
Delphi-Quellcode:
application.CreateForm(AOwner,nform);
Der erste Parameter ist die FormClass und nicht der Owner. Du solltest diesen dann auch nicht aOwner nennen.
PMM

WIng2005 12. Mai 2009 09:19

Re: Konzeptfrage FormCreate
 
Ich habe das ganze mal aus meinem Projekt herausgelöst und neu aufgesetzt:

Delphi-Quellcode:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    function formerzeugen(fclass:TFormClass;var nform):boolean;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
uses unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  formerzeugen(TForm2,form2);
end;

function TForm1.formerzeugen(fclass:TFormClass;var nform):boolean;
Begin
    application.CreateForm(fclass,nform);
    (nform as TForm).show //geht nicht :[Fehler] Unit1.pas(39): Operator ist auf diesen Operandentyp nicht anwendbar
end;

end.


//////////////////////////////////////////////
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Label1: TLabel;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.
Casten ließ sich der Typ nicht.

Zoot 12. Mai 2009 09:25

Re: Konzeptfrage FormCreate
 
So sollte es gehen:

Zitat:

Zitat von WIng2005
Delphi-Quellcode:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    function formerzeugen(fclass:TFormClass;var nform : Tform):boolean;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
uses unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  formerzeugen(TForm2,TForm(form2));
end;

function TForm1.formerzeugen(fclass:TFormClass;var nform:Tform):boolean;
Begin
    application.CreateForm(fclass,nform);
    nform.show
end;

end.


//////////////////////////////////////////////
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Label1: TLabel;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.


WIng2005 12. Mai 2009 09:31

Re: Konzeptfrage FormCreate
 
Hallo,

funktioniert!! Nun fehlt mir jedoch noch das Verständnis dazu:
Delphi-Quellcode:
formerzeugen(TForm2,TForm(form2));

//bzw
function TForm1.formerzeugen(fclass:TFormClass;var nform:Tform):boolean;
Kannst du evtl. mal 1-2 Sätze dazu verlieren?

Vielen Dank


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 Uhr.
Seite 1 von 5  1 23     Letzte »    

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