いくつかのファイルの説明を表示するフォームにcxTreeViewがあります。説明の1つをクリックして、ファイル名を返すオプションを利用できるようにしたいと思います。これを行うには、ツリービューに追加のデータを保存する必要があります。これが私の問題です。
これを行うにはどうすればよいですか:ファイル名と説明の両方を保存し、説明だけを表示しますが、ダブルクリックしてファイル名を取得しますか?
いくつかのファイルの説明を表示するフォームにcxTreeViewがあります。説明の1つをクリックして、ファイル名を返すオプションを利用できるようにしたいと思います。これを行うには、ツリービューに追加のデータを保存する必要があります。これが私の問題です。
これを行うにはどうすればよいですか:ファイル名と説明の両方を保存し、説明だけを表示しますが、ダブルクリックしてファイル名を取得しますか?
TcxTreeViewを緊急に使用する必要がない場合は、(可能であれば)このタスクにTcxTreeListを使用できると思います。TcxTreeListでは、新しい列を追加して、その列にファイル名を保存できます。次に、この列を非表示にします。
TcxTreeViewに依存する必要がある場合、文字列などのデータをTTreeNodeに直接格納するオプションはありません。任意のオブジェクトへのポインタをTTreeNodeのプロパティ「Data」に格納できます。
両方の回答で、ウォーレンが最初に指摘したように、プロパティを使用してデータを保存できるTcxTreeView
標準を使用することがここで言及されています。これらの考えを例を挙げて完成させます。TTreeNode
his answer
TTreeNode.Data
アップデート:
この投稿の以前のバージョンは、スペースが自動的に割り当てられている定数文字列に対してのみ機能します。変数をに渡す必要がある場合はTTreeNode.Data
、自分でメモリを割り当てて解放する必要があります。簡単なヘルパー関数を使用した例を次に示します。
AddFileNode
ヘルパー関数は、の名前でノードをに追加し、スペースItems
を割り当て、関数を使用して渡されたをコピーします。ParentNode
FileDesc
FileName
TTreeNode.Data
StrNew
データを変更する必要がある場合は、割り当てられたメモリを解放し(または、より適切ですが、少し複雑になります)、割り当てられたメモリを割り当て、スペースを割り当てて、新しい値をコピーする必要があります。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;
ノードが通常のTTreeNodeの場合、NodeオブジェクトでData:Pointer値を使用できます。
ツリー内のノードがタイプの場合、TcxTreeListNode
必要なデータ値を格納する機能が含まれています。ソースを見ると、ノードレベルで次のプロパティが表示されます。
property ValueCount: Integer read GetValueCount;
property Values[Index: Integer]: Variant read GetValue write SetValue;