Delphi-PRAXiS
Seite 2 von 2     12   

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 TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist (https://www.delphipraxis.net/209249-tform-klasse-dynamisch-erstellen-ja-nachdem-ob-klasse-vorhanden-ist.html)

Jasocul 16. Nov 2021 08:12

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
Zitat:

Zitat von fisipjm (Beitrag 1497618)
Zitat:

Zitat von Jasocul (Beitrag 1497616)
Zitat:

Zitat von fisipjm (Beitrag 1497585)
Es gibt manche Tabellen wo die Maske einen leicht abweichenden Aufbau zum Standard haben soll.

Heißt das, dass die Form eigentlich gleich ist und nur die Maske für die Tabelle anders ist? Klingt für mich nach einem sinnvollen Einsatz von Frames. Man nimmt immer die gleiche Form-Klasse und wählt für die Darstellung den passenden Frame aus.

Ja die Maske und die Aufrufe der Datenbank die darin stattfinden sind unterschiedlich. Aber warum brauch ich dafür TFrame? verschiebt das mein Problem nicht einfach nur eine Ebene Tiefer in die Maske rein?

Wenn ich das bisher richtig verstanden habe, dann verschiebst du das Problem zwar, aber an eine Stelle, wo du es verarbeiten kannst.
Du könntest dann einfach aus deinen Menüpunkten immer die selbe Formklasse verwenden und übergibst beim Create einen Parameter, auf den die Form reagieren kann. Je nach Parameter, wird der passende Frame genutzt.

fisipjm 16. Nov 2021 08:16

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
Zitat:

Zitat von Jasocul (Beitrag 1497620)
Wenn ich das bisher richtig verstanden habe, dann verschiebst du das Problem zwar, aber an eine Stelle, wo du es verarbeiten kannst.
Du könntest dann einfach aus deinen Menüpunkten immer die selbe Formklasse verwenden und übergibst beim Create einen Parameter, auf den die Form reagieren kann. Je nach Parameter, wird der passende Frame genutzt.

Wie mach ich dann den Aufruf mit einem Frame? Auch mein Frame müsste dann wieder eine Ableitung von einem "MainFrame" sein und die Ausreißer wären doch auch wieder seperate Ableitungen vom MainFrame. Damit weis ich doch dann in der Form wieder nicht wie ich an die richtige TFrame klasse komme, oder steh ich grad völlig auf dem Schlauch?

BerndS 16. Nov 2021 08:25

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
Hier ein einfaches Beispiel:
Delphi-Quellcode:
procedure TForm1.bt1Click(Sender: TObject);
var
  F: TPersistentClass;
  D:TForm;
begin
  F := FindClass('TForm2');
  if Assigned(F) then
  begin
    Application.CreateForm(TComponentClass(F) , D);
    D.Show;
  end;

end;

Jasocul 16. Nov 2021 08:35

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
Zitat:

Zitat von fisipjm (Beitrag 1497621)
Wie mach ich dann den Aufruf mit einem Frame? Auch mein Frame müsste dann wieder eine Ableitung von einem "MainFrame" sein und die Ausreißer wären doch auch wieder seperate Ableitungen vom MainFrame. Damit weis ich doch dann in der Form wieder nicht wie ich an die richtige TFrame klasse komme, oder steh ich grad völlig auf dem Schlauch?

An irgendeiner Stelle muss du doch wissen, mit welcher Maske die Tabelle dargestellt werden soll. Wenn du es beim Erstellen der Form weißt, kannst du das Create der Form überschreiben und einen zusätzlichen Parameter übergeben. Dann weiß die Form, welcher Frame beim Create eingebaut werden muss.

Wenn ich so darüber Nachdenke, sollte vielleicht erstmal geklärt werden, ab wann die Anwendung weiß, welche Maske erforderlich ist. Irgendwann muss irgendeine passende Information in der Anwendung ja vorhanden sein.

BerndS 16. Nov 2021 08:44

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
Ich habe noch eine Typenprüfung hinzugefügt:
Delphi-Quellcode:
uses
  System.TypInfo;
...

procedure TForm1.bt1Click(Sender: TObject);
var
  F: TPersistentClass;
  D:TForm;
begin
  F := FindClass('TForm2');
  if Assigned(F) and PTypeInfo(F.ClassInfo).TypeData^.ClassType.InheritsFrom(TCustomForm) then
    begin
      Application.CreateForm(TComponentClass(F) , D);
      D.Show;
    end;

end;

Uwe Raabe 16. Nov 2021 10:28

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
Zitat:

Zitat von fisipjm (Beitrag 1497610)
Also GetClass funktioniert, liefert mir aber logischerweise nur eine TPersistant zurück. Und ich scheitere daran aus dieser Tpersistant dann die Form zu createn. Ich befürchte ich hab da irgendwo noch eine riesen Wissenslücke :oops:

Unter der Annahme, dass TTolleNeueForm von TMainForm abgeleitet ist:
Delphi-Quellcode:
type
  TMainFormClass = class of TMainForm;

var
  MainFormClass: TMainFormClass;
  PersistentClass: TPersistentClass;
begin
  MainFormClass := TMainForm;
  PersistentClass := GetClass('TTolleNeueForm');
  if PersistentClass <> nil then
    MainFormClass := TMainFormClass(PersistentClass);

  myForm := MainFormClass.Create(Application);
end;

BerndS 16. Nov 2021 10:43

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
gelöscht

uligerhardt 16. Nov 2021 13:08

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1497630)
Unter der Annahme, dass TTolleNeueForm von TMainForm abgeleitet ist:
Delphi-Quellcode:
type
  TMainFormClass = class of TMainForm;

var
  MainFormClass: TMainFormClass;
  PersistentClass: TPersistentClass;
begin
  MainFormClass := TMainForm;
  PersistentClass := GetClass('TTolleNeueForm');
  if PersistentClass <> nil then
    MainFormClass := TMainFormClass(PersistentClass);

  myForm := MainFormClass.Create(Application);
end;

Als ein Sicherheitsfanatiker würde ich die Annahme prüfen:
Delphi-Quellcode:
  if Assigned(PersistentClass) then
  begin
    Assert(PersistentClass.InheritsFrom(TMainForm));
    MainFormClass := TMainFormClass(PersistentClass);
  end;

fisipjm 23. Nov 2021 15:33

AW: TForm Klasse dynamisch erstellen ja nachdem ob Klasse vorhanden ist
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1497630)
Zitat:

Zitat von fisipjm (Beitrag 1497610)
Also GetClass funktioniert, liefert mir aber logischerweise nur eine TPersistant zurück. Und ich scheitere daran aus dieser Tpersistant dann die Form zu createn. Ich befürchte ich hab da irgendwo noch eine riesen Wissenslücke :oops:

Unter der Annahme, dass TTolleNeueForm von TMainForm abgeleitet ist:
Delphi-Quellcode:
type
  TMainFormClass = class of TMainForm;

var
  MainFormClass: TMainFormClass;
  PersistentClass: TPersistentClass;
begin
  MainFormClass := TMainForm;
  PersistentClass := GetClass('TTolleNeueForm');
  if PersistentClass <> nil then
    MainFormClass := TMainFormClass(PersistentClass);

  myForm := MainFormClass.Create(Application);
end;

Tut genau was es soll. Vielen dank!:thumb::thumb:
Hab mich in den letzten Tagen mehr mit Klassen und insbesondere auch RTTI auseinander gesetzt. Wilkommen in einer neuen Abstraktionsebene :-D Mein Kopf raucht, aber auf eine gute weise :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 Uhr.
Seite 2 von 2     12   

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-2025 by Thomas Breitkreuz