[질문] 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의 내용과 소스의 내용을 같이
바꿔야 하니.. 불편하군여..
> [질문] 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;
질문한 것의 답변이 되었는지 모르겠지만, 검색해보면 비슷한 질문이 있으니 찾아보세요. 그럼 이만.