Q&A

  • 컴포넌트 파일로 저장하고 불러오기..
안녕하세요..
최용일씨가 팁에 올린걸 보고 해봤는데 잘 안되서요..

<<<컴포넌트 저장>>>
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개의 컴포넌트정보가 들어있잖아요
그것을 특정폼 위에 불러오고 싶거든요.

제가 허접인 관계로 자세한 예문과 설명 부탁드립니다.

좋은하루 보내세요. *^^*
1  COMMENTS
  • Profile
    최용일 2002.12.13 23:15
    안녕하세요. 최용일입니다.

    첫번째 질문은 아래와 같은식으로 하시면 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;

    ^^ 항상 즐코하세요...