Рекомендации по настройке нового типа данных TreeView - PullRequest
3 голосов
/ 20 июня 2011

Мне хотелось бы получить несколько советов и / или советов о том, как настроить новый класс объектов для TreeView с помощью свойства Node.Data TreeView.

Я знаю, как создать базовый тип объекта, который можетзапись / чтение из свойства .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 и т. Д.1019 * Вместо записи стандартных данных в узел дерева, как насчет добавления элементов в этот 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 хранит стандартные свойства, а также TListView.
  • Эти данные отображаются в другой форме, называемой формой данных.
  • ListView в форме данных также содержит данные.
  • При редактировании ListView в форме данных отобразится дополнительная форма со стандартными свойствами.

Я хотел бы знать, как мне лучше всего подойти к этому, какие советы вы могли бы дать, как проще всего добиться чего-то подобного и т. Д.?

Запись / чтение и чтениеиз ListView легко реализуется. Я представляю, что это можно сделать, открыв свойство ListView Items.Item[x].Data.Проблема получения данных ListView для хранения в TreeView - это проблема, я не знаю, как я мог бы реализовать этот тип поведения.

Я хотел бы узнать совет о таких вещах, как, как я могу определить типы и т. Д.

Я с нетерпением жду ваших идей по этому поводу.

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Я думаю, что ваша путаница связана с хранением визуальных форм и компонентов, включая их данные. Я считаю, что вы можете сделать это с помощью потоковой системы - хотя у меня никогда не было! Мне нравится хранить данные и визуальные эффекты как можно более отдельными.

Так что вам нужен собственный список, чтобы поместить в 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 напрямую:)

и тому подобное. Вероятно, там есть несколько синтаксических ошибок!

0 голосов
/ 20 июня 2011

Я не вижу проблем с вашим подходом. Вы можете позволить вашему объекту данных содержать список объектов (я не знаю, почему вы наследуете от 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);

Если вы редактируете один из элементов, вы делаете то же самое: извлекаете объект из данных списка и передаете его следующей форме.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...