Q&A

  • MDI 폼을 Tag나 Name으로 생성시킬 수 있나여?
[질문] MDI 폼을 String name으로 생성시킬 수 있나여?

수고 하십니다요들.. 이문제는 여지껏 프로그램 하면서 해결하지 못한것 중 하납니다.

안돼는건지.. 아님.. 방법이 틀린건지.. 쩝..



Table의 내용에는 로그인 권한을 가진 사람들 마다의 메뉴 항목이 들어 있습니다.

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

UNIT_ID PROG_NAME

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

P10100 메뉴1

P10200 메뉴2

P10300 메뉴3

; ;



그리고 MDI Main 폼에 알맞게 나타냈습니다. 헌데.. 무엇보다 중요한 곳은 Click 이벤트가

발생하는 부분입니다.



클릭 이벤트 프로시져를 prcClick 이라고 했을 때,



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

현재 소스

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

if (Sender is TMenuItem) then

case TMenuItem(Sender).Tag of

10100 :

if (frmPA1010 = NIL) then

begin

frmPA1010 := TfrmPA1010.Create(Application);

frmPA1010.Tag := TMenuItem(Sender).Tag;

frmPA1010.sOperID := sOperID;

frmPA1010.sOperName := sOperName;

end

else

begin

funComboSet(cmbSelectWindow, frmPA1010.Name);

frmPA1010.BringToFront;

end;

;

; 등...................

위와 같이 Tag를 이용해서 메뉴항목의 수행을 했습니다. 그리고 MDI Child form들은

Auto-Create 되지 않습니다. 각 테그 마다..(메뉴항목 갯수)만큼 각기 다른 폼을 생성

시킵니다.



이렇게 하지 않고 한번에 돌리는 방법이 없을까요? Tag를 이용하던 아니면 Name을 이용해서

라도..

부탁합니다.. 매번마다.. 프로그램이 바뀔때 마다.. Table의 내용과 소스의 내용을 같이

바꿔야 하니.. 불편하군여..



3  COMMENTS
  • Profile
    soriso 2000.11.07 18:45
    김종일 wrote:

    > [질문] MDI 폼을 String name으로 생성시킬 수 있나여?

    > 수고 하십니다요들.. 이문제는 여지껏 프로그램 하면서 해결하지 못한것 중 하납니다.

    > 안돼는건지.. 아님.. 방법이 틀린건지.. 쩝..

    >

    > Table의 내용에는 로그인 권한을 가진 사람들 마다의 메뉴 항목이 들어 있습니다.

    > ----------------------------------------------------------------------------

    > UNIT_ID PROG_NAME

    > ----------------------------------------------------------------------------

    > P10100 메뉴1

    > P10200 메뉴2

    > P10300 메뉴3

    > ; ;

    >

    > 그리고 MDI Main 폼에 알맞게 나타냈습니다. 헌데.. 무엇보다 중요한 곳은 Click 이벤트가

    > 발생하는 부분입니다.

    >

    > 클릭 이벤트 프로시져를 prcClick 이라고 했을 때,

    >

    > ----------------------------------------------

    > 현재 소스

    > ----------------------------------------------

    > if (Sender is TMenuItem) then

    > case TMenuItem(Sender).Tag of

    > 10100 :

    > if (frmPA1010 = NIL) then

    > begin

    > frmPA1010 := TfrmPA1010.Create(Application);

    > frmPA1010.Tag := TMenuItem(Sender).Tag;

    > frmPA1010.sOperID := sOperID;

    > frmPA1010.sOperName := sOperName;

    > end

    > else

    > begin

    > funComboSet(cmbSelectWindow, frmPA1010.Name);

    > frmPA1010.BringToFront;

    > end;

    > ;

    > ; 등...................

    > 위와 같이 Tag를 이용해서 메뉴항목의 수행을 했습니다. 그리고 MDI Child form들은

    > Auto-Create 되지 않습니다. 각 테그 마다..(메뉴항목 갯수)만큼 각기 다른 폼을 생성

    > 시킵니다.

    >

    > 이렇게 하지 않고 한번에 돌리는 방법이 없을까요? Tag를 이용하던 아니면 Name을 이용해서

    > 라도..

    > 부탁합니다.. 매번마다.. 프로그램이 바뀔때 마다.. Table의 내용과 소스의 내용을 같이

    > 바꿔야 하니.. 불편하군여..

    >



    음 제가 지금하고 있는 방식과 어느정도 비슷한데 참고하세요.

    일단 두개의 프로시져를 만듭니다.



    예를 들자면





    procedure MenuClick(Sender: TObject); //동적으로 생성하고 메뉴를 클릭했을때 태운다.

    private

    { Private declarations }

    //위의 이벤트에서 호출하는 부분

    procedure ShowOrCreate(TFClass: TComponentClass; var Ref;Sender: TObject);

    public

    { Public declarations }

    end;

    일단 이렇게 선언을 하고 프로시져를 만듭니다.



    첫번째로 폼을 생성하는 프로시져를 만들고여.



    procedure TMAINform.ShowOrCreate(TFClass: TComponentClass; var Ref;Sender: TObject);

    var

    i : integer;

    begin

    //있으면 SHow만 하고 빠지기(iconized 되어 있으면 정상으로 키우고 Show)

    for i:= 0 to MDIChildCount-1 do

    begin

    if MDIChildren[i] is TFClass then

    begin

    if MDIChildren[i].WindowState = wsMinimized then

    MDIChildren[i].WindowState := wsMaximized;

    TControl(Ref).BringToFront;

    Exit;

    end;

    end;



    //없으면 create하기

    Application.CreateForm(TFClass, Ref);

    TForm(Ref).show;

    end;



    두번째로 메뉴를 클릭할때 태우는 프로시져를 만듭니다. 이것은 프로시져를 만든후

    메뉴아이템 클릭이벤트에서 강제로 태우게 해야합니다.



    procedure TMAINform.MenuClick(Sender: TObject);

    begin

    Case (Sender As TMenuItem).Tag of

    100 : ShowOrCreate(TfrmPA1010,frmPA1010, Sender);

    .

    .

    .

    401 : ShowOrCreate(TfrmPA2010,frmPA2010, Sender);

    end;

    end;



    질문한 것의 답변이 되었는지 모르겠지만, 검색해보면 비슷한 질문이 있으니 찾아보세요. 그럼 이만.



  • Profile
    김종일 2000.11.10 19:53
    soriso wrote:

    > 김종일 wrote:

    > > [질문] MDI 폼을 String name으로 생성시킬 수 있나여?

    > > 수고 하십니다요들.. 이문제는 여지껏 프로그램 하면서 해결하지 못한것 중 하납니다.

    > > 안돼는건지.. 아님.. 방법이 틀린건지.. 쩝..

    > >

    > > Table의 내용에는 로그인 권한을 가진 사람들 마다의 메뉴 항목이 들어 있습니다.

    > > ----------------------------------------------------------------------------

    > > UNIT_ID PROG_NAME

    > > ----------------------------------------------------------------------------

    > > P10100 메뉴1

    > > P10200 메뉴2

    > > P10300 메뉴3

    > > ; ;

    > >

    > > 그리고 MDI Main 폼에 알맞게 나타냈습니다. 헌데.. 무엇보다 중요한 곳은 Click 이벤트가

    > > 발생하는 부분입니다.

    > >

    > > 클릭 이벤트 프로시져를 prcClick 이라고 했을 때,

    > >

    > > ----------------------------------------------

    > > 현재 소스

    > > ----------------------------------------------

    > > if (Sender is TMenuItem) then

    > > case TMenuItem(Sender).Tag of

    > > 10100 :

    > > if (frmPA1010 = NIL) then

    > > begin

    > > frmPA1010 := TfrmPA1010.Create(Application);

    > > frmPA1010.Tag := TMenuItem(Sender).Tag;

    > > frmPA1010.sOperID := sOperID;

    > > frmPA1010.sOperName := sOperName;

    > > end

    > > else

    > > begin

    > > funComboSet(cmbSelectWindow, frmPA1010.Name);

    > > frmPA1010.BringToFront;

    > > end;

    > > ;

    > > ; 등...................

    > > 위와 같이 Tag를 이용해서 메뉴항목의 수행을 했습니다. 그리고 MDI Child form들은

    > > Auto-Create 되지 않습니다. 각 테그 마다..(메뉴항목 갯수)만큼 각기 다른 폼을 생성

    > > 시킵니다.

    > >

    > > 이렇게 하지 않고 한번에 돌리는 방법이 없을까요? Tag를 이용하던 아니면 Name을 이용해서

    > > 라도..

    > > 부탁합니다.. 매번마다.. 프로그램이 바뀔때 마다.. Table의 내용과 소스의 내용을 같이

    > > 바꿔야 하니.. 불편하군여..

    > >

    >

    > 음 제가 지금하고 있는 방식과 어느정도 비슷한데 참고하세요.

    > 일단 두개의 프로시져를 만듭니다.

    >

    > 예를 들자면

    >

    >

    > procedure MenuClick(Sender: TObject); //동적으로 생성하고 메뉴를 클릭했을때 태운다.

    > private

    > { Private declarations }

    > //위의 이벤트에서 호출하는 부분

    > procedure ShowOrCreate(TFClass: TComponentClass; var Ref;Sender: TObject);

    > public

    > { Public declarations }

    > end;

    > 일단 이렇게 선언을 하고 프로시져를 만듭니다.

    >

    > 첫번째로 폼을 생성하는 프로시져를 만들고여.

    >

    > procedure TMAINform.ShowOrCreate(TFClass: TComponentClass; var Ref;Sender: TObject);

    > var

    > i : integer;

    > begin

    > //있으면 SHow만 하고 빠지기(iconized 되어 있으면 정상으로 키우고 Show)

    > for i:= 0 to MDIChildCount-1 do

    > begin

    > if MDIChildren[i] is TFClass then

    > begin

    > if MDIChildren[i].WindowState = wsMinimized then

    > MDIChildren[i].WindowState := wsMaximized;

    > TControl(Ref).BringToFront;

    > Exit;

    > end;

    > end;

    >

    > //없으면 create하기

    > Application.CreateForm(TFClass, Ref);

    > TForm(Ref).show;

    > end;

    >

    > 두번째로 메뉴를 클릭할때 태우는 프로시져를 만듭니다. 이것은 프로시져를 만든후

    > 메뉴아이템 클릭이벤트에서 강제로 태우게 해야합니다.

    >

    > procedure TMAINform.MenuClick(Sender: TObject);

    > begin

    > Case (Sender As TMenuItem).Tag of

    > 100 : ShowOrCreate(TfrmPA1010,frmPA1010, Sender);

    > .

    > .

    > .

    > 401 : ShowOrCreate(TfrmPA2010,frmPA2010, Sender);

    > end;

    > end;

    >

    > 질문한 것의 답변이 되었는지 모르겠지만, 검색해보면 비슷한 질문이 있으니 찾아보세요. 그럼 이만.

    >



    제가 의문을 드리고는 ... 해결했습니다.

    갈켜 주신 방법은 제가 이미 써먹었던 방법이져.. TAG를 이용한...

    우선 참조로 제가 쓴 방법을 말해드리져..



    function funCreateChild( sClass : string):Boolean;



    procedure TfrmMain.prcExecMenu(Sender: TObject);



    를 만듭니다. 이것은 폼의 클레스명을 받아 폼을 생성시키는 루틴입니다.



    물론 Uses 구문에는 생성시킬 유니트명이 쓰여 있어야 겠져..



    uses P10100;

    ;

    ;

    {-----------------------------------------------------------------------------}

    function TfrmMain.funCreateChild( sClass : string):Boolean;

    var

    oMyFormClass : TFormClass;

    oWorkForm : TForm;

    HDL : THandle;

    begin

    Result := True;

    oMyFormClass := TFormClass(GetClass(sClass)); //클래스를 찾아온다



    if (oMyFormClass <> nil) then

    begin

    oWorkForm := oMyFormClass.Create(Application.MainForm);

    oWorkForm.Tag := TMenuItem(Sender).Tag;

    end

    else Result := False;

    end;

    {-----------------------------------------------------------------------------}



    // Menu Item Click Event

    procedure TfrmMain.prcExecMenu(Sender: TObject);

    var

    sFormName : String;

    begin

    if (Sender is TMenuItem) then

    begin

    sFormName := 'Tfrm' + TMenuItem(Sender).Name;

    funCreateChild(Sender, sFormName);

    end;

    end;



    그리고는 연결할 각 폼의 end. 바로 위에 다음과 같이 클래스명을 등록하면 끝~~~!



    initialization RegisterClasses([TfrmP10100]);





  • Profile
    천명 2000.11.08 19:51
    혹시 도움이 될지는 모르겠지만 저도 MDI폼에 대한 동적 생성때문에 무척이나 고민 한적이 있어서 님의 심정을 조금 이해할거 같은데..^^;

    MDI관련 자료가 델파이 강의실쪽에 보면 MDI관련 내역을 정리해놓은게 있는데..(델파이코리아사이튼지 이 사이트인지는 기억안남) 그걸 보시면 많이 도움이 될겁니다. 저도 그걸 보고 MDI폼을 동적 생성 처리했습니다..(그분께 무지 캄사하고 있슴다)... 도움이 되었으면 좋겠네요... 그럼 이만

    soriso wrote:

    > 김종일 wrote:

    > > [질문] MDI 폼을 String name으로 생성시킬 수 있나여?

    > > 수고 하십니다요들.. 이문제는 여지껏 프로그램 하면서 해결하지 못한것 중 하납니다.

    > > 안돼는건지.. 아님.. 방법이 틀린건지.. 쩝..

    > >

    > > Table의 내용에는 로그인 권한을 가진 사람들 마다의 메뉴 항목이 들어 있습니다.

    > > ----------------------------------------------------------------------------

    > > UNIT_ID PROG_NAME

    > > ----------------------------------------------------------------------------

    > > P10100 메뉴1

    > > P10200 메뉴2

    > > P10300 메뉴3

    > > ; ;

    > >

    > > 그리고 MDI Main 폼에 알맞게 나타냈습니다. 헌데.. 무엇보다 중요한 곳은 Click 이벤트가

    > > 발생하는 부분입니다.

    > >

    > > 클릭 이벤트 프로시져를 prcClick 이라고 했을 때,

    > >

    > > ----------------------------------------------

    > > 현재 소스

    > > ----------------------------------------------

    > > if (Sender is TMenuItem) then

    > > case TMenuItem(Sender).Tag of

    > > 10100 :

    > > if (frmPA1010 = NIL) then

    > > begin

    > > frmPA1010 := TfrmPA1010.Create(Application);

    > > frmPA1010.Tag := TMenuItem(Sender).Tag;

    > > frmPA1010.sOperID := sOperID;

    > > frmPA1010.sOperName := sOperName;

    > > end

    > > else

    > > begin

    > > funComboSet(cmbSelectWindow, frmPA1010.Name);

    > > frmPA1010.BringToFront;

    > > end;

    > > ;

    > > ; 등...................

    > > 위와 같이 Tag를 이용해서 메뉴항목의 수행을 했습니다. 그리고 MDI Child form들은

    > > Auto-Create 되지 않습니다. 각 테그 마다..(메뉴항목 갯수)만큼 각기 다른 폼을 생성

    > > 시킵니다.

    > >

    > > 이렇게 하지 않고 한번에 돌리는 방법이 없을까요? Tag를 이용하던 아니면 Name을 이용해서

    > > 라도..

    > > 부탁합니다.. 매번마다.. 프로그램이 바뀔때 마다.. Table의 내용과 소스의 내용을 같이

    > > 바꿔야 하니.. 불편하군여..

    > >

    >

    > 음 제가 지금하고 있는 방식과 어느정도 비슷한데 참고하세요.

    > 일단 두개의 프로시져를 만듭니다.

    >

    > 예를 들자면

    >

    >

    > procedure MenuClick(Sender: TObject); //동적으로 생성하고 메뉴를 클릭했을때 태운다.

    > private

    > { Private declarations }

    > //위의 이벤트에서 호출하는 부분

    > procedure ShowOrCreate(TFClass: TComponentClass; var Ref;Sender: TObject);

    > public

    > { Public declarations }

    > end;

    > 일단 이렇게 선언을 하고 프로시져를 만듭니다.

    >

    > 첫번째로 폼을 생성하는 프로시져를 만들고여.

    >

    > procedure TMAINform.ShowOrCreate(TFClass: TComponentClass; var Ref;Sender: TObject);

    > var

    > i : integer;

    > begin

    > //있으면 SHow만 하고 빠지기(iconized 되어 있으면 정상으로 키우고 Show)

    > for i:= 0 to MDIChildCount-1 do

    > begin

    > if MDIChildren[i] is TFClass then

    > begin

    > if MDIChildren[i].WindowState = wsMinimized then

    > MDIChildren[i].WindowState := wsMaximized;

    > TControl(Ref).BringToFront;

    > Exit;

    > end;

    > end;

    >

    > //없으면 create하기

    > Application.CreateForm(TFClass, Ref);

    > TForm(Ref).show;

    > end;

    >

    > 두번째로 메뉴를 클릭할때 태우는 프로시져를 만듭니다. 이것은 프로시져를 만든후

    > 메뉴아이템 클릭이벤트에서 강제로 태우게 해야합니다.

    >

    > procedure TMAINform.MenuClick(Sender: TObject);

    > begin

    > Case (Sender As TMenuItem).Tag of

    > 100 : ShowOrCreate(TfrmPA1010,frmPA1010, Sender);

    > .

    > .

    > .

    > 401 : ShowOrCreate(TfrmPA2010,frmPA2010, Sender);

    > end;

    > end;

    >

    > 질문한 것의 답변이 되었는지 모르겠지만, 검색해보면 비슷한 질문이 있으니 찾아보세요. 그럼 이만.

    >