안녕하세요..
최용일씨가 팁에 올린걸 보고 해봤는데 잘 안되서요..
<<<컴포넌트 저장>>>
procedure TMainForm.Button1Click(Sender: TObject);
var
Stream: TFileStream;
ObjCount:Integer;
begin
Stream := TFileStream.Create('c:공유mycomponent.dat',fmCreate);
try
//WorkSpace위에 있는 컴포넌트가 5개라고 가정하고
for ObjCount := 0 to WorkSpace.ControlCount -1 do
begin
Stream.WriteComponent(WorkSpace.Controls[ObjCount]);
end;
finally
Stream.Free;
end;
end;
- 이렇게하면 mycomponent.dat 파일에 5개의 컴포넌트 정보가 저장이 됩니다
<<<파일에 저장된 컴포넌트 텍스트파일로 변환하기>>>
procedure TMainForm.Button2Click(Sender: TObject);
var
Stream1: TMemoryStream;
Stream2: TFileStream;
begin
Stream1 := TMemoryStream.Create;
Stream2 := TFilestream.Create('c:공유mycomponent.dat', fmOpenRead);
Stream1.Position := 0 ;
ObjectBinaryToText(Stream2, Stream1);
Stream1.SaveToFile('c:공유test1.txt');
Stream1.Free;
Stream2.Free;
end;
- 이렇게하면 test1.txt 파일에는 1개의 컴포넌트정보만 들어있거든요
뭐가 잘못된건지 봐주세요.
그리고 한가지 더
바이너리파일이든 텍스트파일이든 일딴 파일에 5개의 컴포넌트정보가 들어있잖아요
그것을 특정폼 위에 불러오고 싶거든요.
제가 허접인 관계로 자세한 예문과 설명 부탁드립니다.
좋은하루 보내세요. *^^*
첫번째 질문은 아래와 같은식으로 하시면 Text포멧으로 저장되구요...
procedure TfrmMain.JvButton1Click(Sender: TObject);
var
Stream: TFileStream;
BinStream, TxtStream: TMemoryStream;
ObjCount:Integer;
begin
Stream := TFileStream.Create('C:mycomponent.txt', fmCreate);
BinStream := TMemoryStream.Create;
TxtStream := TMemoryStream.Create;
try
BinStream.Position := 0;
for ObjCount := 0 to Panel1.ControlCount - 1 do
begin
BinStream.SetSize(0);
BinStream.WriteComponent(Panel1.Controls[ObjCount]);
BinStream.Position := 0;
ObjectBinaryToText(BinStream, TxtStream);
end;
Stream.WriteBuffer(TxtStream.Memory^, TxtStream.Size);
finally
Stream.Free;
BinStream.Free;
TxtStream.Free;
end;
end;
아래와 같은식으로 하시면 컴포넌트를 파일로 저장해가지고 언제든지 다시 불러올수 있습니다. 님 말씀처럼 Form1에 있는것을 저장해서 Form2에 불러올수 있죠...
procedure TfrmMain.JvButton2Click(Sender: TObject);
// Panel1에 있는 컴포넌트 저장하기
var
Stream: TFileStream;
Index, ObjCount:Integer;
begin
Stream := TFileStream.Create('G:mycomponent.txt', fmCreate);
try
ObjCount := Panel1.ControlCount;
Stream.Position := 0;
Stream.WriteBuffer(ObjCount, SizeOf(ObjCount));
for Index := 0 to ObjCount -1 do
Stream.WriteComponent(Panel1.Controls[Index]);
finally
Stream.Free;
end;
end;
// 파일로 저장된 컴포넌트를 Panel2에 넣기
procedure TfrmMain.JvButton3Click(Sender: TObject);
var
Stream: TFileStream;
Index, ObjCount:Integer;
Component: TComponent;
begin
// 컴포넌트를 불러올려면 그 클래스가 등록이 되어 있어야 합니다.
// 디자인타임에는 컴포넌트 팔레트에 있는 모든 컴포넌트들이 등록되어 있
// 지만, 런타임시에는 그렇지 못하기 때문에 수동으로 등록시켜주셔야 합
// 니다.
// RegisterClass나 RegisterClasses함수를 사용해서 저장된 컴포넌트클
// 래스를 등록시켜 주세요...
// 저는 판넬에 TButton만 사용해서 테스트했으므로 TButton만 등록시켰습
// 니다...
// 여러개 등록할때는 RegisterClasses함수를 쓰세요...
// RegisterClasses([TButton, TLabel, ...]);
RegisterClass(TButton);
// ...
Stream := TFileStream.Create('G:mycomponent.txt', fmOpenRead);
try
Stream.Position := 0;
Stream.ReadBuffer(ObjCount, SizeOf(ObjCount));
for Index := 0 to ObjCount do
begin
Component := Stream.ReadComponent(nil);
Panel2.InsertControl(TControl(Component));
end;
finally
Stream.Free;
end;
end;
^^ 항상 즐코하세요...