DB에있는 메뉴를 RealGrid에 뿌려서 해당메뉴를 선택하면 선택메뉴에 해당하는 폼이
떠야합니다... 이것을 공통함수로 만들어볼려니깐... 머리가 아프네요..
제가 사용한 방법은
procedure TFrmMain.ShowSelectedForm(const ClassName, WndName : String);
var
Handle : THandle;
begin
Handle := FindWindow(PChar(ClassName), PChar(WndName));
if Handle <> 0 then
begin
// 이방법이 틀린거 같은데... 여기까지가 한계라서....
// WndName := ClassName.Create(Self) 당연히 에러나지요..ㅋㅋ
// WndName.Show; 이것두 마찬가지...ㅋㅋㅋ
end;
end;
ClassName과 WindowName을 가지고 폼핸들을 조사해서 폼이 존재하면 떠있는 폼을
보여주고.. 없다면... From1 := TForm.Create(Self) 처름해서 뛰워야 되는데...
동적인 메뉴를 노가다 코딩하지 않고 뛰을수 있는 방법은 없는지요....
메뉴가 많고.. 사용자 마다..나타나는 메뉴의 수가 틀려서 막코딩도 어렵네요...
아무튼 고수님의 도움바랍니다.
수고하세요...
mdi폼을 기준으로 예제 소스를 적을께요.
Form1이 메인폼이고 Form2가 차일드 폼이라고 가정하면
일단 다음의 프로시저가 님이 이야기하신 그리드에 있는 폼을
뛰우는 함수입니다.
function TForm1.CreateChild(sClass : string):Boolean;
var MyFormClass : TFormClass;
MyForm : TForm;
i :integer;
begin
Result := True;
for i := 0 to (Screen.FormCount - 1 ) do
begin
if Screen.Forms[i].Name = Copy(sClass,2,length(sClass)-1) then
begin
Screen.Forms[i].show;
Exit;
end;
end;
MyFormClass := TFormClass(GetClass(sClass)); //클래스를 찾아온다
if MyFormClass <> nil then
Application.CreateForm(TFormClass(FindClass(sClass)), MyForm)
else
Result := False;
그리고 그리드 클릭 이벤트에서
var s_Form :String;
begin
s_Form := 'T' + Grid.Cells[그리드위치]; 하셔서 폼이름을 받아오시고요.
CreateChild(s_Form); // s_Form 에는 'TForm2'변수가 들어가겠지요.
end;
이렇게 하신다음에 Form2의 소스 맨끝 end. 위에
initialization
RegisterClass(TForm2); //요렇게 해주시면 됩니다..
그럼..