另一种选择可以是定义母体形式实现的接口。它应该有所有的属性和你想从你的孩子帧访问方法是这样的:
ImyFormInterface=interface
['{08BD9B3C-C48E-47B7-AE67-279277C7E024}']
function GetValue1: integer;
function GetValue2: integer;
procedure SetValue1(val: integer);
procedure SetValue2(val: integer);
procedure SomeMethod;
function GetSomeValue: integer;
property Value1: integer read GetValue1 write SetValue1;
property Value2: integer read GetValue2 write SetValue2;
end;
然后,让你的主要形式,实现该接口:
TForm1 = class(TForm, ImyFormInterface)
private
{ Private declarations }
public
// Implement ImyFormInterface
function GetValue1: integer;
function GetValue2: integer;
procedure SetValue1(val: integer);
procedure SetValue2(val: integer);
procedure SomeMethod;
function GetSomeValue: integer;
public
{ Public declarations }
end;
然后在你的框架,你可以使用类似的东西:
procedure Tframe1.Button1Click(Sender: TObject);
var pform: TcustomForm;
i: ImyFormInterface;
begin
pform:=GetParentForm(self);
if (pform.GetInterface(ImyFormInterface, i)) then
begin
i.SomeMethod;
i.Value1:=i.Value1+10;
Self.SomeProperty:=i.GetSomeValue;
end;
end;
现在,如果您从父窗体继承,它将仍然工作,因为您仍然可以获得界面。此外,你可以把你的框架放在一个全新的窗体上,只要新窗体实现了界面,那么它也可以在那里工作。
非常感谢您的回复。我现在明白,事件处理程序将允许我从该表单的框架调用父表单的子例程,这是我解决我的问题的方法,正如我所说的那样。我想知道是否还可以从子框架中更改父表单的数据字段。例如。如果我在其中一个框架中对网格进行切片,我想更新网格的可见边界,这是父窗体的一个属性。 – Nicholas 2010-10-11 22:21:52
您可以拥有的活动数量没有限制。您可以让您的框架引发一个事件,然后让父表单从框架中读回,相应地更新属性,然后根据需要将这些属性更改传播给其他框架。 – Jenakai 2010-10-11 22:49:55