Q&A

  • 런타임시 메인메뉴상에 메뉴붙이기(현재 실행중인 것)
델파이 4.x

윈98

MS_SQL 7.0





안녕하세요. 다 연말이라 바쁘시죠.

미리 새해인사부터~~~ Happy New Year!!!!!





한가지 궁금한 것이 있어서 여러분을 조언을 얻고자 합니다.

작업하다보면 창이 많이 생겨서 몇개의 폼이 겹치다 보면 이전의 화면을 보기가

힘들지 않습니까?



그래서 현재 실행중인 MDI CHILD 폼들을 읽어서 메인메뉴상에 뿌려주고

임시로 생긴 메뉴아이템을 클릭하면 해당 폼이 show 되도록 하고자 합니다.



실행중인 폼들은 Tscreen.Forms/CustomForms 가 있으니 금방 찾아서 붙였는데요..

"A"라는 폼을 지칭하는 메뉴가 두개가 되었지 않습니까?

기존의 메뉴에 붙은 메뉴아이템은 "A"폼을 가져오도록 미리 코딩되어 있지만..

실행중인 폼을 나타낸 메뉴아이템은 런타임시에 생성된 것이라

기존의 클릭이벤트를 못 가져와서 계속 궁리중입니다.



실현불가능한 방향인지.....

구현한 적이 있는 분들의 많은 도움을 바랍니다.





3  COMMENTS
  • Profile
    2002.01.01 03:31
    자세한 상황은 이해가 가지 않습니다만,

    RunTime에 생성된 menuItem Event를 잡아 낼 수만 있으면 될듯 하군요.

    예전에 저도 Runtime에 생성된 콘트롤을 어떻게 Event처리 할 수 있는지 궁금해 하다가,

    이 게시판의 최용일님도움을 받았지요.



    TestControl := TTestControl.Create(Self);

    TestControl.OnClick := TestControlClick;

    ...





    이와 같이 TestControlClick이라는 Event 핸들러를 만들어 놓고,

    RunTime에 생성된 콘트롤의 Event를 할당하면, 그 이벤트가 발생할 때

    미리 코딩해놓은 Event핸들러로 연결 시킬수 있습니다.



    Event 핸들러는 미리 작성하야야 한다는 것인데, MenuItem의 Caption등으로 비교해서

    충분히 가능하리라 생각합니다.







    초미소년 wrote:

    > 델파이 4.x

    > 윈98

    > MS_SQL 7.0

    >

    >

    > 안녕하세요. 다 연말이라 바쁘시죠.

    > 미리 새해인사부터~~~ Happy New Year!!!!!

    >

    >

    > 한가지 궁금한 것이 있어서 여러분을 조언을 얻고자 합니다.

    > 작업하다보면 창이 많이 생겨서 몇개의 폼이 겹치다 보면 이전의 화면을 보기가

    > 힘들지 않습니까?

    >

    > 그래서 현재 실행중인 MDI CHILD 폼들을 읽어서 메인메뉴상에 뿌려주고

    > 임시로 생긴 메뉴아이템을 클릭하면 해당 폼이 show 되도록 하고자 합니다.

    >

    > 실행중인 폼들은 Tscreen.Forms/CustomForms 가 있으니 금방 찾아서 붙였는데요..

    > "A"라는 폼을 지칭하는 메뉴가 두개가 되었지 않습니까?

    > 기존의 메뉴에 붙은 메뉴아이템은 "A"폼을 가져오도록 미리 코딩되어 있지만..

    > 실행중인 폼을 나타낸 메뉴아이템은 런타임시에 생성된 것이라

    > 기존의 클릭이벤트를 못 가져와서 계속 궁리중입니다.

    >

    > 실현불가능한 방향인지.....

    > 구현한 적이 있는 분들의 많은 도움을 바랍니다.

    >

    >

  • Profile
    초미소년 2002.01.02 20:25
    답변 감사합니다. 말씀해주신 방향이 제가 고심하고 있는 방향과 일치합니다.

    제가 궁금해 하는 점은

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

    메뉴1 메뉴2 메뉴3

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

    "A폼 메뉴아이템" "D폼 메뉴아이템" "런타임시 생성된 폼들

    "B폼 메뉴아이템" "E폼 메뉴아이템" 을 위한 메뉴"

    "C폼 메뉴아이템" "F폼 메뉴아이템"

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

    작업자가 어떤 폼을 가져다 쓸지 모릅니다.

    작업자가 'A'와'B'라는 폼을 불러다 쓰면 메뉴1상의 각각의 해당되는

    메뉴아이템 이벤트에 각 A,B 라는 폼을 만들고 보여주는 이벤트를 미리 입력하게

    됩니다.



    이것은 많은 분들이 사용하시는 부분이겠지요. 하지만

    메뉴 3 에서는 클릭하면 지금 작업자가 사용하는 폼인 'A'와'B'가 임시로

    나타나게 된다는 이야기입니다.



    ~~~~~

    var

    DisplayMenuItem: TMenuItem; //메뉴아이템

    I : integer;

    begin

    //기존에 만들어진 메뉴아이템 소멸

    ~~~~~~~~~



    //현재 실행중인 폼에 대한 메뉴아이템 새로 생성

    DisplayMenuItem := TMenuItem.Create(Self); //생성

    DisplayMenuItem.Caption := '-'; //구분

    N4.Add(DisplayMenuItem); //붙이기



    for I := 0 to Screen.FormCount-1 do //실행중인것만큼 생성,붙이기

    begin

    DisplayMenuItem := TMenuItem.Create(Self);

    DisplayMenuItem.Caption := Screen.Forms[I].Name; //혹은 캡션(작업이름)

    N4.Add(DisplayMenuItem);

    end;



    // 각 메뉴아이템에 맞는 이벤트 붙여주기....

    ~~~~~~~~~ <----// 이부분이 관건.



    과 같이 만들어 주는 것이 됩니다.

    그러나 어떤 메뉴가 생성될지 모르는 상태이기 때문에

    즉, 'A'와'B'에 대한 메뉴아이템이 생기는 순간에

    그것에 맞는 이벤트도 같이 생성해주어야 한다는 이야기입니다.



    대다수의 이벤트는 개발자들이 미리 코딩해놓은 대로 실행되지만(런타임 이전).

    위의 방법은 런타임된 후에 랜덤하게 일정한 규칙대로 이벤트를 생성해주어야

    한다는 것을 말씀드립니다.



    "A"이 폼이 생기면 "A"폼만 불러내는 이벤트가 임시로 생긴 메뉴아이템에

    붙고, "B"라는 폼이 생성되면 "B"폼만 불러내는 이벤트가 생성되어야 한다는 뜻입니다.

    또 "B" 폼이 죽고 "C" 폼이 생성되면

    [메뉴3]을 클릭을때, "A"와"C"폼에만 해당하는 메뉴아이템과 이벤트가

    생성되어야 한다는 뜻이구요...





    설명이 좀 장황했지만 의미는 제대로 전달되었을 것이라고 생각하면서..

    다시한번 많은 분들의 도움을 기다립니다.







    훈 wrote:

    > 자세한 상황은 이해가 가지 않습니다만,

    > RunTime에 생성된 menuItem Event를 잡아 낼 수만 있으면 될듯 하군요.

    > 예전에 저도 Runtime에 생성된 콘트롤을 어떻게 Event처리 할 수 있는지 궁금해 하다가,

    > 이 게시판의 최용일님도움을 받았지요.

    >

    > TestControl := TTestControl.Create(Self);

    > TestControl.OnClick := TestControlClick;

    > ...

    >

    >

    > 이와 같이 TestControlClick이라는 Event 핸들러를 만들어 놓고,

    > RunTime에 생성된 콘트롤의 Event를 할당하면, 그 이벤트가 발생할 때

    > 미리 코딩해놓은 Event핸들러로 연결 시킬수 있습니다.

    >

    > Event 핸들러는 미리 작성하야야 한다는 것인데, MenuItem의 Caption등으로 비교해서

    > 충분히 가능하리라 생각합니다.

    >

    >

    >

    > 초미소년 wrote:

    > > 델파이 4.x

    > > 윈98

    > > MS_SQL 7.0

    > >

    > >

    > > 안녕하세요. 다 연말이라 바쁘시죠.

    > > 미리 새해인사부터~~~ Happy New Year!!!!!

    > >

    > >

    > > 한가지 궁금한 것이 있어서 여러분을 조언을 얻고자 합니다.

    > > 작업하다보면 창이 많이 생겨서 몇개의 폼이 겹치다 보면 이전의 화면을 보기가

    > > 힘들지 않습니까?

    > >

    > > 그래서 현재 실행중인 MDI CHILD 폼들을 읽어서 메인메뉴상에 뿌려주고

    > > 임시로 생긴 메뉴아이템을 클릭하면 해당 폼이 show 되도록 하고자 합니다.

    > >

    > > 실행중인 폼들은 Tscreen.Forms/CustomForms 가 있으니 금방 찾아서 붙였는데요..

    > > "A"라는 폼을 지칭하는 메뉴가 두개가 되었지 않습니까?

    > > 기존의 메뉴에 붙은 메뉴아이템은 "A"폼을 가져오도록 미리 코딩되어 있지만..

    > > 실행중인 폼을 나타낸 메뉴아이템은 런타임시에 생성된 것이라

    > > 기존의 클릭이벤트를 못 가져와서 계속 궁리중입니다.

    > >

    > > 실현불가능한 방향인지.....

    > > 구현한 적이 있는 분들의 많은 도움을 바랍니다.

    > >

    > >

  • Profile
    2002.01.02 23:00
    먼저 메뉴아이템 추가시에, Event를 할당합니다.



    MenuItem.OnClick := MyClickMenuItem;



    이렇게 하면, 메뉴 아이템을 클릭할때마다 MyClickMenuItem이 실행됩니다.

    이제 MyClickMenuItem을 구현하면 되겠군요.



    MyClickMenuItem에서 해당하는 폼을 찾아서 불러오면 되겠는데,

    그 폼을 찾는 방법에는 여러가지가 있겠지요.



    먼저, 메뉴아이템의 Caption을 폼의 이름으로 하면 Caption을 이용하여 폼을 찾으면 될것이고, 아니면 TStringList를 사용해서 폼의 Caption을 메뉴아이템과 같은 순서대로 저장하여, 클릭한 메뉴아이템의 순서에 해당하는 TStringList에서 폼의 Caption을 찾아 불러오는 방법도 있을 수 있고요.



    전자의 경우로 구현한다면, Sender로 MenuItem이 넘어올 것이고, 폼의 Caption과 MenuItem의 Caption이 같을 것입니다.

    폼의 Caption을 알면 FindWindow로 폼을 찾고, SetForegroundWindow로 폼을 가져오면 됩니다.



    procedure TForm1.MyClickMenuItem(Sender: TObject);

    var

    winHandle: THandle;

    begin

    winHandle := Findwindow(nil, ExtractFormName(TMenuItem(Sender).Caption));//폼의 캡션과 메뉴아이템의 캡션이 같음

    if winHandle = nil then

    //폼을 찾을 수 없음. --> 이 루틴으로 들어온다면, 메뉴아이템을 잘못 작성한것이겠죠..

    else

    if not IsWindowVisible(winHandle) then

    ShowWindow(winHandle, SW_RESTORE);

    SetForegroundWindow(winHandle);

    end;



    이렇게 하면, 원하는 폼을 불러올 수 있을 것 같군요.

    ExtractFormName이라는 function 은 메뉴아이템의 Caption으로부터 Form Name을 추출하는 것입니다. 메뉴아이템의 Caption은 단축키를 나타내는 string(&A)이 포함되어 있으니까요. 그건 직접 구현하시고요.



    초미소년 wrote:

    > 답변 감사합니다. 말씀해주신 방향이 제가 고심하고 있는 방향과 일치합니다.

    > 제가 궁금해 하는 점은

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

    > 메뉴1 메뉴2 메뉴3

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

    > "A폼 메뉴아이템" "D폼 메뉴아이템" "런타임시 생성된 폼들

    > "B폼 메뉴아이템" "E폼 메뉴아이템" 을 위한 메뉴"

    > "C폼 메뉴아이템" "F폼 메뉴아이템"

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

    > 작업자가 어떤 폼을 가져다 쓸지 모릅니다.

    > 작업자가 'A'와'B'라는 폼을 불러다 쓰면 메뉴1상의 각각의 해당되는

    > 메뉴아이템 이벤트에 각 A,B 라는 폼을 만들고 보여주는 이벤트를 미리 입력하게

    > 됩니다.

    >

    > 이것은 많은 분들이 사용하시는 부분이겠지요. 하지만

    > 메뉴 3 에서는 클릭하면 지금 작업자가 사용하는 폼인 'A'와'B'가 임시로

    > 나타나게 된다는 이야기입니다.

    >

    > ~~~~~

    > var

    > DisplayMenuItem: TMenuItem; //메뉴아이템

    > I : integer;

    > begin

    > //기존에 만들어진 메뉴아이템 소멸

    > ~~~~~~~~~

    >

    > //현재 실행중인 폼에 대한 메뉴아이템 새로 생성

    > DisplayMenuItem := TMenuItem.Create(Self); //생성

    > DisplayMenuItem.Caption := '-'; //구분

    > N4.Add(DisplayMenuItem); //붙이기

    >

    > for I := 0 to Screen.FormCount-1 do //실행중인것만큼 생성,붙이기

    > begin

    > DisplayMenuItem := TMenuItem.Create(Self);

    > DisplayMenuItem.Caption := Screen.Forms[I].Name; //혹은 캡션(작업이름)

    > N4.Add(DisplayMenuItem);

    > end;

    >

    > // 각 메뉴아이템에 맞는 이벤트 붙여주기....

    > ~~~~~~~~~ <----// 이부분이 관건.

    >

    > 과 같이 만들어 주는 것이 됩니다.

    > 그러나 어떤 메뉴가 생성될지 모르는 상태이기 때문에

    > 즉, 'A'와'B'에 대한 메뉴아이템이 생기는 순간에

    > 그것에 맞는 이벤트도 같이 생성해주어야 한다는 이야기입니다.

    >

    > 대다수의 이벤트는 개발자들이 미리 코딩해놓은 대로 실행되지만(런타임 이전).

    > 위의 방법은 런타임된 후에 랜덤하게 일정한 규칙대로 이벤트를 생성해주어야

    > 한다는 것을 말씀드립니다.

    >

    > "A"이 폼이 생기면 "A"폼만 불러내는 이벤트가 임시로 생긴 메뉴아이템에

    > 붙고, "B"라는 폼이 생성되면 "B"폼만 불러내는 이벤트가 생성되어야 한다는 뜻입니다.

    > 또 "B" 폼이 죽고 "C" 폼이 생성되면

    > [메뉴3]을 클릭을때, "A"와"C"폼에만 해당하는 메뉴아이템과 이벤트가

    > 생성되어야 한다는 뜻이구요...

    >

    >

    > 설명이 좀 장황했지만 의미는 제대로 전달되었을 것이라고 생각하면서..

    > 다시한번 많은 분들의 도움을 기다립니다.

    >

    >

    >

    > 훈 wrote:

    > > 자세한 상황은 이해가 가지 않습니다만,

    > > RunTime에 생성된 menuItem Event를 잡아 낼 수만 있으면 될듯 하군요.

    > > 예전에 저도 Runtime에 생성된 콘트롤을 어떻게 Event처리 할 수 있는지 궁금해 하다가,

    > > 이 게시판의 최용일님도움을 받았지요.

    > >

    > > TestControl := TTestControl.Create(Self);

    > > TestControl.OnClick := TestControlClick;

    > > ...

    > >

    > >

    > > 이와 같이 TestControlClick이라는 Event 핸들러를 만들어 놓고,

    > > RunTime에 생성된 콘트롤의 Event를 할당하면, 그 이벤트가 발생할 때

    > > 미리 코딩해놓은 Event핸들러로 연결 시킬수 있습니다.

    > >

    > > Event 핸들러는 미리 작성하야야 한다는 것인데, MenuItem의 Caption등으로 비교해서

    > > 충분히 가능하리라 생각합니다.

    > >

    > >

    > >

    > > 초미소년 wrote:

    > > > 델파이 4.x

    > > > 윈98

    > > > MS_SQL 7.0

    > > >

    > > >

    > > > 안녕하세요. 다 연말이라 바쁘시죠.

    > > > 미리 새해인사부터~~~ Happy New Year!!!!!

    > > >

    > > >

    > > > 한가지 궁금한 것이 있어서 여러분을 조언을 얻고자 합니다.

    > > > 작업하다보면 창이 많이 생겨서 몇개의 폼이 겹치다 보면 이전의 화면을 보기가

    > > > 힘들지 않습니까?

    > > >

    > > > 그래서 현재 실행중인 MDI CHILD 폼들을 읽어서 메인메뉴상에 뿌려주고

    > > > 임시로 생긴 메뉴아이템을 클릭하면 해당 폼이 show 되도록 하고자 합니다.

    > > >

    > > > 실행중인 폼들은 Tscreen.Forms/CustomForms 가 있으니 금방 찾아서 붙였는데요..

    > > > "A"라는 폼을 지칭하는 메뉴가 두개가 되었지 않습니까?

    > > > 기존의 메뉴에 붙은 메뉴아이템은 "A"폼을 가져오도록 미리 코딩되어 있지만..

    > > > 실행중인 폼을 나타낸 메뉴아이템은 런타임시에 생성된 것이라

    > > > 기존의 클릭이벤트를 못 가져와서 계속 궁리중입니다.

    > > >

    > > > 실현불가능한 방향인지.....

    > > > 구현한 적이 있는 분들의 많은 도움을 바랍니다.

    > > >

    > > >