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

Перенос проекта с D6 на D-XE3: решение проблем с VirtualStringTree и Unicode

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

При переносе проекта с D6 на D-XE3 пользователи могут столкнуться с проблемами при сохранении и загрузке данных узла в событиях OnSaveNode и OnLoad в VirtualStringTree версии 5.10. Одна из таких проблем связана с некорректной обработкой Unicode.

Пользователь столкнулся с проблемой получения мусора при сохранении и загрузке данных узла в VirtualStringTree. В коде, который он предоставил, видно, что он пытается сохранить и загрузить данные узла, включая булево значение Owned, строку Symbol, currency AvgTarget и double PE. Однако, проблема заключается в том, что он не учитывает длину строки Symbol, что приводит к неправильному чтению данных при загрузке.

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

procedure TfMain.vstGridSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Stream: TStream);
var
  Data: PStkData;
begin
  Data := Sender.GetNodeData(Node);

  // Owned: boolean;
  Stream.Write(Data.Owned, SizeOf(boolean));

  // Symbol: string;
  Stream.Write(Length(Data.Symbol), SizeOf(Integer));
  Stream.Write(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Char));

  // AvgTarget: currency;
  Stream.Write(Data.AvgTarget, SizeOf(currency));

  // PE: double;
  Stream.Write(Data.PE, SizeOf(double));
end;

procedure TfMain.vstGridLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Stream: TStream);
var
  Data: PStkData;
begin
  Data := Sender.GetNodeData(Node);

  // Owned: boolean;
  Stream.Read(Data.Owned, SizeOf(boolean));

  // Symbol: string;
  Stream.Read(Length(Data.Symbol), SizeOf(Integer));
  SetLength(Data.Symbol, Length(Data.Symbol));
  Stream.Read(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Char));

  // AvgTarget: currency;
  Stream.Read(Data.AvgTarget, SizeOf(currency));

  // PE: double;
  Stream.Read(Data.PE, SizeOf(double));
end;

Приведенные выше примеры демонстрируют, как правильно сохранить и загрузить данные узла в VirtualStringTree с учетом Unicode. При записи данных в поток сначала записывается длина строки Symbol, а при чтении данных из потока сначала считывается длина строки Symbol, а затем сама строка.

В альтернативном ответе было предложено использовать BinaryWriter вместо низкоуровневых потоков. Однако, это решение не решает проблему с некорректной обработкой Unicode в коде пользователя.

В итоге, пользователь должен убедиться, что он правильно обрабатывает данные Unicode при сохранении и загрузке данных узла в VirtualStringTree. Использование правильного подхода к записи и чтению данных в поток поможет избежать проблем с мусором при загрузке данных.

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

При переносе проекта с D6 на D-XE3 необходимо решить проблемы с VirtualStringTree и Unicode при сохранении и загрузке данных узла в событиях OnSaveNode и OnLoad.


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

Получайте свежие новости и обновления по 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:47:18/0.0034520626068115/0