有关设置新TreeView数据类型的建议

时间:2011-06-20 14:58:44

标签: delphi listview treeview

我想了解如何使用TreeView的Node.Data属性为TreeView设置新的Object类的一些建议或提示。

我知道如何创建可以从.Data属性写入/读取的基本对象类型,我这样做:

type
  TMyData = class(TComponent)
  private
    FString1: String;
    FString2: String;
    FInteger1: Integer;
  published
    property String1: String read FString1 write FString1;
    property String2: String read FString2 write FString2;
    property Integer1: Integer read FInteger1 write FInteger1;
  end;

要将值写入其中一个属性Node.Data属性:

TMyData(TreeView1.Selected.Data).String1:= 'save this String';

读取值:

ShowMessage(TMyData(TreeView1.Selected.Data).String1);

这是将数据分配给树节点的一个非常基本的例子,现在我需要帮助和建议,提示等......

从上面的示例中,您可以轻松读取/写入标准属性,如String,Integer,Boolean等。如果包含和读取/写入TListBox或TListView呢?

如何将项目添加到该TListView并将该TListView的内容写入TreeView节点,而不是将标准数据写入树节点。

如果单击其中一个树节点而不是返回字符串,它可以使用保存到之前的项目和图像填充TListView。

(1)这是您可以将节点添加到TreeView的主要表单。我实际上使用了一个更强大的函数来添加到我的TreeView中,如下所示:

function AddMyDataNode(ATreeView: TTreeView; NodeName: String; NodeImage: Integer;
    String1, String2: String; Integer1: Integer;
    SelectNode: Boolean): TTreeNode;
var
  Obj: TMyData;
  Node: TTreeNode;
begin
  Result:= nil;

  Obj:= TMyData.Create(nil);
  try
    Obj.String1:= String1;
    Obj.String2:= String2;
    Obj.Integer1:= Integer1;

    Node:= ATreeView.Items.AddObject(ATreeView.Selected, NodeName, Obj);
    Node.ImageIndex:= NodeImage;
    Node.SelectedIndex:= NodeImage;

    Result:= Node;

    if SelectNode then
      Node.Selected:= True;

    ATreeView.SetFocus;
  except on E: Exception do
    ShowMessage('Could not add MyData Node: ' + E.Message);
  end;
end;

编辑节点将显示另一个名为数据表单的表单......:

(2)此数据表格是读取/写入主表单上节点的数据的位置。添加了TListView。 ListView也应该使用标准属性进行读取/保存。

添加/编辑ListView项可能包含其他标准属性,例如:

(3)此表单上的值保存在ListView数据中。

简而言之:

  • TreeView Node.Data存储 标准属性和a TListView的。
  • 此数据以另一种形式显示 称为数据表格。
  • 数据表单上的ListView也是 有数据。
  • 在数据表单上编辑ListView 将显示一个额外的表格 标准属性。

我想知道如何才能最好地解决这个问题,你能提供什么技巧,最简单的方法是什么?

我可以通过访问ListView Items.Item[x].Data属性来轻松实现与ListView的编写/读取。使用TreeView获取ListView数据是存在的问题,我不知道如何实现这种行为。

我想知道如何定义类型等方面的建议。

我期待听到你的想法。

2 个答案:

答案 0 :(得分:1)

我认为您的困惑在于考虑存储Visual Forms和组件,包括其数据。我相信你可以用流媒体系统做到这一点 - 虽然我没有!我喜欢尽可能将数据和视觉效果分开。

所以你需要一个自定义列表放在MyData中,其中包含需要在列表视图中输入的所有数据和设置,例如MyDataList :(我正在直接输入!)

type

TMyDataViewData = class(TPersistent)
  Caption: string;
  ImageIndex: Integer;
  StateIndex: Integer;
  Group: Integer;
  MemoData: TStrings;
end;

TMyDataViewDataList = class(TPersistent)
  TheList: TObjectList;
  property Items[Index:Integer]:MyDataViewData read getItems write SetItems;
  property Count: Integer read GetCount;
  . 
  .
  .
end;

  TMyData = class(TComponent)
  private
    FString1: String;
    FString2: String;
    FInteger1: Integer;
  private 
    MyForm: TMyEditform;
  published
    procedure Edit(Owner: TComponent);
    property String1: String read FString1 write FString1;
    property String2: String read FString2 write FString2;
    property Integer1: Integer read FInteger1 write FInteger1;
    property TheDataList: TMyDataViewDataList read fTheDataList write fTheDataList;  
end;

procedure TMyData.Edit;
var
  F: TMyEditForm;
begin
  F:= TMyEditForm.create(Owner);
  F.DataList := TheDatalist;  // data for listview and memos
  F.ShowModal;
  .
  .
  . 
end;

然后在你的Treeview中你只需要这样做:

  If TreeNode.Data is TMyData then
    TMyData(TreeNode.Data).Edit(Self);

编辑完成后,更改树视图节点信息的所有数据都应该在MyData中    所以你可以做到

  Node.Text := TMyData(Node.Data).TheDataList.Items[0].Caption;

for i := 0 to TMyData(Node.data).TheDataList.Count do
    Node.AddChild(TMyData(Node.Data).TheDataList.Items[i].Caption);

您也可以直接将Datalist的属性直接暴露给TMyData:)

等等。那里可能有一些语法错误!

答案 1 :(得分:0)

我认为您的方法没有任何问题。你可以让你的数据对象包含一个对象列表(我不知道为什么你在一个与可视组件无关的类中继承TComponent):

TMyData = class
private
  FString  : String;
  FInteger : Integer;
  FItems   : TList <TItem>   // where TItem is your custom object class
public
  // ... properties ...
end;

此列表随后显示在列表框中:

 for Item in MyData.Items do
   ListBox.Items.AddObject (Item.ToString, Item);

如果你编辑其中一个项目,你会做同样的事情:从列表框的数据中取出对象并将其传递给下一个表格。

希望有所帮助。