![]() |
klasseninstanz finden
ich versuche eine Funktion zu schreiben, die mir die Objektreferenz aus einem string zurückgibt.
z.B. möchte ich aus 'Button1.font' => Button1.font haben ich hoffe, ich habe mich verständlich ausgedrückt...ich suche sowas ähnliches wie findcomponent, nur für unterklassen. in meinem Beispiel wird diese Funktion subclass ( Zeile 14,18 ) genannt.
Delphi-Quellcode:
Gruß Frank
function getSubInstance(form:TForm;comp:string):TObject;
var s:string; p:integer; begin result:=nil; p:=pos('.',comp); if p>0 then begin result:=form.FindComponent(copy(comp,1,p-1)); delete(comp,1,p); p:=pos('.',comp); while p>0 do begin //result:=result.subclass(copy(comp,1,p-1)); delete(comp,1,p); p:=pos('.',comp); end; //result:=result.subclass(copy(comp,1,length(comp))); end else result:=form.FindComponent(comp); end; |
Re: klasseninstanz finden
Such mal nach
![]() |
Re: klasseninstanz finden
find*-funktionen hab ich schon in der OH gesucht,
habe aber da keine nützlichen funktionen finden können. |
Re: klasseninstanz finden
Hallo Frank,
ohne Garantie:
Delphi-Quellcode:
Gruß Hawkeye
function getSubInstance (aRoot: TComponent; const aName: string): TObject;
var ii : Integer; SL : TStrings; begin SL := TStringList.Create; SL.Delimiter := '.'; SL.DelimitedText := aName; if (SL.Count = 0) then Result := nil else begin Result := aRoot.FindComponent(SL[0]); ii := 1; while (Assigned(Result) and (ii < SL.Count)) do if (GetPropInfo(Result, SL[ii], [tkClass]) = nil) then Result := nil else begin Result := GetObjectProp(Result, SL[ii]); Inc (ii); end; end; SL.Free; end; |
Re: klasseninstanz finden
wo ist die Funktion getObjectProp definiert?
habe mal rumgegoogelt, z.B. ![]() Gruß Frank |
Re: klasseninstanz finden
Hallo Frank,
ich konnte den Code nur mit Delphi 6 testen. Vielleicht funktioniert diese Anpassung an Delphi 3:
Delphi-Quellcode:
Gruß Hawkeye
function getSubInstance (aRoot: TComponent; const aName: string): TObject;
var ii : Integer; SL : TStrings; Info : PPropInfo; begin SL := TStringList.Create; SL.Delimiter := '.'; SL.DelimitedText := aName; if (SL.Count = 0) then Result := nil else begin Result := aRoot.FindComponent(SL[0]); ii := 1; while (Assigned(Result) and (ii < SL.Count)) do begin Info := GetPropInfo(Result, SL[ii]); if ((Info = nil) or (Info.PropType^.Kind <> tkClass)) then Result := nil else begin Result := TObject(GetOrdProp(Result, Info)); Inc (ii); end; end; end; SL.Free; end; |
Re: klasseninstanz finden
Danke,
ich musste zwar noch kleine Änderungen machen, aber das eigentliche Problem hast du gelöst...danke. Hier für diejenigen, die es interessiert, der geänderte Code:
Delphi-Quellcode:
Gruß Frank
function getSubInstance (aRoot: TComponent; aName: string): TObject;
var ii,p : Integer; SL : TStringlist; Info : PPropInfo; begin SL := TStringList.Create; p:=pos('.',aName); while p>0 do begin sl.add(copy(aname,1,p-1)); delete(aname,1,p); p:=pos('.',aName); end; sl.add(aName); if (SL.Count = 0) then Result := nil else begin Result := aRoot.FindComponent(SL[0]); ii := 1; while (Assigned(Result) and (ii < SL.Count)) do begin Info := GetPropInfo(Result.classinfo, SL[ii]); if ((Info = nil) or (Info.PropType^.Kind <> tkClass)) then Result := nil else begin Result := TObject(GetOrdProp(Result, Info)); Inc (ii); end; end; end; SL.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin TFont(getsubinstance(self,'button1.font')).Style:=[fsBold,fsitalic]; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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