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 [RTTI] Set-Typ setzen (https://www.delphipraxis.net/70756-%5Brtti%5D-set-typ-setzen.html)

_frank_ 4. Jun 2006 09:52


[RTTI] Set-Typ setzen
 
Hallo,
ich versuche einen set-typ anhand eines strings zu setzen...hier mal ein bisschen code:

Delphi-Quellcode:
function GetSetValue(setInfo:pTypeInfo;valueStr:string):Integer;
var ti:pTypeInfo;
    td:pTypedata;
    s:string;
    p:integer;
begin
  result:=0;
  ti:=nil;
  if assigned(setInfo) then
  begin
    td:=GetTypeData(setinfo);
    if assigned(td) then ti:=td.CompType^;
    if assigned(ti) then
    begin
      s:=copy(valueStr,2,length(ValueStr)-2);
      p:=pos(',',s);
      while p>0 do
      begin
        inc(result,getEnumValue(ti,copy(s,1,p-1)));
        delete(s,1,p);
        p:=pos(',',s);
      end;
      inc(result,getEnumValue(ti,copy(s,1,length(s))));
    end;
  end;
end;

procedure TForm_DFMMain.Button1Click(Sender: TObject);
var ti:pTypeInfo;
    pi:pPropInfo;
    val:integer;
begin
  ti:=FindTypeInfo(edit1.text);
  if ti.Kind=tkSet then
  begin
    val:=getsetValue(ti,edit2.text);
    showmessage(intToStr(val));
    ti:=findTypeInfo('TFont');
    pi:=getPropInfo(ti,'Style');
    if assigned(pi) then
      setOrdProp(button1,pi,val);
  end;
end;
das Problem besteht in der setOrdProp, die mir eine Zugriffsverletzung an den Kopf wirft, ich weis nur nicht warum.
Die FindTypeInfo-Funktion ist von Hagen Reddmann siehe hier

meine test-werte:
Delphi-Quellcode:
edit1.text:='TFontStyles';
edit2.text:='[fsBold,fsItalic,fsUnderline]';
Weis jemand eine Lösung?

Gruß Frank

_frank_ 4. Jun 2006 10:08

Re: [RTTI] Set-Typ setzen
 
hallo nochmal,
mir ist der Fehler nach 1h suchen (kurz nach dem Posting) schlagartig bewusst geworden...

Delphi-Quellcode:
setOrdProp(button1.font,pi,val);
muss es heißen, wen es interessiert...

Gruß Frank

_frank_ 4. Jun 2006 10:36

Re: [RTTI] Set-Typ setzen
 
hab noch einen Fehler gefunden (getenumvalue gibt bit-position zurück und nicht dessen int-wert):

Delphi-Quellcode:
function GetSetValue(setInfo:pTypeInfo;valueStr:string):Integer;
var ti:pTypeInfo;
    td:pTypedata;
    s,s2:string;
    p,v:integer;
begin
  result:=0;
  ti:=nil;
  if assigned(setInfo) then
  begin
    td:=GetTypeData(setinfo);
    if assigned(td) then ti:=td.CompType^;
    if assigned(ti) then
    begin
      s:=copy(valueStr,2,length(ValueStr)-2);
      p:=pos(',',s);
      while p>0 do
      begin
        s2:=copy(s,1,p-1);
        v:=getEnumValue(ti,s2);
        if v>-1 then
          result:=result or (1 shl v);
        delete(s,1,p);
        p:=pos(',',s);
      end;
      s2:=copy(s,1,length(s));
      v:=getEnumValue(ti,s2);
      if v>-1 then
        result:=result or (1 shl v);
    end;
  end;
end;
Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 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