はじめまして。
よろしくお願いします。
TreeNodeにて各ノードにindexをつけたいと思っているのですが
(親や子供、孫などに関係なくindexをつけたい)
どのようにすればいいのでしょうか?
具体的には選択されたノードのインデックスに対応する配列を呼び出し金額を画面に表示するというものです。
VBにくらべ参考ページが少なくこれ!というものが無く質問させていただきました。
よろしくお願いします。
TreeNodeは元から配列をもっているのでは
getnodeat(x,y)
TTreeNode.AbsoluteIndex
TTreeNode.ItemId
Helpを読みましょう。
意味が分からなくても、目を通すだけでもしてください。
お返事ありがとうございます。
ヘルプを読み改めて組んでみましたが・・・やはり理解ができませんでした。
TTreeNode.AbsoluteIndex
TTreeNode.ItemId
の2点を試してみましたがコンパイルエラーでした。
getnodeat(x,y)
の解説ページにてサンプルを見て処理をくんだのですが、これもうまくいきませんでした。。
具体的には以下のような処理を組みたいと思っています。
//----------------------------------------------------------------
□うめぼし
|
--和歌山産
| |
| --低品質
| |
| --高品質
|
|
--愛媛産
|
--中国産
|
--敦煌産
|
--ハルピン産
|
--低品質
|
--高品質
金額 [ ]円
・・・
税 [ ]円
合計金額[ ]円
いずれかのノードをクリックすると金額等がエディットに表示されるというものです。
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if TreeView1.Selected.Text = 'うめぼし' then
begin
edt_kingaku.text := '500';
//以下略
end;
if TreeView1.Selected.Text = '和歌山産' then
begin
edt_kingaku.text := '800';
//以下略
end;
if TreeView1.Selected.Text = '敦煌産' then
begin
edt_kingaku.text := '200';
//以下略
end;
end;
上記のソースを組んでみましたが、これでは和歌山産の低品質のものと敦煌の低品質なものを区別することはできませんよね・・?
答えを頂くのは自分の力にもならないので、もう少しヒントを頂けたら幸いです。
よろしくお願いします。
AbsoluteIndex を使う例です。
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
i: integer;
begin
if node=nil then Exit;
i:= 0;
case node.AbsoluteIndex of
0 : i:= 500;//□うめぼし
1 : i:= 800;//--和歌山産
2 : i:= 200;// --低品質
3 : i:= 500;// --高品質
4 : i:= 400;//--愛媛産
5 : i:= 300;//--中国産
6 : i:= 200;// --敦煌産
7 : i:= 200;// --ハルピン産
8 : i:= 100;// --低品質
9 : i:= 200;// --高品質
else exit;
end;
Edit1.Text:= '金額 [' +IntToStr(i) +' ] 円';
end;
金額だけなら、AddObjectでノードに格納しておく別解もありかな。
>>zszdgers様
レスありがとうございます。
なるほど・・そういう使い方をするのですか・・勉強になります。
AbsoluteIndexのIndex番号は上から順に番号が打たれていくということでいいのですか?
>>ぶらっく様
レスありがとうございます。
AddObjectとは裏で値を保持できるということでしょうか?
質問ばかりですいません。
getnodeat(x,y)の使用例です
マウスが乗った時点で表示されます。
下記は私のコードではありません。
迂闊にも記載されてしたアドレスが分かりません
参考に
procedure TForm1.TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
i,j,k,l:integer;
tNode : TTreeNode;
msg:string;
begin
tNode.
label1.caption:='';
tnode:=treeview1.getnodeat(x,y);
i:=-1;j:=-1;k:=-1;l:=-1;
while tnode<>nil do begin
label1.caption:=tnode.text+'/'+label1.caption;
case tnode.Level of
0:i:=tnode.index; //品名
1:j:=tnode.index; //産地
2:k:=tnode.index;
3:l:=tnode.index;
end;//case
tnode:=tnode.parent;
end;//while
>AddObjectとは裏で値を保持できるということでしょうか?
AddObject, AddChildObject をヘルプで見て下さい。
第3引数の Ptr で 金額をPointerにキャストすることによって、
アドレスのように見せかけて保持しておくことが出来るということです。
4バイトサイズ制限に問題が無ければこの方法がいいのではないでしょうか?
TTreeView.OnChange が発生した場合、
Integer(Node.Data)
とすれば金額が取得できます。
ツイート | ![]() |