TreeViewで最後に開いたノードを開かせるには


でん  2005-07-27 00:21:41  No: 16611

TreeViewで最後に開いたノードを開かせる方法がわかりません。

TreeView1.Selected.textにて最後に開いたノードを取得し、
Iniファイルに保存まではできました。
次回起動時(FormCreate時)に、そのツリーを開く方法がわからず、
行きづまっています。

どなたか、アドバイスをお願いいたします。


でん  2005-07-27 00:58:06  No: 16612

とりあえず…
ちからワザで、できたような感じがしますが、
もっとスマートな方法がございましたら、アドバイスをお願いいたします…<(_ _)>

  While (s <> ZenkaiNoFolderPath) and (i < (TreeView1.Items.Count-1)) do
  begin
    s := TreeView1.Items[i].text;
    TN := TreeView1.Items[i].Parent;
    while Assigned(TN) do begin
      if RightStr(TN.Text ,1 ) = '\' then
      begin
      s := TN.Text+s;
      end else begin
      s := TN.Text+'\'+s;
      end;
      TN := TN.Parent;
    end;
  i := i +1;
  end;
  TreeView1.Items[i-1].Selected := true;


篠田雅夫  2005-07-27 02:09:01  No: 16613

スマートでないですが、一つの法として\マークは割愛

procedure TForm1.Button1Click(Sender: TObject);
var
  ZenkaiNoFolderPath: string;
  cur: TTreeNode;
begin
  ZenkaiNoFolderPath := 'rootdata1data3';
  cur := TreeView1.Items.GetFirstNode;
  cur := OhHit(ZenkaiNoFolderPath, cur);
  if cur <> nil then begin
    TreeView1.Selected := cur;
    TreeView1.SetFocus;
  end;
end;

function OhHit(fullpath: string; cur: TTreeNode): TTreeNode;
var
  i: integer;
  bknode: TTreeNode;
  find: string;
begin
  result := nil;
  find := '';
  bknode := cur;
  while bknode <> nil do begin
    find := bknode.Text + find;
    bknode := bknode.Parent;
  end;
  if fullpath = find then begin
    result := cur;
    exit;
  end;

  for i := 0 to cur.Count - 1 do begin
    result := OhHit(fullpath, cur.Item[i]);
    if result <> nil then exit;
  end;
end;


風の又三郎  2005-08-08 19:26:53  No: 16614

小難しいことをしなくても Selected.AbsoluteIndex をSave、Load するだけでいけるのではないか。
Save
 No := TreeView1.Selected.AbsoluteIndex;

Load
 TreeView1.Selected := TreeView1.Items[No]


風の又三郎さんへ  2005-08-08 19:52:55  No: 16615

それだとSave後の変更には対処できないですよ。


foge  2005-08-09 12:18:29  No: 16616

OnCloseなりOnDestroyなりでSaveすれば問題ないのでは?


どうかな?  2005-08-09 18:49:22  No: 16617

対象がファイルやフォルダである限り、セーブ後にそのパスの階層に影響する変更がある場合、風の又三郎さんのAbsoluteIndexはその意味をなくすはずですが...。


だけど  2005-08-09 19:22:39  No: 16618

ツリー表示するのは、ファイル・ディレクトリだけではないですけど


だけどさんへ  2005-08-09 21:59:15  No: 16619

今回の発言者のテーマはファイル・ディレクトリですよ。
2005/07/26(火) 15:58:06のでんさんのコードを見ればわかると思います。


anone  2005-08-09 22:35:15  No: 16620

最後にセーブした後の変更については、どんな場合もだめでしょう。
そもそも最後に選択されていた項目が削除されていることだってありえますし。
ですから、そこは考慮しないと。なかった場合は、一番上を選択するとか。

AbsoluteIndex もそれとテキストを一緒に覚えておけば完璧でしょう。


ところで・・・  2005-08-09 23:58:10  No: 16621

> AbsoluteIndex もそれとテキストを一緒に覚えておけば完璧でしょう。
同じフォルダ名・ファイル名が異なる階層にいくつも存在している場合、
実際には違うフォルダ(ファイル)でも、偶然、テキストもAbsoluteIndexも一致することがありませんか?

自分なら、おとなしくフルパスを保存するようにします。


行き着くところ  2005-08-10 00:07:31  No: 16622

ところで・・・さんの意見はごもっともです。
そしてでんさんと篠田雅夫さんのコードがこの中で答えになっているのでしょう。
個人的にはリカーシブの篠田雅夫さんのコードが好きですが…。


anone  2005-08-10 02:47:22  No: 16623

> 自分なら、おとなしくフルパスを保存するようにします。

なるほど。そうですね。これが一番簡単ですね。


↑解決になってないです  2005-08-10 18:25:42  No: 16624

> 自分なら、おとなしくフルパスを保存するようにします。
フルパスでTreeViewの階層を展開するのがテーマですよね。


|」`)  2005-08-11 01:58:04  No: 16625

> ↑解決になってないです
> フルパスでTreeViewの階層を展開するのがテーマですよね。
と、ただスレ汚しするだけなら誰でもできます。
そういうあなたこそ、解決に近づく回答したらどうですか?
回答を出していないのは、あなたも同じでしょう(以下略
(それとも「でん」さん本人?)

とまぁ、過激反応するの汚しなので、アイディアぐらいは出してみる。
1)StringReplaceで\を改行コードまたは「,(カンマ)」に置換する。
2)TStringList.Text or CommaText でパス毎に分割。
3)ルートから、そのパスをたどって下の階層に降りていく。
4)最後に見つかったNodeを選択する。

\\で始まるネットワークのパスは・・・保存しないとか。

以上。


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

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






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