Q&A

  • DLL로 MDI Application을 만들수는 없을까요 ?
메인프로그램(SDI)에서 작업을 하다가 필요에 의해 DLL폼을 호출하였을경우,
이 DLL폼을 MDI형식으로 만들수는 없을까요 ?
메인폼으로 필요한 자료를 전달하려고 하는데 정보를 전달하는창이 MDI화면 이어야 하거든요.

팁에서인가 메인폼이 아닌걸 MDI메인으로 사용하는 방법이 나와있긴 하던데,
델파이6에서는 에러가 발생하네요.

아시는 고수님들 한수 부탁 드립니다.
2  COMMENTS
  • Profile
    구창민 2002.12.27 22:50
    안녕하세요~ 구창민입니다.

    아래 코드는 파워러브델파이에 기고 되었던 MDI 차일드 폼을

    DLL 로 사용하는 방법입니다만, 참고가 되셨음 좋겠군여

    그럼~ 즐거운 프로그래밍 하시길~


    Listing A. MDIForms.dpr

    library MDIForms;

    uses
    SysUtils,
    Classes,
    Forms,

    Windows,
    //MDI Child폼의 실제 unit

    ChildU in 'ChildU.pas' {ChildForm};

    var
    DLLApp : TApplication;

    procedure MyDLLProc(Reason: Integer);
    begin
    if Reason = DLL_PROCESS_DETACH then
      { DLL이 메모리에서 내려갈때}
      { 애플리케이션 포인터를 원위치 시킨다. }
      if Assigned(DllApp) then
        Application := DllApp;
    end;

    procedure ShowMDIChildForm(MainApp : TApplication);
    var
    Child : TChildForm;

    begin

    if not Assigned(DllApp) then
    begin

      DllApp := Application;
      Application := MainApp;
    end;
    Child := TChildForm.Create(Application.MainForm);
    Child.Show;
    end;

    exports ShowMDIChildForm;
    begin
    { DllApp 변수를 초기화 한다. }
    DllApp := nil;
    DLLProc := @MyDLLProc;
    end.



    Listing B. MDIForms.dpr

    unit MainAppU;

    interface

    uses

    Windows, Messages, SysUtils, Classes,
    Graphics, Controls, Forms, Dialogs, Menus;

    type
    TForm1 = class(TForm)
      MainMenu1: TMainMenu;
      Test1: TMenuItem;
      ShowMDIChild1: TMenuItem;
      N1: TMenuItem;
      Exit1: TMenuItem;
      procedure ShowMDIChild1Click(Sender: TObject);
      procedure Exit1Click(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;

    { Import from the DLL. }
    procedure ShowMDIChildForm(App : TApplication);

    external 'mdiforms.dll';

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    { Create a child form contained in the DLL. }
    procedure TForm1.ShowMDIChild1Click(Sender: TObject);
    begin
    //DLL함수 호출 부분
    ShowMDIChildForm(Application);
    end;

    procedure TForm1.Exit1Click(Sender: TObject);
    begin
    Close;
    end;

    end



  • Profile
    미니 2002.12.27 23:02
    답변주셔서 감사합니다.
    죄송하지만 제가 질문을 잘못한거 같군요 !
    제 말은 메인폼에서 호출할 DLL폼이 MDIChild가 아니라 MDImain 이란거지요 !

    그러니까
    SDI폼( Application.mainform ) 에서 MDIMain속성을 DLL을 호출하여 그 안에서 MDI Child를 Create 하고 필요에 따라서 Application.mainform에 자료를 전송하는 방식을 구현하기 원한것이었습니다.
    (기본적으로 델파이에서는 Main폼이 아닌것은 MDImain이 될수 없는걸로 알고있는데 이것을 코딩으로 할수 있는방법)

    죄송하지만 아시는 부분 있으시면 다시한번 부탁드려도 될까요 ?

    감사합니다.


    • 박성훈
      2003.01.16 22:12
      정확히는 모르지만요. 권한설정이 바뀌었거나 tcp/ip쪽에 이상이 생겼을 수 있습니다. mysql지우고 새...
    • 델사랑
    • 2002.12.28 07:40
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2002.12.28 23:49
      안녕하세요~ 구창민입니다. 제가 예전에 사용한 소규모 MDB 를 압축하고 복구했던 방법입니다. 참고...
    • 권민호
      2002.12.28 13:13
      ------------------------- ZipMaster라는 콤포넌트를 이용하면 됩니다.(자료실에 있지 않나?) 하지만 한...
    • 전덕성
    • 2002.12.28 05:59
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박성훈
      2003.01.16 22:14
      혹시 쿼리와 DBGrid붙여놓고 쿼리한 값으로 직접 입력을 하시나요? 그렇다면 쿼리컴포넌트의 RequestLiv...
    • 소울해커
      2002.12.28 08:53
      uses Buttons; ... private SpeedBtn: TSpeedButton; ... procedure TForm1.FormCreate(Se...
    • 최용일
      2002.12.28 22:31
      안녕하세요. 최용일입니다. DBGrid와 연결된 Query컴포넌트에서 필드추가하시고 그 필드의 OnSetText이...
    • 윤승환
      2002.12.28 08:33
      제생각에는 방법이 없는듯 한데요. 디비그리드는 쿼리 자체를 받는것이기 때문에 디비그리드 자체에서 ...
    • 윤승환
      2002.12.28 08:29
      이렇게 하심이 어떨까요...   str := StringGrid1.Cells[0,1];   i := pos('(주...
    • 소울해커
      2002.12.28 08:19
      TBV_SANGHO := StringReplace(SG_Gird.Cells[2,I],'(주)','',rfReplaceAll]);             ...
    • 김수경
      2002.12.28 19:30
      메모 내용을 보관한 *.dbt File이 없어서 열어 볼 수가 없습니다. 첨부해 주세요
    • 남충희
      2002.12.31 04:19
      var   wSt : WideString; begin   wSt := Edit1.Text;    &nb...
    • 권민호
      2002.12.28 13:24
      -------------------------------------------- 글쎄요 저같으면 대충 아래와 같이 해보겠습니다. var i,...
    • 도니
    • 2002.12.27 21:47
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2002.12.28 00:45
      혹시 예전의 질답게시판을 찾아보셨는지요? 위에 보면 초보자들이 처음시작을 하는데 필요한 상식이라고 ...
    • 도니
      2002.12.28 00:51
      그렇군요..거기도 한번 검색해 봐야겠네요.>^^;; 출력할때 마다 값이 증가한다는건요.. 프리뷰에서 미...
    • 임형호
      2002.12.28 01:26
      혹시 찾고 계신게 ForceNewPage 속성이 아니신지요..???
    • 열심히
      2002.12.27 22:48
      출력할떄마다 값이 증가하는 이유는.. 메모리 해제가 제대로 안됐던것 같네요... create(appli...
    • 2002.12.28 00:30
      혹시 BeforePrint라는 Event에서 값을 설정한게 아닙니까? BeforePrint는 Preview에서도 그리고 Print를 ...
    • 도니
      2002.12.28 00:13
      메모리 해제할 필요없이 출력한번하고난뒤에 초기화를 해주면 될꺼 같은데.. 어디서 해줘야하는지요.. ...
    • jangumma
      2002.12.28 05:12
      혹시 이걸 찾는 건 아닌지? TQRExpr의 속성 중 ResetAfterPrint를 True로 설정 하심이... TQRLabel을...
    • • • •
    • 최용일
      2002.12.27 22:34
      안녕하세요. 최용일입니다. 허~ 질문이 참 황당하네요... 뭐 아무런 설명도 없이 무작정 발신자 번호 표...
    • 미니
    • 2002.12.27 21:26
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2002.12.27 22:50
      안녕하세요~ 구창민입니다. 아래 코드는 파워러브델파이에 기고 되었던 MDI 차일드 폼을 DLL 로 사용...
    • 미니
      2002.12.27 23:02
      답변주셔서 감사합니다. 죄송하지만 제가 질문을 잘못한거 같군요 ! 제 말은 메인폼에서 호출할 DLL폼이 ...
    • 도니
    • 2002.12.27 21:08
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.12.27 22:37
      안녕하세요. 최용일입니다. if Dialog.Execute then begin   파일열기;   파일...
    • LuckyBoy
      2002.12.27 21:27
      MessageBox의 Help를 찾아보시면 답이 나와 있습니다.. 하시고 싶은 메세지를 띄울때.. 다음과 같이 해...
    • 도니
      2002.12.27 21:50
      또 메세지 박스가 아니라요.. 세이브다이얼로그에서...취소를 누르면.. 저 밑에 파일 저정하는 부분에서 ...
    • 구창민
      2002.12.27 22:08
      안녕하세요~ 구창민입니다 취소시에는 if SaveDialog.FileName = '' then 이렇게 비교하면 되겠죠. ...
    • 도니
      2002.12.27 22:28
    • 최용일
      2002.12.27 22:42
      안녕하세요. 최용일입니다. 좌표로 자식윈도우핸들구할때는 ChildWindowFromPoint 이 함수 쓰구요... ...
    • 초보짱..
    • 2002.12.27 15:35
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2002.12.27 23:29
      안녕하세요~ 구창민입니다. 아래 코드처럼,   try     ...  &...
    • 초보짱..
      2002.12.28 02:37
      --------------------- 님 감사합니다....^^ 그런데 그렇게 해보니 에러메세지스트링은 받을수 있는데 ...
    • goodlsw
    • 2002.12.27 10:57
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 엄화용
    • 2002.12.27 09:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 열심히
      2002.12.27 20:43
      조인이 하나만 걸린게 아니라 두번 걸렸다는 뜻인데요.. 이 세개의 테이블을 조인하면서 님이 원하시는 ...
    • Formas
    • 2002.12.27 07:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • DelChoBo
      2002.12.27 21:00
      아래와 같이 pchar()로 해보시길.. MessageBox(0,pchar(inttostr(100)),'test',MB_OK) 그럼..
    • DelChoBo
      2002.12.27 20:53
      pas에서와 동일합니다. uses에 해당 컴포넌트에 관련된 파일을 추가해 주시고, var 부분에 선언, Create ...