Delphi-PRAXiS
Seite 2 von 5     12 34     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)

Zoot 12. Mai 2009 09:34

Re: Konzeptfrage FormCreate
 
Zitat:

Zitat von WIng2005
Hallo,

funktioniert!! Nun fehlt mir jedoch noch das Verständnis dazu:
Delphi-Quellcode:
formerzeugen(TForm2,TForm(form2));
Kannst du evtl. mal 1-2 Sätze dazu verlieren?

Vielen Dank

Nun gut, VAR erwartet exakte Übereinstimmung der Parametertypen.
Für Application.CreateForm ist nur die Objektvariable wichtig, da der Klassentyp gesondert übergeben wird.
Also casten wir das Ganze zu TForm und es funktioniert.

PMM 12. Mai 2009 09:35

Re: Konzeptfrage FormCreate
 
Der "as" operator setzt einen Nachfolger von TObject voraus. nform ist jetzt aber eine untypisierte Refrenz, über die der Compiler keine weiteren Annahmen machen darf.
Du hast zwei Optionen:
TForm(nform).Show ... benutzen - damit übernimmst du die Verantwortung das der cast OK ist.
Oder den nform parameter typisieren:
Delphi-Quellcode:
  function formerzeugen(fclass:TFormClass;var nform : Tform1):boolean;
verwenden. Dann klappt das ohne cast. Ich würde dann aber auch den ersten Parameter komplett entfernen, denn es wird ja nun immer eine TForm1 Instanz erstellt. Also:
Delphi-Quellcode:
function formerzeugen(var nform : Tform1):boolean;
PMM

WIng2005 12. Mai 2009 09:37

Re: Konzeptfrage FormCreate
 
Vielen Dank für die Ausführungen. Das schafft mal wieder ein wenig mehr Klarheit!!

uligerhardt 12. Mai 2009 11:08

Re: Konzeptfrage FormCreate
 
Wie wäre es denn, wenn du ganz banal eine Funktion anstelle der Prozedur nehmen würdest:
Delphi-Quellcode:
function CreateForm(AOwner: TFormClass): TForm;
begin
  Application.CreateForm(AOwner, Result);
  try
    Result.Parent := mainform.panel_df;
    mainform.Notebook1.Visible := false;
    Result.Show;
  except
    Result := nil;
  end;
end;
HTH,
Uli.

Zoot 12. Mai 2009 11:46

Re: Konzeptfrage FormCreate
 
Zitat:

Zitat von uligerhardt
Wie wäre es denn, wenn du ganz banal eine Funktion anstelle der Prozedur nehmen würdest:
Delphi-Quellcode:
function CreateForm(AOwner: TFormClass): TForm;
begin
  Application.CreateForm(AOwner, Result);
  try
    Result.Parent := mainform.panel_df;
    mainform.Notebook1.Visible := false;
    Result.Show;
  except
    Result := nil;
  end;
end;
HTH,
Uli.

Im Prinzip ja.

Aber wenn in Result.Show eine Exception auftritt, setzt du Result einfach auf NIL? Ich weiß ja nicht....

WIng2005 12. Mai 2009 11:51

Re: Konzeptfrage FormCreate
 
Da das Ergebnis der Funktion vom typ TForm ist sollte diese doch mit

Delphi-Quellcode:
form2:=createform(TForm2);
aufgerufen werden,was jedoch in einer Fehlermeldung:
[Fehler] Unit1.pas(31): Inkompatible Typen: 'TForm2' und 'TForm'
endet. Oder habe ich hier nen Denkfehler?

uligerhardt 12. Mai 2009 12:00

Re: Konzeptfrage FormCreate
 
Zitat:

Zitat von Zoot
Aber wenn in Result.Show eine Exception auftritt, setzt du Result einfach auf NIL? Ich weiß ja nicht....

Ähm ja, da hab ich zu sehr von der Vorlage abgekupfert. Ein FreeAndNil wäre besser. Oder man lässt das Exceptionhandling an dieser Stelle weg - ich weiß ja nicht, wofür es gut sin soll.

uligerhardt 12. Mai 2009 12:02

Re: Konzeptfrage FormCreate
 
Zitat:

Zitat von WIng2005
Da das Ergebnis der Funktion vom typ TForm ist sollte diese doch mit

Delphi-Quellcode:
form2:=createform(TForm2);
aufgerufen werden,was jedoch in einer Fehlermeldung:
[Fehler] Unit1.pas(31): Inkompatible Typen: 'TForm2' und 'TForm'
endet. Oder habe ich hier nen Denkfehler?

Hmm, um einen Cast kommst du hier auch nicht herum.
Delphi-Quellcode:
 Form2 := TForm2(createform(TForm2));

WIng2005 12. Mai 2009 12:29

Re: Konzeptfrage FormCreate
 
Irgendwie wird keine Form erzeugt, wenngleich die Funktion ordnungsgemäß durchläuft....

quendolineDD 12. Mai 2009 12:37

Re: Konzeptfrage FormCreate
 
Wie rufst du sie auf?
Delphi-Quellcode:
var
 f : TForm;
begin
  Application.CreateForm(TForm, f);
  f.Parent := Panel1;
  f.Visible := TRUE;
  f.Show;
end;
funktioniert bei mir ohne Probleme.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 Uhr.
Seite 2 von 5     12 34     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