TVirtualTreeView + TXMLDocument ???

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TVirtualTreeView + TXMLDocument ???

Сообщение ViTality » 14.03.2008 02:29:41

Lazarus/FPC 0.9.24 который зарелизеный.
TVirtualTreeView - который Сергей Смирнов выкладывал на этом сайте
для работы с XML использую стандатрные модули DOM, XMLRead.

Чтобы не дублировать информацию из XML-фала создал такой тип записи для ВиртуалТри:
Код: Выделить всё
PMyRec=^TMyRec;
TMyRec=record
  f1:PWideString;
  f2:PWideString;
  f3:PWideString;
end;


в процедуре создания формы пишу:
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
var
   newvn:PVirtualNode;
   data:PMyRec;
   nod:TDOMNode;
begin
  VirtualStringTree1.NodeDataSize := SizeOf(TMyRec);

  doc:=TXMLDocument.Create;
  readxmlfile(doc,'test.xml');
  newvn:=VirtualStringTree1.AddChild(nil);
  data:=virtualstringtree1.GetNodeData(newvn);
  nod:=doc.DocumentElement.ChildNodes.Item[0];
  if assigned(data) then
  begin
    data^.f1:=pointer(doc.DocumentElement.ChildNodes.Item[0].TextContent);
       data^.f2:=pointer(doc.DocumentElement.ChildNodes.Item[1].TextContent);
       data^.f3:=pointer(doc.DocumentElement.ChildNodes.Item[2].TextContent);
  end;
end;


далее хочу вывести имя созданого виртуалнода в процедуре GetText:

Код: Выделить всё
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  Data: PMyRec;
begin
  Data := Sender.GetNodeData(Node);
  if Assigned(Data) then
    CellText := widestring(data^.f1^);
end;



в итоге невнятно ругаеться при компиляции, что я не так пишу?
Последний раз редактировалось ViTality 14.03.2008 10:22:56, всего редактировалось 1 раз.
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Сообщение *vmr » 14.03.2008 02:42:49

Где именно ругается?

А вообще страшный код: \
Код: Выделить всё
data^.f1:=pointer(doc.DocumentElement.ChildNodes.Item[0].TextContent);
data^.f2:=pointer(doc.DocumentElement.ChildNodes.Item[1].TextContent);
data^.f3:=pointer(doc.DocumentElement.ChildNodes.Item[2].TextContent);

Не уверен что это будет работать корректно
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Сообщение Sergei I. Gorelkin » 14.03.2008 10:13:06

Естественно оно не будет работать. Результат вызова TextContent помещается во временную переменную, которая зачищается при выходе из функции, в результате все указатели из data указывают в никуда.
Я бы привязывал узел дерева просто к нужному элементу DOM, а содержимое получал бы в ф-ции VirtualStringTree1GetText.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение ViTality » 14.03.2008 10:17:43

так в том то и дело что нормаьной ошибки не выдает. выскакивает окошко про "когданибудь здесь будет окошко ассемблера" и пытаеться найти wstrings.inc.
Что код страшный знаю, но ничего толкового больше в голову не пришло. Можно конечно все данные перенести в дерево а потом освободить документ, но тогда в момент заполнения дерева памяти будет сжираться в 2 раза больше.

Да почитал тут еще понял что то что я делаю некоректно. Нельзя делать указатель на свойство, т.к. оно получаеться с помошью функции и нехраниться в чистом виде где либо.
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Сообщение ViTality » 14.03.2008 10:22:05

Sergei I. Gorelkin
это был мой запасной вариант. но видимо его и придеться использовать. спасибо.
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

Рейтинг@Mail.ru