2010-12-11 110 views
1

假设我想在我制作的单元中创建一个按名称显示和隐藏表单(作为参数传递)的过程。如何将表单传递给过程作为参数并操作其属性?

我怎么能这样做,什么是语法?

感谢。

编辑

我在寻找类似:弹出窗口(FormMy, '展');从我的单位内部。

+1

什么是Popup?为什么你不写FormMy.Show?我想你需要详细说明你的问题,以便我们能够帮助你。 – 2010-12-11 12:38:32

+0

我使用类似Messenger的效果显示表单,所以我不想在每种表单中编写代码。这就是Popup调用Form.Show的原因,同时也将该表单放置在正确的位置并执行效果。 – emurad 2010-12-11 20:03:54

回答

0

您可以编写一个程序是这样

procedure ShowMyForm(Form: TForm; Show: Boolean); 
begin 
    if Show then 
    Form.Visible := True 
    else 
    Form.Visible := False; 
end; 

ShowMyForm(MyForm, True);打电话给你的表格,并确保你的单位uses Forms

正如大卫说,你可以把它

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

@Bharat:你不需要这个程序,你只需写MyForm.Visible:= True – 2010-12-11 12:39:29

+0

@大卫:你是对的,但如果我有多种形式,为此我必须显示/隐藏,那么这将会有所帮助。 – Bharat 2010-12-11 12:44:21

+0

@Bharat:不会的。书面例程与Visible属性完全可以互换。事实上,你可以将你的函数的主体写成Form.Visible:= Show,这使得它变得更加清晰。 – 2010-12-11 13:08:20

0

假设形式用父窗体作为所有者创建[.Create(自我),这应该工作:

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; 
+0

我认为这段代码现在可以工作。我认为你的意思是ParentForm而不是Component。如果我记得正确,因为名称是在TComponent中引入的,所以也不需要TForm情况。 – 2010-12-11 10:24:12

+0

修正了,谢谢大卫 – norgepaul 2010-12-11 10:49:45

+0

我想你可以将ShowForm分配给'ParentForm.Components [i] .Visible' – CodesInChaos 2010-12-11 10:52:21

0

就可以在CustomForms财产环路(也有他们的CustomFormCount)全局Screen对象。这只需枚举应用程序中所有可能是您想要的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; 
0
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; 
+2

如果没有找到'FormName',这将返回'Screen.Forms'中的最后一个表单。如果你将'Break'改为'Exit',并将'AForm:= nil'移到最下面,它就可以工作。 – jasonpenny 2010-12-11 17:41:50

+0

@jasonpenny,你是对的,谢谢。我很快写了代码,并没有测试它。我更新了该帖子以解决该问题。 – vcldeveloper 2010-12-11 20:12:29

相关问题