我一直致力于Delphi 2009中的一个程序。它与物化的“Mimics”程序非常相似,您可以在其中创建和操作3D网格。有4个具有不同方面的面板用于查看3D对象(XY,YZ,XZ和3D透视图)。每个面板都是我为查看3D对象而制作的自定义框架的实例。然后将4个面板装载到具有按钮和其他部件的表格上。
我遇到的一个问题是框架必须访问它们所在表单的子例程。例如。如果我在其中一个框架中更改了有关网格的内容,则应更新(刷新)所有框架,这是父窗体中可用的过程。但是要在父表单上调用过程,我必须在3D框架的implementation uses子句中包含父表单的单元文件。这没关系,这一般都没有任何问题。问题是我不能使用父表单继承。如果我从父表单创建一个继承的类,单元名称和表单名称将更改,然后我必须更改3D框架以引用此新更改的表单。
这真的是我问题的症结所在。我不知道如何从子框架引用父窗体的属性,而不明确说明窗体的名称。我希望能够重用和扩展父表单,但我不知道如何在不改变表单使用的3D帧的情况下实现它。
非常感谢任何帮助。谢谢。
答案 0 :(得分:9)
所以你有一个自包含的组件(一个框架),它必须能够从它所放置的表单中调用代码,而不需要编译时知道表单本身?听起来很像TButton,当你点击它时,它不知道如何处理它的形式,并且解决方案是相同的:使用事件处理程序。将OnChangeMesh(或类似的东西)事件属性添加到您的框架,并让您的表单在创建框架时指定适当的方法。
答案 1 :(得分:6)
另一个选项可能是定义父表单实现的接口。它应该具有您想要从子框架访问的所有属性和方法,例如:
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;
现在,如果您从父表单继承,它仍然可以正常工作,因为您仍然可以获得该接口。此外,您可以将帧放在一个全新的表单上,只要该新表单实现了界面,那么它也可以在那里工作。
答案 2 :(得分:3)
您可以使用订阅结构。维护视图框的全局列表。如果帧需要更新,只需循环遍历此列表,并为每个帧调用updae过程。如果某些内容发生了变化,您可以更新1,2或100帧。
如果你想要全部OOP而且真的很开心:这是观察者模式。
答案 3 :(得分:0)
最终的解决方案可能是检查视觉形式/框架继承。
可以从基础形式和基础框架中导出表格。将虚方法添加到baseframe并在继承的版本中覆盖它们。