Delphi-PRAXiS

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 klasseninstanz finden (https://www.delphipraxis.net/70762-klasseninstanz-finden.html)

_frank_ 4. Jun 2006 11:46


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:
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;
Gruß Frank

3_of_8 4. Jun 2006 11:49

Re: klasseninstanz finden
 
Such mal nach Delphi-Referenz durchsuchenFindProperty oder so ähnlich...

_frank_ 4. Jun 2006 12:00

Re: klasseninstanz finden
 
find*-funktionen hab ich schon in der OH gesucht,
habe aber da keine nützlichen funktionen finden können.

Hawkeye219 4. Jun 2006 12:40

Re: klasseninstanz finden
 
Hallo Frank,

ohne Garantie:

Delphi-Quellcode:
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;
Gruß Hawkeye

_frank_ 5. Jun 2006 13:09

Re: klasseninstanz finden
 
wo ist die Funktion getObjectProp definiert?
habe mal rumgegoogelt, z.B. http://www.swissdelphicenter.ch/torr...de.php?id=1392 gefunden, aber da wird nur die typinfo eingebunden...in dieser hab ich aber diese Funktion nicht...aber diese scheint genau der Schlüssel zu sein.

Gruß Frank

Hawkeye219 5. Jun 2006 13:44

Re: klasseninstanz finden
 
Hallo Frank,

ich konnte den Code nur mit Delphi 6 testen. Vielleicht funktioniert diese Anpassung an Delphi 3:

Delphi-Quellcode:
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;
Gruß Hawkeye

_frank_ 6. Jun 2006 09:54

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:
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;
Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz