![]() |
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:
aber: nachdem die Form erzeugt wurde prüfe ich mit:
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
Delphi-Quellcode:
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.
if assigned(form1) then machwas
Vielen Dank! //EDIT: ist die Funktionsbezeichnung kritisch? |
Re: Konzeptfrage FormCreate
Probier mal
Delphi-Quellcode:
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)
function createform(AOwner:TFormClass; VAR nform:TForm):boolean;
PMM |
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" |
Re: Konzeptfrage FormCreate
Wie hast du den Form1 deklariert?
|
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; |
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; |
Re: Konzeptfrage FormCreate
Noch was:
Delphi-Quellcode:
Der erste Parameter ist die FormClass und nicht der Owner. Du solltest diesen dann auch nicht aOwner nennen.
application.CreateForm(AOwner,nform);
PMM |
Re: Konzeptfrage FormCreate
Ich habe das ganze mal aus meinem Projekt herausgelöst und neu aufgesetzt:
Delphi-Quellcode:
Casten ließ sich der Typ nicht.
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. |
Re: Konzeptfrage FormCreate
So sollte es gehen:
Zitat:
|
Re: Konzeptfrage FormCreate
Hallo,
funktioniert!! Nun fehlt mir jedoch noch das Verständnis dazu:
Delphi-Quellcode:
Kannst du evtl. mal 1-2 Sätze dazu verlieren?
formerzeugen(TForm2,TForm(form2));
//bzw function TForm1.formerzeugen(fclass:TFormClass;var nform:Tform):boolean; Vielen Dank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr. |
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 by Thomas Breitkreuz