【问题标题】:Passing a class as a parameter of a procedure in Delphi XE在 Delphi XE 中将类作为过程的参数传递
【发布时间】:2023-03-06 07:53:02
【问题描述】:

我需要做的是这样的:

procedure A(type_of_form);
var form: TForm;
begin
  form := type_of_form.Create(application);
  form.showmodal;
  freeandnil(form);
end;

我对每个动态创建的表单都这样做了:

form1 := TForm1.Create(application);
form1.showmodal;
freeandnil(form1);

我将在过程 A 中执行的操作更复杂,但问题在于如何使表单的创建更加通用。也许有@运算符的东西......我真的不知道。

感谢您的任何建议!

【问题讨论】:

    标签: forms delphi class delphi-xe factory


    【解决方案1】:
    procedure Test(AMyFormClass: TFormClass);
    var
     form: TForm;
    begin
      form := AMyFormClass.Create(Application); // you can use nil if you Free it in here
      try
        form.ShowModal;
      finally
        form.Release; // generally better than Free for a Form
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Test(TForm2);
    end;
    

    【讨论】:

    • form.Free 在那里很好。值得指出的是,这仅在表单的构造函数是 TForm 构造函数的覆盖时才有效。
    • @David,你是说如果构造函数被命名为 Create,如果它隐藏了后代构造函数,这将不起作用?
    • @Marcus 没错。您需要使用虚拟构造函数通过类引用来获得实例化才能工作。否则你每次都会得到一个TMyForm,不管类引用是什么。
    • 代码的问题(也许在我的问题中)并不普遍。只有 TMyForm 的形式可以作为参数传递。这个想法是使用需要以相同方式创建、使用和处理的“大量”表单来调用函数。尽管每个表单都从 TForm 继承了所有内容,但它们都有自己的类。
    • @user 此答案中的代码可以满足您的需要并且是通用的。如果它不能解决您的问题,那么您还没有提出正确的问题。您可以使用Test(TMySuperDuperClass)Test(MyOtherFantasticForm),只要它们都有共同的祖先。
    【解决方案2】:

    您所要求的基本上是TApplication.CreateForm() 所做的,例如:

    Application.CreateForm(TForm1, form1); 
    form1.ShowModal; 
    FreeAndNil(form1); 
    

    您无需像这样调用TAppliction.CreateForm() 即可模仿:

    procedure A(AClassType: TFormClass); 
    var
      form: TForm; 
    begin 
      form := AClassType.Create(Application); 
      try
        form.ShowModal; 
      finally
        FreeAndNil(form);
      end; 
    end; 
    
    ...
    
    begin
      A(TForm1); 
    end;
    

    【讨论】:

    • 是的...代码与另一个相似(并且类似于 CreateForm 方法)...jeje...我从来没有意识到这一点!
    • 只是另一个问题...释放表单的最佳方式是什么? Form.release?或 FreeAndNil(Form) 我曾经使用过 FreeAndNil...但是...
    • TForm.Release() 仅在表单需要从其事件处理程序之一内部释放时使用。 free 被延迟,直到控制返回到主消息循环以确保 TForm 没有被任何东西使用。如果您知道不再使用 TForm(在这种情况下就是这种情况),那么您可以立即致电 Free()FreeAndNil() 对于像这个例子这样简单地使用局部变量来说太过分了。没有必要将不再使用的指针归零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多