Q&A

  • Dll로 만든 MDI Child 폼을 한번만 나타나게 하려면...?
MDI parent에서 특정 버튼을 눌러서 DLL로 만든 MDI Child를 실행시켰습니다.

그런데...버튼을 또 누르면 또 다시 MDI Child가 생성되네여...

Dll로 하기 전에는

FindComponent를 이용해서 해당 폼이 있으면 BringToFront하면 됐는데...

Dll로 하니 안되네여?

Cjild 폼이 있으면 그 폼을 맨 앞에 보여주고 아니면 생성할려고 합니다.

어찌 해결해야 하는지여?





3  COMMENTS
  • Profile
    지나가는사람 2001.10.19 22:58
    var

    GetDiskInfo:TGetDiskInfo;

    begin



    if SysLibHandle <> 0 then Exit; // SysLibHandle은 폼생성시 초기화



    StrPCopy(DLLName,Dir+'DLLSystemInfo.Dll'); //로드할 DLL화일이름

    //사용할 Dll을 메모리에 적재한다.

    try

    SysLibHandle:=LoadLibrary(DLLName); //DLL을 로드한다.

    if SysLibHandle = HINSTANCE_ERROR then //에러가 발생한면

    raise EDLLLoadError.Create('"SystemInfo.DLL"을 열수가 없습니다.');

    @GetDiskInfo:=GetProcAddress(SysLibHandle,'GetDiskInfo'); //GetDiskInfo함수의 메모리번지를 구한다.

    if @GetDiskInfo <> nil then GetDiskInfo(true)

    else

    raise EDLLLoadError.Create('"SystemInfo.DLL"을 볼수 없습니다. 에러:'+IntToStr(GetLastError));

    finally

    FreeLibrary(SysLibHandle); //DLL을 해제한다.

    end;

    SysLibHandle:=0;







    용이 wrote:

    > MDI parent에서 특정 버튼을 눌러서 DLL로 만든 MDI Child를 실행시켰습니다.

    > 그런데...버튼을 또 누르면 또 다시 MDI Child가 생성되네여...

    > Dll로 하기 전에는

    > FindComponent를 이용해서 해당 폼이 있으면 BringToFront하면 됐는데...

    > Dll로 하니 안되네여?

    > Cjild 폼이 있으면 그 폼을 맨 앞에 보여주고 아니면 생성할려고 합니다.

    > 어찌 해결해야 하는지여?

    >

    >

  • Profile
    지나는이 2001.10.19 09:22
    용이 wrote:

    > MDI parent에서 특정 버튼을 눌러서 DLL로 만든 MDI Child를 실행시켰습니다.

    > 그런데...버튼을 또 누르면 또 다시 MDI Child가 생성되네여...

    > Dll로 하기 전에는

    > FindComponent를 이용해서 해당 폼이 있으면 BringToFront하면 됐는데...

    > Dll로 하니 안되네여?

    > Cjild 폼이 있으면 그 폼을 맨 앞에 보여주고 아니면 생성할려고 합니다.

    > 어찌 해결해야 하는지여?

    >

    >



    array변수 혹은 포인터변수 하나 잡아서 dll call할때 그 폼을 인식할 수 있는

    내용을 저장해 두세요..(보통 저는 폼의 TAG에 제가 정한 값을 넣어두죠 그래서

    이 값을 사용해서 사용합니다) ==> 자료구조를 아신다면 쉽게 해결될 내용이죠..

    글구 dll 종료시는 메인폼에 메세지를 보내서 그변수에서 내용을 없애면 되겠죠.

    더 좋은 방법이 있을지는 모르겠습니다만,



    근데 왠만하면 dll보다는 메인폼에 넣어서 사용하시는게 어떠실지...



  • Profile
    정성훈 2001.10.19 22:12
    지나는이 wrote:

    > 용이 wrote:

    > > MDI parent에서 특정 버튼을 눌러서 DLL로 만든 MDI Child를 실행시켰습니다.

    > > 그런데...버튼을 또 누르면 또 다시 MDI Child가 생성되네여...

    > > Dll로 하기 전에는

    > > FindComponent를 이용해서 해당 폼이 있으면 BringToFront하면 됐는데...

    > > Dll로 하니 안되네여?

    > > Cjild 폼이 있으면 그 폼을 맨 앞에 보여주고 아니면 생성할려고 합니다.

    > > 어찌 해결해야 하는지여?

    > >

    > >

    >

    > array변수 혹은 포인터변수 하나 잡아서 dll call할때 그 폼을 인식할 수 있는

    > 내용을 저장해 두세요..(보통 저는 폼의 TAG에 제가 정한 값을 넣어두죠 그래서

    > 이 값을 사용해서 사용합니다) ==> 자료구조를 아신다면 쉽게 해결될 내용이죠..

    > 글구 dll 종료시는 메인폼에 메세지를 보내서 그변수에서 내용을 없애면 되겠죠.

    > 더 좋은 방법이 있을지는 모르겠습니다만,

    >

    > 근데 왠만하면 dll보다는 메인폼에 넣어서 사용하시는게 어떠실지...

    >



    안녕하세요

    음 저도 지나가는 이님이 말씀하신것처럼 dll 보다는 main폼 사용하시는게 좋을듯..

    펑션하나 올립니다.



    //form 이 존재하면 True 리턴

    //ResultMainFm 이라고 쓴 부분을 프로그램 메인폼이름으로 바꾸시면 됩니다.



    function NotExistWindow(Const sFormName: string): Boolean;

    var

    i: Integer;

    begin

    Result := False;



    for i := ResultMainFm.MDIChildCount-1 downto 0 do

    begin

    if UpperCase(ResultMainFm.MDIChildren[i].Name) = UpperCase(sFormName) then

    begin

    Result := True;

    Break;

    end;

    end;

    end;





    procedure TForm1.Button1Click(Sender: TObject);

    begin

    if Not NotExistWindow( 'F_ABCD' ) then F_ABCD := TF_ABCD.Create(Self);

    F_ABCD.Show;

    end;