6

したがって、ここでの私の最終的なゲームは、クライアント領域内の追加/削除ボタンを使用してアイテム(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から継承するということです。

何か案は?

4

2 に答える 2

3

TJvTransparentButtonはTGraphicControlであり、親の背景の一部として表示されると思います(そのため、Tlabelは常に同じ親のTEditまたはTButtonの背後にあります)。
TButtonはTWinControlであるため、親の上、および同じ親内の他のWinControlの上または下にペイントされます。

したがって、セルの通常の描画が行われた後(BoundsRectの更新では不十分)、TJvTransparentButtonを再度ペイントするか、WinControlを使用します。
たとえば、TJvTransparentButtonを含むTPanelを使用すると機能するはずです。

免責事項:私はVirtualStringTreeやTJvTransparentButtonに精通していません...

于 2011-12-28T00:15:11.127 に答える
3

あなたはこれを間違った方法でやっています。TVirtualStringTreeインターフェイスを実装する独自のエディターを作成する必要がありIVTEditLinkます。次に、OnCreateEditorエディタを作成する必要がある場合は、次のようにします。

procedure TForm1.VSTCreateEditor(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
begin
  EditLink:=TStringEditLink.Create;
end;

あなたはここでより多くの情報を得ることができます。

于 2011-12-28T08:53:42.100 に答える