Alex2013 писал(а):В общем это "неправильные пчелы и они делают неправильный мед" ....
2 Ошибка вылезает ВНУТРИ кода VT (и не спрашивайте меня как она вылезла в inputStr )....
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
Node: PVirtualNode;
Data: PLCLTextData;
begin
With VST3 do
begin
NodeDataSize := SizeOf(TLCLTextData);
Node := AddChild(nil );
Data := GetNodeData(Node);
Data^.T1:=NewStr('Вес в МТ'); Data^.T2:=NewStr('00000');
//ValidateNode(Node, False); // понятия не имею нужна ли это строка но что с ней что без нее.. результат тот-же . :idea:
end;
end;
NodeDataSize := SizeOf(TLCLTextData); - вот так низзя!
Размер устанавливается обязательно в OnGetNodeDataSize.
- Код: Выделить всё
OnGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
NodeDataSize := SizeOf(TLCLTextData);
end;
Суть в том, что VT сам обращается к OnGetNodeDataSize для понимания, каков размер для выделения памяти и оперированием данными.
А у вас там пусто!
Если структура данных чуть более чем немного сложная, то проще использовать классы.
- Код: Выделить всё
procedure TDM.LoadPrice(Sender: TBaseVirtualTree);
var D, P: PVirtualNode;
Data: PPrice;
begin
if not Assigned(Sender) then Exit;
Sender.Clear;
LoadTitle(Sender);
if Param.Date = 0 then Param.Date := Now;
InitParam(DM.q_Price, VarArrayOf(['pVisible', Ord(Param.Price_Is_Show), 'pDeleted', Ord(Param.Price_Is_Deleted), 'pDate', Param.Date]), tsOpen);
while not DM.q_Price.Eof do begin
D := FindTitleProduct(Sender, DM.q_PriceGroup.AsInteger);
P := Sender.AddChild(D);
Data := Sender.GetNodeData(P);
Data^ := TPrice.Create;
Data^.Load;
q_Price.Next;
end;
q_Price.Close;
FocusVirtualST(Sender, FindRecProduct(Sender, Param.RecPrice));
end;
А в описании одной строки прайса куча всякой всячины, в том числе и String. И не нужно мудрить с PString, с выделением памяти и прочим и прочим.
Несомненно, освобождать память нужно самому через OnFreeNode, но это очень просто:
- Код: Выделить всё
procedure TfFirms.vsPriceFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var Data: PPrice;
begin
Data := Sender.GetNodeData(Node);
if Assigned(Data^) then FreeAndNil(Data^);
end;
Соответственно, OnGetNodeDataSize:
- Код: Выделить всё
procedure TfFirms.vsPriceGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
NodeDataSize := SizeOf(PPrice);
end;
Всё очень просто и легко, если сперва читать документацию, а не наоборот.