TreeViewで最後に開いたノードを開かせる方法がわかりません。
TreeView1.Selected.textにて最後に開いたノードを取得し、
Iniファイルに保存まではできました。
次回起動時(FormCreate時)に、そのツリーを開く方法がわからず、
行きづまっています。
どなたか、アドバイスをお願いいたします。
とりあえず…
ちからワザで、できたような感じがしますが、
もっとスマートな方法がございましたら、アドバイスをお願いいたします…<(_ _)>
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;
スマートでないですが、一つの法として\マークは割愛
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;
小難しいことをしなくても Selected.AbsoluteIndex をSave、Load するだけでいけるのではないか。
Save
No := TreeView1.Selected.AbsoluteIndex;
Load
TreeView1.Selected := TreeView1.Items[No]
それだとSave後の変更には対処できないですよ。
OnCloseなりOnDestroyなりでSaveすれば問題ないのでは?
対象がファイルやフォルダである限り、セーブ後にそのパスの階層に影響する変更がある場合、風の又三郎さんのAbsoluteIndexはその意味をなくすはずですが...。
ツリー表示するのは、ファイル・ディレクトリだけではないですけど
今回の発言者のテーマはファイル・ディレクトリですよ。
2005/07/26(火) 15:58:06のでんさんのコードを見ればわかると思います。
最後にセーブした後の変更については、どんな場合もだめでしょう。
そもそも最後に選択されていた項目が削除されていることだってありえますし。
ですから、そこは考慮しないと。なかった場合は、一番上を選択するとか。
AbsoluteIndex もそれとテキストを一緒に覚えておけば完璧でしょう。
> AbsoluteIndex もそれとテキストを一緒に覚えておけば完璧でしょう。
同じフォルダ名・ファイル名が異なる階層にいくつも存在している場合、
実際には違うフォルダ(ファイル)でも、偶然、テキストもAbsoluteIndexも一致することがありませんか?
自分なら、おとなしくフルパスを保存するようにします。
ところで・・・さんの意見はごもっともです。
そしてでんさんと篠田雅夫さんのコードがこの中で答えになっているのでしょう。
個人的にはリカーシブの篠田雅夫さんのコードが好きですが…。
> 自分なら、おとなしくフルパスを保存するようにします。
なるほど。そうですね。これが一番簡単ですね。
> 自分なら、おとなしくフルパスを保存するようにします。
フルパスでTreeViewの階層を展開するのがテーマですよね。
> ↑解決になってないです
> フルパスでTreeViewの階層を展開するのがテーマですよね。
と、ただスレ汚しするだけなら誰でもできます。
そういうあなたこそ、解決に近づく回答したらどうですか?
回答を出していないのは、あなたも同じでしょう(以下略
(それとも「でん」さん本人?)
とまぁ、過激反応するの汚しなので、アイディアぐらいは出してみる。
1)StringReplaceで\を改行コードまたは「,(カンマ)」に置換する。
2)TStringList.Text or CommaText でパス毎に分割。
3)ルートから、そのパスをたどって下の階層に降りていく。
4)最後に見つかったNodeを選択する。
\\で始まるネットワークのパスは・・・保存しないとか。
以上。
ツイート | ![]() |