지난 시간에 올렸던 LoadComponentFromBinFile()함수에 새로 생성될 폼의 객체들을 등록하는 코드를 추가해 보겠습니다.
procedure LoadComponentFromBinFile(Component: TComponent; Const FileName: String);
var
MemStream : TMemoryStream;
i: Integer;
begin
if not Assigned(Component) then Exit;
if NOT FileExists(FileName) then Exit;
RegisterClass(TEdit);
RegisterClass(TButton);
try
MemStream := TMemoryStream.Create;
MemStream.LoadFromFile(FileName);
MemStream.Position := 0;
MemStream.ReadComponent(Component);
Application.InsertComponent(Component);
finally
FreeAndNil(MemStream);
end;
end;
이렇게 해야 하는데 스킨에 사용될 폼에 어떤 객체들이 있을지를 미리 예측할 수 없기 때문에
RegisterClass(TEdit);
RegisterClass(TButton);
이 코드를 자동으로 생성해 주어야 합니다.
이 일을 하기 위해 함수 하나를 더 만들어야 겠습니다.
procedure RegisterComponentFromBin(const BinFile: String);
Var
ClassList : TStringList;
Begin
ClassList := TStringList.Create;
GetClassListFromBinFile(BinFile, ClassList);
RegisterComponentFromList(ClassList);
FreeAndNil(ClassList);
End;
이렇게 만들어 주고
procedure LoadComponentFromBinFile(Component: TComponent; Const FileName: String);
var
MemStream : TMemoryStream;
i: Integer;
begin
if not Assigned(Component) then Exit;
if NOT FileExists(FileName) then Exit;
RegisterComponentFromBin(FileName);
try
MemStream := TMemoryStream.Create;
MemStream.LoadFromFile(FileName);
MemStream.Position := 0;
MemStream.ReadComponent(Component);
Application.InsertComponent(Component);
finally
FreeAndNil(MemStream);
end;
end;
이렇게 LoadComponentFromBinFile() 함수 안에 RegisterComponentFromBin()를 추가해 주면 되는데요.
RegisterComponentFromBin() 함수 안에서 사용되는
GetClassListFromBinFile() 함수와 RegisterComponentFromList()를 또 만들어야 겠습니다.
GetClassListFromBinFile()함수는 Bin파일 안에서 사용된 객체들이 어떤 것이 있는지를 검사하여 TStringList에 저장하는 함수구요.
TStringList에 저장된 객체들을 RegisterClass()로 등록해 주는 함수입니다.
다음 시간에는
GetClassListFromBinFile() 함수와 RegisterComponentFromList()를 보겠습니다.
|