у меня 5.5.1
Баг 1.- Код: Выделить всё
...
vstMainTree.OnClick :=@vstMainSelectNode;
....
procedure TFEditor.vstMainSelectNode(Sender: TObject);
begin
SelectedItem(Sender);
end;
...
procedure TFEditor.SelectedItem(Sender: TObject);
var
Item:TObject;
Tree:TVirtualStringTree;
LastNode:PVirtualNode;
DataNode:PVirtualRecord;
begin
Tree:=vstMainTree;
Item:=nil;
SelectList.Clear;
LastNode:=Tree.GetFirstSelected;
while Assigned(LastNode) do
begin
DataNode := Tree.GetNodeData(LastNode);
if (Assigned(DataNode)and Assigned(DataNode^.Item)) then
begin
Item:=TObject(DataNode^.Item);
if (SelectList.IndexOf(Item)=-1)then
begin
SelectList.Add(Item);
end;
end;
LastNode:=Tree.GetNextSelected(LastNode);
end;
ShowInspector(Sender);
StatusBar1.Panels.Items[0].Text:=format('Выбрано: %d',[SelectList.Count]);
end;
см. скриншот
https://yadi.sk/i/skyEcHX2sZBLoЕсли кликать в зеленой зоне, то справа в инспекторе появляются выбранные объекты. Если в красной зоне, то выделяется строка, но кол-во выделенных объектов не меняется. Сейчас через таймер с задержкой сделал этот алгоритм, и все вроде хорошо, но в другом окне, где нет такой задержки все по прежнему.
Баг 2.С заголовками столбцов я вот не разобрался. Программа падает, если делаю обновление содержимого компонента вместе с пересозданием заново заголовков. Она при одни действиях работает, при других падает. Например если в списке TreeView выбираю нужный мне вариант таблицы, то VST заполняется. Десять раз кликаю, десять раз работает. Тут же нажимаю "обновить" через контекстное меню - падаем. Как только исправил код, исключив
- Код: Выделить всё
vstMainTree.Header.Columns.Clear;
на такой код
- Код: Выделить всё
procedure TFEditor.QueryInitHeader(Sender: TObject);
var
i :integer;
Column :TVirtualTreeColumn;
begin
for i:=0 to high(qdHeaders) do
begin
if vstMainTree.Header.Columns.Count<=i then
Column :=vstMainTree.Header.Columns.Add
else
Column :=vstMainTree.Header.Columns.Items[i];
qdHeaders[i].ColumnID :=Column.ID;
Column.Text :=qdHeaders[i].Caption;
Column.Width :=qdHeaders[i].Width;
Column.Hint :=qdHeaders[i].Hint;
end;
for i:=vstMainTree.Header.Columns.Count-1 downto Length(qdHeaders) do
begin
vstMainTree.Header.Columns.Delete(i);
end;
end;
все работает везде.
Как вариант, проблема в моей неопытности и тонкостях распределения памяти у компонента. Но его в таких ситуациях очень сложно отлаживать, потому что вылетает не на моем коде или коде VST, а гораздо глубже всегда. Так, что толку от стека вызовов ноль почти.