TreeNode


ほわいと  2007-06-19 09:20:33  No: 26735

はじめまして。
よろしくお願いします。

TreeNodeにて各ノードにindexをつけたいと思っているのですが
(親や子供、孫などに関係なくindexをつけたい)
どのようにすればいいのでしょうか?

具体的には選択されたノードのインデックスに対応する配列を呼び出し金額を画面に表示するというものです。

VBにくらべ参考ページが少なくこれ!というものが無く質問させていただきました。
よろしくお願いします。


TS  2007-06-19 16:07:27  No: 26736

TreeNodeは元から配列をもっているのでは
getnodeat(x,y)


zszdgers  2007-06-19 16:56:39  No: 26737

TTreeNode.AbsoluteIndex
TTreeNode.ItemId

Helpを読みましょう。
意味が分からなくても、目を通すだけでもしてください。


ホワイト  2007-06-19 18:32:37  No: 26738

お返事ありがとうございます。

ヘルプを読み改めて組んでみましたが・・・やはり理解ができませんでした。
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;

上記のソースを組んでみましたが、これでは和歌山産の低品質のものと敦煌の低品質なものを区別することはできませんよね・・?

答えを頂くのは自分の力にもならないので、もう少しヒントを頂けたら幸いです。
よろしくお願いします。


zszdgers  2007-06-19 19:19:08  No: 26739

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;


ぶらっく  2007-06-19 19:35:45  No: 26740

金額だけなら、AddObjectでノードに格納しておく別解もありかな。


ホワイト  2007-06-19 20:51:45  No: 26741

>>zszdgers様
レスありがとうございます。
なるほど・・そういう使い方をするのですか・・勉強になります。
AbsoluteIndexのIndex番号は上から順に番号が打たれていくということでいいのですか?

>>ぶらっく様
レスありがとうございます。
AddObjectとは裏で値を保持できるということでしょうか?

質問ばかりですいません。


TS  2007-06-19 22:06:18  No: 26742

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


Basser  2007-06-19 23:00:55  No: 26743

>AddObjectとは裏で値を保持できるということでしょうか?

AddObject, AddChildObject をヘルプで見て下さい。
第3引数の Ptr で 金額をPointerにキャストすることによって、
アドレスのように見せかけて保持しておくことが出来るということです。

4バイトサイズ制限に問題が無ければこの方法がいいのではないでしょうか? 
TTreeView.OnChange が発生した場合、

  Integer(Node.Data)

とすれば金額が取得できます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加