Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何将表单作为参数传递给过程并操作其属性?_Delphi_Pascal - Fatal编程技术网

Delphi 如何将表单作为参数传递给过程并操作其属性?

Delphi 如何将表单作为参数传递给过程并操作其属性?,delphi,pascal,Delphi,Pascal,假设我想在我制作的单元中创建一个过程,通过作为参数传递的名称显示和隐藏表单 我该怎么做?语法是什么 谢谢 编辑 我正在寻找类似的东西:Popupformy,‘Show’;从我的单元内部。假设表单是以父表单作为所有者[.CreateSelf]创建的,这应该可以工作: procedure ShowFormByName(const ParentForm: TForm; const FormName: String; ShowForm: Boolean); var i: Integer; begin

假设我想在我制作的单元中创建一个过程,通过作为参数传递的名称显示和隐藏表单

我该怎么做?语法是什么

谢谢

编辑


我正在寻找类似的东西:Popupformy,‘Show’;从我的单元内部。

假设表单是以父表单作为所有者[.CreateSelf]创建的,这应该可以工作:

procedure ShowFormByName(const ParentForm: TForm; const FormName: String; ShowForm: Boolean);
var
  i: Integer;
begin
  for i := 0 to pred(ParentForm.ComponentCount) do
  begin
    if (ParentForm.Components[i] is TForm) and ParentForm.Components[i].Name = FormName) then
    begin
      if ShowForm then
        TForm(ParentForm.Components[i]).Show
      else
        TForm(ParentForm.Components[i]).Hide;

      Break;
    end;
  end;
end;

您可以循环使用CustomForms属性,其中有全局屏幕对象的CustomFormCount。这只是列举了应用程序中可能是您想要的所有VCL表单

如果您正在寻找代码,它将是这样的:

for i := 0 to Screen.CustomFormCount-1 do begin
  Form := Screen.CustomForms[i];
  if Form.Name=TargetName then begin
    DoSomething(Form);
    break;
  end;
end;

您可以编写这样的过程

procedure ShowMyForm(Form: TForm; Show: Boolean);
begin
  if Show then
    Form.Visible := True
  else
    Form.Visible := False;
end;
用ShowMyFormMyForm来称呼你的形式,真的;确保你的单位使用表格

正如大卫所说,你能做到

procedure ShowMyForm(Form: TForm; Show: Boolean);
begin
    Form.Visible := Show 
end;

我认为,这一代码现在确实起作用了。我想你指的是父窗体而不是组件。另外,如果我没有记错的话,TForm案例也不需要,因为名称是在TComponent中引入的。我认为您可以将ShowForm分配给ParentForm.Components[I]。Visible@CodeInChaos您至少需要转换到TControl,我可以调用这个函数吗?我得到[DCC Error]UNITEST.pas88:E2010不兼容类型:“字符串”和“布尔值”弹出窗口是什么?那你为什么不直接写我的节目呢?我认为您需要详细说明您的问题,以便我们能够帮助您。我正在显示具有messenger效果的表单,因此我不想在每个表单中都为此编写代码。这就是为什么Popup会调用Form.Show,但同时也会将表单放置在正确的位置并产生效果。@Bharat:这不需要过程,只需编写MyForm即可。可见:=True@David:你是对的,但是如果我有多个表单,我必须显示/隐藏这些表单,那么它会有帮助。@Bharat:不,不会。编写的例程完全可以与Visible属性互换。事实上,你可以把函数的主体写成Form.Visible:=Show,这可以让你更清楚地知道它是nugatory。@David Heffernan:为什么?我有许多不同名字的表格。其思想是使用相同的过程显示多个表单。MyForm.Visible:=True是hardcoded@emurad你为什么拿着一张表格名的清单?为什么不保存一个表单实例列表?然后,您可以在列表上循环,并对每个成员调用Show。回答这个问题的部分原因是你没有提供足够的信息。要得到一个好的答案,你需要解释得更多。为什么你拿的是名字而不是实例?表单是如何创建的?如果找不到表单名,这将返回Screen.forms中的最后一个表单。如果您将Break改为Exit,并将AForm:=nil移到底部,它应该可以工作。@jasonpenny,您说得对,谢谢。我写代码很快,没有测试。我更新了帖子来解决这个问题。
function GetFormByName(const FormName: string): TForm;
var
  i : Integer;
begin
  Result := nil;
  for i := 0 to Screen.FormCount - 1 do
  begin
    if SameText(Screen.Forms[i].Name,FormName) then
    begin
      Result := Screen.Forms[i];
      Break;
    end;
  end;
end;