窗體建立和函式關聯相關的兩個小問題

weixin_33860553發表於2008-11-18
窗體建立和函式關聯相關的兩個小問題 VCL元件開發及應用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061222112800193.html
1,用窗體名稱作為傳入引數,建立窗體,怎麼避免重複建立?  
  如下面程式碼中註釋調的部分;使用not   assigned()判斷返回的結果每次都是false  
  也就是說,assigned判斷結果一直為true。  
  function   JaxCreateForm(const   AFormName:string):boolean;  
  var  
      AForm:   TForm;  
      AFormClass:   TFormClass;  
  begin  
      try  
          if   FindClass(AFormName)   <>   nil   then  
          begin  
              try  
                  AFormClass   :=   TFormClass(FindClass(AFormName));  
  //             if   not   assigned(TForm(copy(AFormName,2,Length(AFormName)-1)))   then  
                  AForm   :=   AFormClass.Create(nil);  
                  AForm.Show;             //mdi型別form不能使用showmodal釋放窗體;  
              except  
                  AForm.Free;  
                  AForm   :=   nil;  
              end;  
          end  
          else   begin  
              showmessage(format('建立窗體"%s"出錯!',[AFormName]));  
          end;  
      except  
      end;  
  end;

2,動態建立的選單項,怎麼將其onclick事件與全域性tnotifyevent型別的函式關聯起來。  
  with   tbutton.create(nil)   do  
  begin  
      parent   :=   self;  
      caption   :=   '';  
      onclick   :=   ?.  
  end;

這個   視窗是不是自動建立的?

Q:   1,用窗體名稱作為傳入引數,建立窗體,怎麼避免重複建立?  
   
  A:   看例項:  
   
  procedure   TActionsModule.OpenForm(FormClass:   TFormClass;   var   fm;  
      AOwner:   TComponent);  
  var  
      Idx:   Integer;  
      Child:   TForm;  
  begin  
      for   Idx   :=   0   to   Pred(Screen.FormCount)   do  
          if   Screen.Forms[Idx].ClassType   =   FormClass   then  
          begin  
                  Child   :=   Screen.Forms[Idx];  
                  if   Child.WindowState   =   wsMinimized   then  
                        ShowWindow(Child.handle,SW_SHOWNORMAL)  
                  else  
                        ShowWindow(Child.handle,SW_SHOWNA);  
                  if   (not   Child.Visible)   then   Child.Visible:=True;  
                  Child.BringToFront;  
                  Child.Setfocus;  
                  TForm(fm):=Child;  
                  exit;  
          end;  
      Child   :=   TForm(FormClass.NewInstance);  
      TForm(fm):=   Child;  
      Child.Create(AOwner);  
  end;  
   
  OpenForm(TLogInformationForm,   LogInformationForm,   Application.MainForm);  
   
  Q:,動態建立的選單項,怎麼將其onclick事件與全域性tnotifyevent型別的函式關聯起來。  
   
  A:   看例項  
   
  procedure   TMainForm.ButtonOnClick(Sender:   TObject);  
  begin  
      if   Sender   is   TButton   then  
          Showmessage((Sender   as   TButton).Caption);  
  end;  
   
  with   tbutton.create(nil)   do  
  begin  
      parent   :=   self;  
      caption   :=   '';  
      onclick   :=   ButtonOnClick  
  end  
   
 

Q:,動態建立的選單項,怎麼將其onclick事件與全域性tnotifyevent型別的函式關聯起來。  
   
  with   tbutton.create(nil)   do  
   
  ----------------------------  
   
  你的問題是選單項,   而你的程式碼是TBUTTON。呵呵。   沒有關係,選單項也是一樣的

1,看到了老馮的例項,不過我的建立方式和你有點不同;現在已經自己解決了;  
  將程式碼AForm:=   AForm.create(nil);改成..create(Application);  
  然後用Application.findcomponent('AFormName');就可以了。  
   
  2,onclick   :=   ButtonOnClick;  
  中如果buttononclick是在同一個類下是可以;但,相反,如果buttononclick是一個全域性定義函式,不屬於任何類下的話,好像不行。  
  再次請教。

對不起,   剛才一直無法上來。  
   
  procedure   ButtonOnClick(Sender:   TObject);  
  begin  
      Showmessage('Pointer,   Pointer   ,   I   Hate   You!');  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      with   TButton.Create(nil)   do  
      begin  
          Parent   :=   Self;  
          Visible   :=   True;  
          @OnClick   :=   @ButtonOnClick;  
      end;  
  end;  
 

相關文章