Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Klassennamen von Designtime-Komponenten herausfinden


ml-kuen - Mi 19.09.12 02:37
Titel: Klassennamen von Designtime-Komponenten herausfinden
Hallo Leute!

probier schon zwei Abende lang den Klassennamen einer zur Designtime hinzugefügten aber nicht automatisch erzeugten Form (Projekt - Optionen - Verfügbare Formulare) herauszufinden. Hat schon mal funktioniert aber irgendwann nicht mehr. Ich vermute, dass das registrieren im Implementationsabschnitt nicht zuverlässig funktioniert. Und die Registrierung ist Voraussetzung um das Formular zur Laufzeit erzeugen zu können. Hab rausgefunden dass man dies im Initialisazion-Abschnitt machen muss. Folgendes funktioniert also, löst aber mein problem nicht, da ich ja den Namen finden will.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

VAR
  Form1: TForm1;
  aClass: TPersistentClass;
  Fenster: TForm;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//  RegisterClasses([TForm2]);
  aClass := TPersistentClass(GetClass('TForm2'));
  showMessage(aClass.ClassName);
  Fenster := TComponentClass(AClass).Create(Application.MainForm) as TForm;
  Fenster.Show;
end;

initialization
  RegisterClasses([TForm2]);
end.


Das obere RegisterClasses funktioniert zwar hier auch noch, aber wenn die Sache komplexer wird hagelt es nur noch Exceptions. Ich vermute, dass es nicht möglich sein wird, da bis zum Initialization-Abschnitt noch nicht viel passiert ist.

Aber - wenn doch jemand einen Tipp hätte?

Gruß
Michael


bummi - Mi 19.09.12 08:00


Delphi-Quelltext
1:
  Showmessage(GetClass('TForm2').ClassName);                    


jaenicke - Mi 19.09.12 09:29

Wenn die Klasse nirgends im Quelltext verwendet wird, wird die auch nicht mit einkompiliert bzw. gelinkt. Und dann kannst du dich auf den Kopf stellen, aber zu nicht in der Exe vorhandenen Daten bekommst du keinen Klassennamen. ;-)


ml-kuen - Mi 19.09.12 13:15

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn die Klasse nirgends im Quelltext verwendet wird, wird die auch nicht mit einkompiliert bzw. gelinkt. Und dann kannst du dich auf den Kopf stellen, aber zu nicht in der Exe vorhandenen Daten bekommst du keinen Klassennamen. ;-)


Dachte mir schon so etwas in der Art. Aber was müsste eine VCL-Komponente zur Designtime machen, um die Formulare zurückzugeben? Schließlich werden diese in Delphi ja auch dargestellt. Da gibts doch auch diese in einer VCL-Komponente integrierten Editoren und so weiter, mit denen man zur Designtime schon bestimmte Sachen machen kann. Komme gerade nicht auf den Namen derartiger Erweiterungen.

Michael


jaenicke - Mi 19.09.12 13:42

Zur Designzeit musst du die OpenTools-API nutzen. Damit kommst du an viele Sachen in der IDE heran, vorausgesetzt du nutzt eine einigermaßen aktuelle Delphiversion (früher war das relativ eingeschränkt).

Das hat allerdings nichts mit deinem eingangs geposteten Quelltext zu tun.

Ob es einen Zugang zu den im Projekt vorhandenen Formularen gibt, weiß ich nicht, aber das könntest du aus dem Projektquelltext herausparsen. Der stand bei älteren Delphiversionen in geschweiften Klammern hinter der Zeile mit der eingebundenen Unit, bei aktuellen findet man das wohl auch über die .dproj Datei besser.


ml-kuen - Mi 19.09.12 13:54

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Dann werde ich mal noch ein bischen forschen. Hab leider die schon etwas betagte Version 7 am Laufen. Aber Danke für den Tipp!

Michael

Moderiert von user profile iconNarses: Doppelpostings entfernt.