Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Добавление пользовательских объектов типа TNodeElem в TVirtualStringTree

Delphi , Синтаксис , Деревья

TVirtualStringTree - это компонент, который позволяет создавать сложные иерархические деревья. По умолчанию, он работает с записями (records), но иногда может потребоваться добавлять в него объекты. В данной статье мы рассмотрим, как добавить объекты типа TNodeElem в TVirtualStringTree.

Предположим, у нас есть следующий пользовательский объект:

TNodeElem = class
public
  LineTimeS, LogMessage, MethName: String;
  LineDate, LineTime: TDateTime;
  LineDateTime: TDateTime;
  ElemType: TLogLineType; // ordinal type
  // другие поля и методы
end;

Мы хотим добавить объекты этого типа в TVirtualStringTree. Для этого нам нужно сначала добавить их в TObjectList:

FObjLst.Add(lNode);

Затем мы можем добавить их в TVirtualStringTree следующим образом:

var
  iPos: Integer;
  lNode: PVirtualNode;
  lData: TNodeElem;
begin
  FTreeView.BeginUpdate;
  for iPos := 0 to FObjLst.Count - 1 do
  begin
    lNode := FTreeView.AddChild(nil);
    lData := TNodeElem(FObjLst[iPos]);
    FTreeView.SetNodeData(lNode, lData);
    FTreeView.ValidateNode(lNode, False);
  end;
  FTreeView.EndUpdate;
end;

В данном примере мы используем метод SetNodeData() вместо попытки присвоить значение напрямую, как в первоначальном примере. Это позволяет избежать ошибки E2015.

Также, нам нужно обновить процедуру VSTGetText(), чтобы она работала с нашими пользовательскими объектами:

procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: UnicodeString);
var
  Data: TNodeElem;
begin
  Data := TNodeElem(FTreeView.GetNodeData(Node));
  CellText := Data.LogMessage;
end;

Теперь мы можем добавлять объекты типа TNodeElem в TVirtualStringTree без ошибок.

Подтвержденный ответ

Если вы хотите добавить и получить объекты более удобным способом, вы можете использовать следующие функции:

function AddItem(Item: TNodeElem): PVirtualNode;
begin
  Result := FTreeView.InsertNode(nil, amAddChildLast, Item);
end;

function GetItem(Node: PVirtualNode): TNodeElem;
begin
  Result := TNodeElem(FTreeView.GetNodeData(Node));
end;

Альтернативный ответ

Если вы хотите избежать проблем с неверными ссылками, вы можете хранить индекс объекта в TList, а не сам объект. Затем вы можете добавить элемент в TVirtualStringTree с помощью индекса, а не напрямую. При получении данных из TVirtualStringTree, вы можете использовать индекс для получения объекта из TList.

Помните, что при использовании этого подхода, вам нужно убедиться, что индекс не выходит за пределы TList. Также, если вы добавляете или удаляете элементы из TList, вам нужно обновить TVirtualStringTree соответствующим образом.

Надеемся, что эта статья поможет вам добавлять пользовательские объекты в TVirtualStringTree без проблем.

Создано по материалам из источника по ссылке.

В данном контексте речь идет о добавлении пользовательских объектов типа TNodeElem в компонент TVirtualStringTree в программировании на Pascal.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Деревья ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 22:00:36/0.0034470558166504/0