Q&A

  • [re] [질문]DFM화일로 폼만들기
답변감사합니다...
그런데..."OBJECT exceted on line 1" 에러 메세지가 뜨네요.
기존 DFM갖고 폼을 만들고 있는데..델파이에서 가능하가요?...
어렵네요..

>폼을 stream을 사용하여 TEXT로 저장을했읍니다..
>저장한 TEXT파일로 폼을 다시 만들 수 없나?...
>readcomponent를 사용하였으나 에러만 나고 안되네요?
>[저장]
><!--CodeS-->
>var
>    Stream2: TFileStream;
>    Stream1: TMemoryStream;
>    mFile : string;
>begin
>  try
>      Stream1 := TMemoryStream.Create;
>      mFile := ChangeFileExt(ExtractFilePath(ParamStr(0))+'map\test', '.dat');
>      Stream2 := TFileStream.Create(mFile,fmCreate);
>      try
>          Stream1.WriteComponent(Application.MainForm.ActiveMDIChild);
>          Stream1.position := 0;
>          ObjectBinaryToText(Stream1, Stream2);
>      finally
>          Stream1.Free;
>          Stream2.Free;
>      end;
>  except
>    on e : Exception do showmessage(e.Message);
>  end;
>end;
><!--CodeE-->
2  COMMENTS
  • Profile
    장성호 2009.08.27 03:01
    ObjectBinaryToText 로 저장하셨으면


    Text 파일을 다시 ObjectBinary로 바꾸셔야 하니

    ObjectTextToBinary 함수를 쓰셔서 바꾸시면 될듯 한데요.

    그럼..



  • Profile
    장성호 2009.08.27 04:18
    WriteComponent 로 저장한 정보를

    ReadComponent 로 읽어올수는 있습니다만..

    몇가지 문제가 생기네요...

    첫번째 주의할점

    ReadComponent할때 Component를 새로 생성합니다.

    그런데 Form에 이미 같은 이름의 Component가 있으면 안됩니다.
    Component 상태만 저장하고 읽어오는 것이 아니라 ReadComponent에서 파일의 내용대로 새로 객체를 생성하려고 하죠

    그러므로 반드시 폼위에 아무 Component가 없는 빈폼이어야 할것입니다.


    그리고 두번째
    A폼의 정보를 WriteComponent 로 저장하고
    그 정보를 그대로 B폼 (폼위에 아무 컨트롤도 없는 폼)에서 ReadComponent 하니 class가 등록되지 않았다고 그러네요..

    그래서 하나하나 RegisterClass로 등록해 줬습니다.

    또 세번째 주의할점은
    저장할때 폼위의 Compoment에 Event가 걸려있는게 있었다면
    똑같은 이름의 이벤트 핸들러 함수가 해당 Form에도 있어야 한다는 것입니다.

    --------------------------------------------------------------------------------------------------------------------------------------------

    이 기능은 동적으로 폼을 디자인할때 유용할듯 하네요
    * 빈 폼 class를 만들고 필요한 event나 property함수를 만든다음에
    * 폼에 Compoent나 Control을 올려서 디자인 합니다. / 이벤트 핸들러도 걸어주구요
    * 그런다음 Save시에 WriteComponent 로 저장하구요


    나중에 다시 읽어올때는
    * 빈폼 Class를 생성하구(Create) 하구
    * ReadComponent 하시면 될듯 하네요....


    요런 기능이 있는줄 몰랐는데.. 질문 덕에 알았습니다.
    다음에 언제 유용하게 쓸수 있을듯 하네요...

    그럼...