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;