窗体创建和函数关联相关的两个小问题

窗体创建和函数关联相关的两个小问题 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;  
 

你可能感兴趣的:(函数)