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

델파이 팁&트릭
Delphi Programming Tip&Tricks
[364] 스킨을 이용하여 폼의 모양 바꾸기 - 6
첫눈 [hadugo] 188 읽음    2017-01-04 14:31
GetClassListFromString(SrcStrignList.Text, ClassList); 함수를 들여다 보겠습니다.

procedure GetClassListFromString(DFMString: String; ClassList: TStringList);
Var
  StringList : TStringList;
  Str : String;
  Posx : Integer;
  i : Integer;
Begin
  ClassList.Clear;

  StringList := TStringList.Create;
  StringList.Text := DFMString;

  for i := 0 to StringList.Count - 1 do
  Begin
    Str := StringList[I];         // ' Object Button1: TButton'

    IF Pos('OBJECT', UpperCase(Str)) = 0 Then Continue;

    Posx := Pos(':', Str);
    if Posx = 0 then Continue;

    Delete(Str, 1, PosX);         // ' TButton'
    Str := Trim(Str);             // 'TButton'

    if (Pos('TFORM', UpperCase(Str)) > 0) or (Pos('TFRM', UpperCase(Str)) > 0) then
    Begin
      Str := 'TForm';
    End;
    if (Pos('TFRAME', UpperCase(Str)) > 0) then
    Begin
      Str := 'TFrame';
    End;

    ClassList.Add(Str);
  End;

  FreeAndNil(StringList);

  StringListDuplicatesRemove(ClassList);
End;


소스코드 복잡하게 왜 GetClassListFromString()함수를 별도로 만들었냐는 불평을 하시는 분들이 계실것입니다.

위에 보시다 시피 함수가 조금 복잡하기 때문에 별도로 만들었습니다.


BIN파일을 텍스트로 변환하면 DFM파일과 같은 내용이 저장된다고 했죠?

이 파일을  TStringList에 다시 저장한 다음
한 줄씩 읽어가면서 스킨에서 사용된 객체들이 어떤 것이 있는지 검사하여
객체들을 타입을 ClassList라는 TStringList에 담는 것입니다.

이 함수에서 보시면 For ... Next 루프 안에서
IF Pos('OBJECT', UpperCase(Str)) = 0 Then Continue;
를 사용하여 OBJECT라는 글자가 들어있는 행을 찾습니다.

즉,
Object Button1: TButton
이런 형태의 행을 찾는 것이지요.

그리고 찾은 행에서 ':'문자 까지를 잘라내어
그 뒷 부분에 있는 'TButton'이라는 객체 이름을 ClassList에 한 줄씩 추가해 주는 내용인데요.

이때 같은 타입의 객체가 중복하여 저장되지 않게 하기 위해
  StringListDuplicatesRemove();
라는 함수를 별도로 만들었습니다.

이 함수의 내용은 다음과 같습니다.

procedure StringListDuplicatesRemove(const stringList : TStringList) ;
var
  buffer: TStringList;
  I: Integer;
begin
  stringList.Sort;
  buffer := TStringList.Create;
  try
    buffer.Sorted := True;
    buffer.Duplicates := dupIgnore;
    buffer.BeginUpdate;
    for I := 0 to stringList.Count - 1 do buffer.Add(stringList[I]) ;
    buffer.EndUpdate;
    stringList.Assign(buffer) ;
  finally
    FreeandNil(buffer) ;
  end;
end;



여기서 참고할 것은
    if (Pos('TFORM', UpperCase(Str)) > 0) or (Pos('TFRM', UpperCase(Str)) > 0) then
    Begin
      Str := 'TForm';
    End;
    if (Pos('TFRAME', UpperCase(Str)) > 0) then
    Begin
      Str := 'TFrame';
    End;


이 부분입니다.

즉, 폼을 생성할때
TForm1 또는 TFormMain 이런 식으로 폼 이름 앞에는 반드시 TForm을 붙여주거나
TFrm1 또는 TFrmMain 이런 식으로 폼 이름 앞에는 반드시 TFrm을 붙여주어야 합니다.

그리고 TFrame를 만들때는 프레임 타입을 반드시 TFrame를 붙여 선언해야 하구요.

이것을 지켜주지 않으면 정상적으로 작동되지 않습니다.

다음 시간에는 4번째 강좌에서 말씀 드렸던 RegisterComponentFromList() 함수를 알아보겠습니다.

+ -

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