RegisterComponentFromList()함수를 알아보겠습니다.
앞에서 Skin에 사용될 객체들의 타입을 모두 ClassList라는 TStringList에 담았습니다.
ClassList에 담겨진 내용은
TForm
TEdit
TButton
이런 형태가 되어 있을 것입니다.
이 것을
RegisterClass(TForm);
RegisterClass(TEdit);
RegisterClass(TButton);
이렇게 하면 그만인데
여기서 문제가 하나 발생합니다.
RegisterClass함수의 인자를 보면 객체타입을 전달해야 합니다.
하지만 ClassList에 저장된 객체타입들은 전부 문자열이라는 것이지요.
다시 말해
RegisterClass('TForm');
이렇게는 사용할 수 없다는 것입니다.
그것을 해결하기 위한 함수가 바로
RegisterComponentFromList()
입니다.
함수를 보겠습니다.
procedure RegisterComponentFromList(const StringList: TStringList);
Var
AClass : TClass;
PersistanceClass : TPersistentClass;
i: Integer;
Begin
StringListDuplicatesRemove(StringList);
for i := 0 To StringList.Count - 1 do
begin
if StringList[I] = '' then Continue;
AClass := FindAnyClass(StringList[I]);
PersistanceClass := TPersistentClass(AClass);
if PersistanceClass = nil then Continue;
RegisterClass(PersistanceClass);
end;
End;
이렇게 만들었습니다.
'TForm'이라는 문자열을 FindAnyClass() 함수를 이용하여 TClass타입의 변수인 AClass에 담고
그것을 다시 TPersistentClass형으로 변환한 다음
RegisterClass(PersistanceClass); 함수를 이용하여 등록하는 것입니다.
FindAnyClass() 함수의 내용은 다음과 같습니다.
function FindAnyClass(const Name: string): TClass;
var
ctx: TRttiContext;
typ: TRttiType;
Typelist: TArray;
begin
Result := nil;
ctx := TRttiContext.Create;
Typelist := ctx.GetTypes;
for typ in Typelist do
begin
if typ.IsInstance and (EndsText(Name, typ.Name)) then
begin
Result := typ.AsInstance.MetaClassType;
break;
end;
end;
ctx.Free;
end;
다음 시간에 연재하겠습니다.
|