![]() |
Auf Methoden einer Form zugreifen die über TFormClass erzeug
Liste der Anhänge anzeigen (Anzahl: 1)
Hai,
ich "spiele" eben etas mit TFormClass. Meine Forms (TForm2 und TForm3) haben beide eine Methode .SetLabelText. Gibt es eine andere Möglichkeit auf diese von meiner Form1 zugreifen zu können als wie so:
Delphi-Quellcode:
Das Projekt hänge ich mal an.
procedure TForm1.Button1Click(Sender: TObject);
var newFormClass : TFormClass; newForm : TForm; begin Case (Sender AS TButton).Tag of 0 : newFormClass := TForm2; 1 : newFormClass := TForm3; end; newForm := newFormClass.Create(self); try if (newFormClass = TForm2) then begin (newForm as TForm2).SetLabelText('Form 2'); end else begin (newForm as TForm3).SetLabelText('Form 3'); end; // newForm.SetLabelText ('*blubb das geht nicht*'); newForm.ShowModal; finally FreeAndNil (newForm); end; end; |
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Zitat:
2.) die Methode wird dynamisch mit Hilfe von RTTI aufgerufen:
Delphi-Quellcode:
Alternativ kann man auch mit Interfaces arbeiten, da sich damit eine Art von Mehrfachvererbung erreichen lässt.
type
// alle SetLabelText Methoden müssen diese Signatur haben TMySpecialMethode = procedure(const data:string) of object; procedure CallMySpecialProc(comp: TComponent; const data:string); var m: TMySpecialMethode; begin TMethod(m).Data := comp; TMethod(m).Code := comp.MethodAddress('SetLabelText'); if( TMethod(m).Code <> nil )then begin m(data); // der Aufruf end else begin LogMsg('CallMySpecialProc - %s (%s) has no SetLabelText procedure',[comp.Name,comp.ClassName]); end; end; |
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Hallo Sharky,
erstelle ein Interface mit den benötigten Methoden, die Du von beiden voneinander unabhängigen Klassen erwartest und sprich die Exeplare über eben dieses an. EDIT: Namen geändert :oops: |
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Oder definiere eine Zwischenformularklasse:
Delphi-Quellcode:
und in deiner Funktion
type
TBaseForm = class(TForm) public procedure SetLabelText; virtual; abstract; end; TForm2 = class(TBaseForm) public procedure SetLabelText; override; end; TForm3 = class(TBaseForm) public procedure SetLabelText; override; end;
Delphi-Quellcode:
newForm: TBaseForm;
|
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Zitat:
dei Methode war nur ein Beispiel. Bei einem Propertie habe ich ja genau das selbe Problem. Ich werde mir deinen Vorschlag mal ansehen. Mit Interfaces habe ich noch nicht gearbeitet. Wäre also ein guter Grund mich damit zu beschäftigen :stupid: Zitat:
@Bernhard: Auch deinen Vorschlag werde ich mir ansehen. |
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Ich glaube, dass der Beste weg über den gemeinsamen Vorfahren ist, wobei die Variante über die RTTI natürlich nett ist ;) Wobei es Probleme gibt, wenn sich dort die Parameter ändern. Dann dürftest du mit AV beglückt werden, wenn du nicht dran denkst, die Aufrufe anzupassen. Auf den Prüfen, den Compiler, muss man da leider verzichten.
Interfaces ist auch ne nette Lösung, läuft aber auf das gleiche wie den gemeinsamen Vorfahren hinaus. |
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Zitat:
ich habe das jetzt mal versucht allerdings kommt in dieser Zeile:
Delphi-Quellcode:
die Meldung:
newForm := newFormClass.Create(Self);
Zitat:
|
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Dann definiere noch:
Delphi-Quellcode:
type
TBaseFormClass = class(TBaseForm); var newFormClass : TBaseFormClass; |
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Hallo Sharky,
vielleicht ist meine Ausführung etwas zu knapp gewesen. Die Lösung über RTTI ist fehlerträchtig, weil nicht Typsicher. Die Lösung mit der Vererbungshierarchie zwingt Dich zur Einhaltung einer Linie, die nicht unbedingt gewollt ist, wenn Du über Fabriken Exemplare von Klassen erzeugst, die von einander unabhängig sein können- wie in Deinem Beispiel. Der Ansatz über Typpürfungen ist deshalb unelegant, weil Du an jeder Stelle an der Du mit unterschiedlichen Klassen arbeitest über jede Klasse prüfen müsstest. Deshalb mein Vorschlag, Interfaces, hier zB:
Delphi-Quellcode:
zu verwenden und die Deklaration Deiner Formulare entsprechend zu erweitern
type
IMyInterface = Interface ['{70EA899F-F97B-4F8E-9C9E-1C3EF3718EE7}'] procedure SetLabelText(const AText: string); end;
Delphi-Quellcode:
der Code innerhalb des Buttons könnte dann so aussehen:
type
TForm2 = class(TForm, IMyInterface) protected procedure SetLabelText(const AText: string);
Delphi-Quellcode:
Vielleicht hilft Dir in diesem Zusammenhang auch das
[..]
newForm := newFormClass.Create(self); try //ohne Wissen der konkreten Klasse kann die Methode über //das Interface verwendet werden if newForm.GetInterface(IMyInterface, myRef) then myRef.SetLabelText('AText'); newForm.ShowModal; finally FreeAndNil (newForm); end; ![]() ![]() |
Re: Auf Methoden einer Form zugreifen die über TFormClass er
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Jetzt bekomme ich hier:
Delphi-Quellcode:
newFormClass := TForm2;
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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-2025 by Thomas Breitkreuz