Pascal将listview从mainform传递给非模态表单

时间:2012-04-10 19:16:54

标签: freepascal lazarus

我在mainform中有一个listview,我希望另一个非模态表单能够添加内容。 我如何将listview传递给非模态表单? 我希望能够修改它的表单由MainForm按下单击按钮显示,只需使用Form.Show。

我还应该澄清一点,我希望表单不使用mainform来避免循环引用。

3 个答案:

答案 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,您可以执行以下任一操作:

  1. 在数据模块中对MainForm的ListView进行全局引用,并使用表单中的那个。
  2. 在数据模块中有一个函数/类,可以让您更新列表,并从表单中调用它。
  3. 无论哪种方式,您的表单只需要知道数据模块,数据模块完成剩下的工作。您可以添加/删除/更改表单,通常只需要更新DM。