したがって、ここでの私の最終的なゲームは、クライアント領域内の追加/削除ボタンを使用してアイテム(vsReportのTListViewなど)を一覧表示する方法を用意することです。
元:
|----------------|
|Old Item 1 X |
|Old Item 2 X |
|Add new item... |
| |
|----------------|
この余分な作業を一切行わずにこれを行うコンポーネントをご存知の場合は、お知らせください。
そこで、赤い閉じた「X」を選び、TJvTransparentButton(Jediコンポーネント-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から継承するということです。
何か案は?