![]() |
[RTTI] Set-Typ setzen
Hallo,
ich versuche einen set-typ anhand eines strings zu setzen...hier mal ein bisschen code:
Delphi-Quellcode:
das Problem besteht in der setOrdProp, die mir eine Zugriffsverletzung an den Kopf wirft, ich weis nur nicht warum.
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; Die FindTypeInfo-Funktion ist von Hagen Reddmann siehe ![]() meine test-werte:
Delphi-Quellcode:
Weis jemand eine Lösung?
edit1.text:='TFontStyles';
edit2.text:='[fsBold,fsItalic,fsUnderline]'; Gruß Frank |
Re: [RTTI] Set-Typ setzen
hallo nochmal,
mir ist der Fehler nach 1h suchen (kurz nach dem Posting) schlagartig bewusst geworden...
Delphi-Quellcode:
muss es heißen, wen es interessiert...
setOrdProp(button1.font,pi,val);
Gruß Frank |
Re: [RTTI] Set-Typ setzen
hab noch einen Fehler gefunden (getenumvalue gibt bit-position zurück und nicht dessen int-wert):
Delphi-Quellcode:
Gruß Frank
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 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 by Thomas Breitkreuz