我在mainform中有一个listview,我希望另一个非模态表单能够添加内容。 我如何将listview传递给非模态表单? 我希望能够修改它的表单由MainForm按下单击按钮显示,只需使用Form.Show。
我还应该澄清一点,我希望表单不使用mainform来避免循环引用。
答案 0 :(得分:2)
注意:该问题最初标记为Delphi。我不知道FPC / Lazarus所以下面的一些细节可能不准确,但概念仍然有效。
我猜你有一个表示主要形式的全局变量,为了参数而命名为MainForm
。最快捷,最简单的方法就是使用MainForm.ListView
让您的其他表单引用主窗体的列表视图。
我对此方法并不十分热衷,因为这意味着另一种形式依赖于主表单的实现。
作为替代方法,您可以将对列表视图的引用传递给另一个表单。例如,您可以在其他表单中添加SetListView
程序:
type
TMyOtherForm = class(TForm)
private
FListView: TListView;
public
procedure SetListView(Value: TListView);
end;
.....
procedure TMyOtherForm.SetListView(Value: TListView);
begin
FListView := Value;
end;
然后在主窗体中,可能在主窗体的OnCreate
事件处理程序中,您可以调用此方法:
procedure TMainForm.FormCreate(Sender: TObject);
begin
MyOtherForm.SetListView(ListView);
end;
这并不比第一个建议好得多。另一种形式仍然依赖于主要形式的实现,尽管可以说是不太重要的依赖。
如果你想保持两个表格更少耦合,那么主表单可能会暴露一个接受列表添加的方法:
procedure TMainForm.AddToList(const Name: sting; const Time: TDateTime);
var
Item: TListItem;
begin
Item := ListView.Items.Add;
Item.Caption := Name;
Item.SubItems.Add(DateTimeToStr(Time));
end;
在您的其他表单单元中,您将主表单单元添加到实现部分中的uses子句。这允许您访问MainForm
全局变量,您可以调用
MainForm.AddToList(Name, Time);
这种方法在我看来是最好的,因为它允许主表单将其列表实现保持为私有。
您在评论中声明要避免因uses
子句而导致的任何循环引用。这很容易安排,因为以上都不需要修改来自两个单元的接口部分的uses
子句。
答案 1 :(得分:2)
最简单和最好的方法是在接收表单中添加一个方法 - 也就是说,带有ListView的表单 - 显示“AddThingsToListView”,让它接受你想要添加的东西(可能是TListItem?)
这样,你就可以打电话了
MyMainForm.AddThingsToListView(ANewListItem);
来自任何地方。
换句话说,不要将列表视图传递给非模态形式;相反,让主窗体能够接受其列表视图的添加。
答案 2 :(得分:0)
我的所作所为:对于这种情况: 我通常声明一个数据模块,并将大部分不适合非GUI库单元的代码放入数据模块中。数据模块可以引用表单,反之亦然,但没有一个表单相互引用。
在此示例中,您的Form2可以使用DataModule,您可以执行以下任一操作:
无论哪种方式,您的表单只需要知道数据模块,数据模块完成剩下的工作。您可以添加/删除/更改表单,通常只需要更新DM。