3

いくつかのファイルの説明を表示するフォームにcxTreeViewがあります。説明の1つをクリックして、ファイル名を返すオプションを利用できるようにしたいと思います。これを行うには、ツリービューに追加のデータを保存する必要があります。これが私の問題です。

これを行うにはどうすればよいですか:ファイル名と説明の両方を保存し、説明だけを表示しますが、ダブルクリックしてファイル名を取得しますか?

4

3 に答える 3

2

TcxTreeViewを緊急に使用する必要がない場合は、(可能であれば)このタスクにTcxTreeListを使用できると思います。TcxTreeListでは、新しい列を追加して、その列にファイル名を保存できます。次に、この列を非表示にします。

TcxTreeViewに依存する必要がある場合、文字列などのデータをTTreeNodeに直接格納するオプションはありません。任意のオブジェクトへのポインタをTTreeNodeのプロパティ「Data」に格納できます。

于 2012-06-23T10:53:55.600 に答える
1

両方の回答で、ウォーレンが最初に指摘したように、プロパティを使用してデータを保存できるTcxTreeView標準を使用することがここで言及されています。これらの考えを例を挙げて完成させます。TTreeNodehis answerTTreeNode.Data

アップデート:

この投稿の以前のバージョンは、スペースが自動的に割り当てられている定数文字列に対してのみ機能します。変数をに渡す必要がある場合はTTreeNode.Data、自分でメモリを割り当てて解放する必要があります。簡単なヘルパー関数を使用した例を次に示します。

AddFileNodeヘルパー関数は、の名前でノードをに追加し、スペースItemsを割り当て、関数を使用して渡されたをコピーします。ParentNodeFileDescFileNameTTreeNode.DataStrNew

データを変更する必要がある場合は、割り当てられたメモリを解放し(または、より適切ですが、少し複雑になります)、割り当てられたメモリを割り当て、スペースを割り当てて、新しい値をコピーする必要があります。ChangeFileNameこれには、前に割り当てられた文字列メモリを破棄し、スペースを割り当てて渡された値をコピーするを使用できFileNameます。

前に述べたように、あなたはあなた自身で記憶の処分の世話をする必要があります、そしてこれのためにOnDeletionイベントは最高の場所です。したがって、アイテムを追加するときに割り当てられたメモリを解放するこのイベントのハンドラーを記述します。

function AddFileNode(Items: TTreeNodes; ParentNode: TTreeNode;
  const FileName, FileDesc: string): TTreeNode;
begin
  Result := Items.AddChildObject(ParentNode, FileDesc, StrNew(PChar(FileName)));
end;

function ChangeFileName(TreeNode: TTreeNode; const FileName: string): Boolean;
begin
  Result := False;
  if Assigned(TreeNode.Data) then
  begin
    Result := True;
    StrDispose(PChar(TreeNode.Data));
    TreeNode.Data := StrNew(PChar(FileName));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  S := 'C:\FileName 1.xxx';
  AddFileNode(cxTreeView1.Items, nil, S, 'File 1');
  S := 'C:\FileName 2.xxx';
  AddFileNode(cxTreeView1.Items, nil, S, 'File 2');
end;

procedure TForm1.cxTreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
  if Assigned(Node.Data) then
    StrDispose(PChar(Node.Data));
end;

procedure TForm1.cxTreeView1DblClick(Sender: TObject);
var
  CurrentPos: TPoint;
  CurrentNode: TTreeNode;
begin
  CurrentPos := cxTreeView1.ScreenToClient(Mouse.CursorPos);
  if (htOnItem in cxTreeView1.GetHitTestInfoAt(CurrentPos.X, CurrentPos.Y)) then
  begin
    CurrentNode := cxTreeView1.GetNodeAt(CurrentPos.X, CurrentPos.Y);
    if Assigned(CurrentNode) and Assigned(CurrentNode.Data) then
      ShowMessage(PChar(CurrentNode.Data));
  end;
end;
于 2012-06-25T02:25:58.993 に答える
0

ノードが通常のTTreeNodeの場合、NodeオブジェクトでData:Pointer値を使用できます。

ツリー内のノードがタイプの場合、TcxTreeListNode必要なデータ値を格納する機能が含まれています。ソースを見ると、ノードレベルで次のプロパティが表示されます。

property ValueCount: Integer read GetValueCount;
property Values[Index: Integer]: Variant read GetValue write SetValue;
于 2012-06-23T11:08:02.220 に答える