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

Решение проблемы со указателями в дереве для сохранения данных в базу

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

Заголовок: Решение проблемы со указателями в дереве VirtualStringTree для сохранения данных в базу

Вопрос: При использовании TVirtualStringTree для хранения указателей на записи, при получении данных из узла в обработчике OnNewText возвращается указатель с другим адресом, чем тот, который был сохранен в дереве. Это проблема, так как для сохранения измененных данных в базу требуется ссылаться на оригинальную запись.

Ответ: Проблема заключается в том, что вы не сохраняете указатель на данные в узле дерева, а вместо этого выделяете новую запись TTherapData для каждого узла. Чтобы решить эту проблему, вам нужно использовать дополнительную запись, которая содержит указатель на данные, и использовать эту запись в качестве данных узла.

Пример кода на Object Pascal (Delphi):

type
  TVTNodeData = record
    TherapData: PTherapData;
  end;
  PVTNodeData = ^TVTNodeData;

procedure TfmPatient_Conslt.vstRxList_AsgInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  NodeData: PVTNodeData;
begin
  NodeData := Sender.GetNodeData(Node);

  while (FTherapDataList[FTherapDataListAsg_Iter]^.Selected <> 1) do
    Inc(FTherapDataListAsg_Iter);

  NodeData^.TherapData := FTherapDataList[FTherapDataListAsg_Iter];

  Inc(FTherapDataListAsg_Iter);
end;

procedure TfmPatient_Conslt.vstRxList_AsgGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
  NodeData: PVTNodeData;
  TherapData: PTherapData;
begin
  NodeData := Sender.GetNodeData(Node);
  if Assigned(NodeData) and Assigned(NodeData.TherapData) then begin
    TherapData := NodeData.TherapData;
    if (Column = 0) then
      CellText := TherapData^.TherapName
    else if (Column = 1) then
      CellText := TherapData^.TherapInstr;
  end;
end;

Примечание: Не забудьте освободить память, выделенную для managed типов, таких как строки или интерфейсы, в пользовательских данных узла, если это необходимо. В вашем случае есть только один указатель на поле, которое не требует никакой финализации (при условии, что вы освобождаете память, выделенную для записей PTherapData, когда освобождаете FTherapDataList).

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

Вопрос связан с проблемой сохранения данных в базе при использовании TVirtualStringTree для хранения указателей на записи, где указатель на данные в узле дерева возвращается с другим адресом, чем тот, который был сохранен в дереве, что затрудняет сохранен


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:01:34/0.024726867675781/1