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() 함수를 알아보겠습니다.