![]() |
Typecast ohne Typ zu kennen?
Hallo,
ich habe wieder mal vor, die Delphi-Language ein bisschen zu vergewaltigen. Und zwar will ich diesmal einen Typecast durchführen, ohne den Typ zu kennen auf den ich caste :mrgreen: Aber ein paar Erklärungen: es geht um die Set-Routine eines Language-Systems, dem ich nur einen Eintrag sowie eine Komponente als TComponent übergebe. Der Eintrag enthält die Caption und einen evtl. Hint für die Komponente in der jeweiligen Sprache, sowie zwei Booleans die abspeichern, ob die Komponente eine Caption bzw. einen Hint erhalten soll. Nun zu meinem Problem: Ich kann nicht davon ausgehn, dass ich alle Komponenten erfassen kann, und ich muss ja auf etwas casten. Jetzt dachte ich mir "ok, Caption ist in TControl deklariert, caste nach TControl und fertig is", aber ich hab die Rechnung wohl ohne Borlands geile Strategie gemacht, erstmal alles als protected zu deklarieren :wall: Was heißt das? Ja, dass erst TButton die property "Caption" als published deklariert, und man vorher keine Chance hat, drauf zuzugreifen. Lange Rede kurzer Sinn: wie kann ich anhand von ClassName oder ClassType casten? Ich hab im Moment solche Konstrukte:
Delphi-Quellcode:
Kennt jemand einen anderen Weg? Ich lauf hier gegen eine Wand.
if Comp.ClassName = 'TButton' then
begin TButton(Comp).Caption := ''; TButton(Comp).Caption := ''; end else if Comp.ClassName = //und so weiter Greetz alcaeus PS: Den ClassName habe ich verwendet, da ich Probleme hatte, den ClassType auszulesen, wenn das Form aus einer DLL kommt (ja, da wären wir wieder bei meinem Standardproblem der letzten 2 Monate :wall:) |
Re: Typecast ohne Typ zu kennen?
Hast Du dir schon mal die Funktionen in der Unit TypeInfo.pas angesehen. Z.B. GetPropInfo, SetStrProp und ähnliche.
Damit kannst Du auch auf Nicht-Published-Properties zugreifen. |
Re: Typecast ohne Typ zu kennen?
Zitat:
Delphi-Quellcode:
type
TMyControl = class(TControl) published property Caption; end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin TMyControl(Sender).Caption := 'Hello World!'; end;
Delphi-Quellcode:
procedure TForm1.Label1Click(Sender: TObject);
begin TMyControl(Sender).Caption := 'Hello World!'; end; |
Re: Typecast ohne Typ zu kennen?
und das funktioniert? auch wenn TButton gar nicht von TMyControl abstammt?
|
Re: Typecast ohne Typ zu kennen?
Zitat:
@Bernhard: könntest du bitte das mit GetPropInfo bei Gelegenheit näher erläutern? Ich blick da noch nicht ganz durch. Der andere Weg funktioniert aber schon mal ;) Greetz alcaeus |
Re: Typecast ohne Typ zu kennen?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const S_CAPTION = 'Caption'; var Count: Integer; PropList: PPropList; I: Integer; begin Count := GetPropList(Sender, PropList); if Count > 0 then begin for I := 0 to Count - 1 do if PropList[I].Name = S_CAPTION then if PropList[I].PropType^.Kind = tkLString then begin SetStrProp(Sender, S_CAPTION, 'Hello World!'); Break; end; FreeMem(PropList); end; end; |
Re: Typecast ohne Typ zu kennen?
Hi,
hier eine etwas kürzere Variante:
Delphi-Quellcode:
mfG
// uses TypInfo;
procedure TForm1.Button1Click(Sender: TObject); begin if IsPublishedProp(Sender, 'Caption') then SetStrProp(Sender, 'Caption', 'Hello World'); end; mirage228 |
Re: Typecast ohne Typ zu kennen?
Hallo ihr,
danke fuer eure Tipps. Ich werde mir alles in den naechsten Tagen ansehn, und evtl. weiterfragen. Bis dahin kann ich ja sagen, dass ich noch was gefunden habe, was so ziemlich das ist was ich will: ![]() Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 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