Итак, моя конечная цель - найти способ перечислить элементы (например, TListView в vsReport) с помощью кнопок добавления / удаления внутри клиентской области.
Пример:
|----------------|
|Old Item 1 X |
|Old Item 2 X |
|Add new item... |
| |
|----------------|
Если вам известен компонент, который делает это без всей этой дополнительной работы, пожалуйста, дайте мне знать!
Я выбрал красный закрывающий «X» и использую TJvTransparentButton (Jedi Components - JVCL) для его отображения. Он обрабатывает состояния нажатие / не нажатие и показывает только изображение. Изначально я использовал TButton, но мне не нужен был весь беспорядок вокруг глифа.
Теперь я сохраняю кнопку изображения в записи, связанной с каждым узлом.
Код выглядит следующим образом:
procedure TfrmMain.AddNewAccount(const Username, Password: String);
var
Data : PTreeData;
XNode : PVirtualNode;
Begin
XNode := vstAccounts.AddChild(nil);
If vstAccounts.AbsoluteIndex(XNode) > -1 Then
begin
Data := vstAccounts.GetNodeData(Xnode);
Data^.Column0 := Username;
Data^.Column1 := '';
Data^.DeleteButton := TJvTransparentButton.Create(nil);
With Data^.DeleteButton Do
begin
Parent := vstAccounts;
Left := 0;
Top := 0;
Width := 16;
Height := 16;
Anchors := [];
AutoGray := False;
BorderWidth := 0;
FrameStyle := fsNone;
Images.ActiveImage := iListView;
Images.ActiveIndex := 0;
end;
end;
end;
В событии OnAfterCellPaint я управляю позиционированием кнопки изображения следующим образом:
procedure TfrmMain.vstAccountsAfterCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellRect: TRect);
var
Data : PTreeData;
begin
If Column = 1 Then
begin
Data := vstAccounts.GetNodeData(Node);
If Assigned(Data) Then
begin
With Data^.DeleteButton Do
begin
BoundsRect := CellRect;
end;
end;
end;
end;
Проблема в том, что элемент не отображается вообще. Я знаю, что изображение из TImageList в порядке, потому что я могу создать кнопку во время разработки, и она отлично выглядит во время выполнения.
Я также знаю, что этот код должен работать, потому что, если я сделаю TJvTransparentButton обычным TButton (без изменения логики кода), он будет работать нормально и нормально отображаться!
Единственное, о чем я могу думать, это то, что TButton наследуется от TWinControl, а TJvTransparentButton наследуется от TControl.
Есть идеи?