Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[365] 스킨을 이용하여 폼의 모양 바꾸기 - 7
첫눈 [hadugo] 2435 읽음    2017-01-04 14:39
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;


다음 시간에 연재하겠습니다.

+ -

관련 글 리스트
365 스킨을 이용하여 폼의 모양 바꾸기 - 7 첫눈 2435 2017/01/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.