В данной статье мы рассмотрим вопрос поиска текста в узлах VirtualStringTree, не прибегая к использованию указателей на данные (например, Data^.Column0), так как тип данных не всегда является строкой.
Проблема
Пользователь хочет реализовать процедуру поиска в VirtualStringTree, сравнивая текст поиска с текстом узла, а не с данными узла. Это связано с тем, что тип данных не всегда является строкой. Для лучшего понимания представьте следующий код:
type
PTreeData = ^TTreeData;
TTreeData = record
Column0: TDate; // Дата
Column1: Integer; // Целое число
Column2: String;
end;
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(Node);
case Column of
0: CellText := DateToStr(Data^.Column0); // 2015-05-11 или 11-05-2015
1: CellText := IntToStr(Data^.Column1) + ' days'; // 22 days
2: CellText := Data^.Column2;
end;
end;
Альтернативный ответ
Пользователь хочет реализовать процедуру поиска в VirtualStringTree, сравнивая текст поиска с текстом узла, а не с данными узла. Для лучшего понимания представьте следующий код:
type
PTreeData = ^TTreeData;
TTreeData = record
Column0: TDate; // Дата
Column1: Integer; // Целое число
Column2: String;
end;
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(Node);
case Column of
0: CellText := DateToStr(Data^.Column0); // 2015-05-11 или 11-05-2015
1: CellText := IntToStr(Data^.Column1) + ' days'; // 22 days
2: CellText := Data^.Column2;
end;
end;
Подтвержденный ответ
Чтобы получить текст ячейки VirtualStringTree, можно использовать свойство Text. Это внутренне вызовет событие OnGetText, и вы сможете получить текст таким же образом, как если бы возвращали его для отображения в дереве:
var
S: string;
Node: PVirtualNode;
Column: TColumnIndex;
begin
...
S := VirtualStringTree.Text[Node, Column];
end;
Вывод
При работе с текстом узлов в VirtualStringTree можно использовать свойство Text, чтобы получить текст ячейки. Однако, если вы хотите сохранить чистую границу между представлением и данными, можно дополнить тип, представляющий данные, методом ToString с параметром индекса столбца. Это позволит сохранить разделение между представлением и данными и упростит поиск текста в узлах.
Статья описывает решение проблемы поиска текста в узлах VirtualStringTree без использования указателей на данные, так как тип данных не всегда является строкой. Предлагается два способа: использовать свойство `Text` или дополнить тип данных методом `ToStr
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.