Q&A

  • DB에서 메뉴를 읽어와서.. 읽어온 폼 뛰우기... 도움좀 부탁드립니다
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) 처름해서 뛰워야 되는데...

동적인 메뉴를 노가다 코딩하지 않고 뛰을수 있는 방법은 없는지요....
메뉴가 많고.. 사용자 마다..나타나는 메뉴의 수가 틀려서 막코딩도 어렵네요...
아무튼 고수님의 도움바랍니다.
수고하세요...
1  COMMENTS
  • Profile
    델맥 2004.03.05 01:21
    안녕하세요..
    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);     //요렇게 해주시면 됩니다..
    그럼..