2009. március 29., vasárnap
How to change property values (RTTI)
Problem/Question/Abstract:
I use setpropvalue() function to set property values. It works fine if I set properties that are on first level (i.e.. button1.caption, button1.name,..), but it fails if I want to set properties like button1.font.name or radiogroup.items.text.
Answer:
function GetProperty(AControl: TPersistent; AProperty: string): PPropInfo;
var
i: Integer;
props: PPropList;
typeData: PTypeData;
begin
Result := nil;
if (AControl = nil) or (AControl.ClassInfo = nil) then
Exit;
typeData := GetTypeData(AControl.ClassInfo);
if (typeData = nil) or (typeData^.PropCount = 0) then
Exit;
GetMem(props, typeData^.PropCount * SizeOf(Pointer));
try
GetPropInfos(AControl.ClassInfo, props);
for i := 0 to typeData^.PropCount - 1 do
begin
with Props^[i]^ do
if (Name = AProperty) then
result := Props^[i];
end;
finally
FreeMem(props);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
propInfo: PPropInfo;
begin
PropInfo := GetProperty(Button1.Font, 'Name');
if PropInfo <> nil then
SetStrProp(Button1.Font, PropInfo, 'Arial');
end;
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése