喫茶XRAYトップページ


[7304] 【812_フォルダツリーとファイル一覧 ( 簡易エクスプローラの作成 )】に関して返信 削除
2014/3/6 (木) 18:16:52 OE 〔HomePage
[開発環境 XE5 Windows7(64)]

こんばんは、OEと申します。
よろしくお願い致します。

エクスプローラーっぽい機能を付けたくて、
表題のものを参考に勉強させて頂いてます。
素晴らしいものを公開して下さりMr.Xray様には大変感謝しております。
ありがとうございます。

さて今、解らないことがあります。

ボタンをクリックした時に、
左ツリーで任意のフォルダを開いた状態(展開した状態)にし、
右ビューであるファイルを選択した状態にしたいのです。

しかし、下記をしてみたものの思う結果が得られません。
(RootFolderから変わりませんでした)

procedure TForm1.Button1Click(Sender: TObject);
var
 s : string;
begin
  //plFolderTree1.RootFolder:='c:\';
  s :='C:\test\test';
  plFolderTree1.SelectFolder := s;
  showmessage(plFolderTree1.SelectFolder); // c:\ と表示される
end;


ソースコードを順に追って見てはいるのですが、
まだまだ知識不足で仕組みが理解できていません。
どこをどうすれば良いのかわからずにいます。

ご教示頂けると助かります。
よろしくお願い致します。

[7305] Re:【812_フォルダツリーとファイル一覧 ( 簡易エクスプローラの作成 )】に関して返信 削除
2014/3/6 (木) 22:58:55 Mr.XRAY
▼ OEさん,こんにちは.ようこそ.

> しかし、下記をしてみたものの思う結果が得られません。
> (RootFolderから変わりませんでした)


了解しました.後で確認しますので,スミマセンが,ちょっとお待ちください.

> ソースコードを順に追って見てはいるのですが、
> まだまだ知識不足で仕組みが理解できていません。
> どこをどうすれば良いのかわからずにいます。


他人の作成したコードの解読は難しいですよね.
もう,だいぶ前のコードなので,私自身も,
もしかしたら解読できないかも... (^^;


[7306] Re2:【812_フォルダツリーとファイル一覧 ( 簡易エクスプローラの作成 )】に関して返信 削除
2014/3/7 (金) 09:35:25 OE
Mr.Xrayさん

お手数ですが、よろしくお願いいたします。

全部展開は正常に動くので、plFolderTree1.Selected.Expand(true);
原因を見つければ解決するように思い、未熟ですが私も引き続きソースを勉強してみます。


[7307] Re3:【812_フォルダツリーとファイル一覧 ( 簡易エクスプローラの作成 )】に関して返信 削除
2014/3/8 (土) 19:21:29 Mr.XRAY
▼ OEさん

スミマセン.明日,時間ができたらやりますんで.
申し訳ありません.今,ちょっとトラブルがありまして.
石投げないでください m(_ _)m


[7309] Re4:812_フォルダツリーとファイル一覧返信 削除
2014/3/9 (日) 21:57:54 Mr.XRAY
今テストしました.
原因がわかりました.

TplFolderTree.SearchNodeFromPathAndSelect
という関数内で,
内部の処理で,大文字と小文字を区別してしまうのが原因でした.

  if Pos(FRootFolder, ASearchPath) = 0 then exit;

を以下に変更すれば可能ですが,

  if Pos(LowerCase(FRootFolder), LowerCase(ASearchPath)) = 0 then exit;

選択中のフォルダの直下のフォルダしか検索しない仕様になっています.
したがつて,C:\test\test
の,最初の test フォルダしか選択してくれません.

さて,どうするかですね.


[7310] Re5:812_フォルダツリーとファイル一覧返信 削除
2014/3/9 (日) 22:02:15 Mr.XRAY
>さて,どうするかですね.

必要であれば,その関数内の以下の部分を削除してください.

  ------------- ここから -----------------------------------

  //現在選択中のノードの下位ノード(孫を除く)のみを検索
  if Pos(FSelectFolder,ASearchPath) > 0 then begin
    if Selected <> nil then begin
      FolderName := ExtractFileName(ASearchPath);
      NowNode:=Selected;
      if NowNode.HasChildren then begin
        if NowNode.Count = 0 then begin
          SetFolderTreeNode(ExtractFilePath(ASearchPath), NowNode);
          NowNode.Expand(False);
        end;
        for i := 0 to NowNode.Count - 1 do begin
          if NowNode.Item[i].Text = FolderName then begin
            Result  := NowNode.Item[i];
            Result.Selected := True;
            Result.MakeVisible;
            FSelectFolder := ASearchPath;
            break;
          end;
        end;
      end;
    end;
  end;
  if Result <> nil then exit;
  ------------- ここまでを削除 -----------------------------------


後で,再度見直しておきますので,とりあえずということで.


[7311] Re6:812_フォルダツリーとファイル一覧返信 削除
2014/3/9 (日) 22:19:27 Mr.XRAY
> 後で,再度見直しておきますので,とりあえずということで.

結果的に,その関数のコードを以下のようにすると,
大文字,小文字の区別なしに検索できるようです.
釈迦に説法かも知れませんが,
この修正では,コンポーネントの再登録は必要ありませんので.

function TplFolderTree.SearchNodeFromPathAndSelect(Value: String): TTreeNode;
var
  ASearchPath : String;
  FolderName  : String;
  BehindPath  : String;
  NowNode     : TTreeNode;
  Index1      : Integer;
  Index2      : Integer;
  i           : Integer;
  ResFlag     : Boolean;
begin
  Result := nil;

  //ルートフォルダ
  if IncludeTrailingPathDelimiter(Value) = FRootFolder then begin
    Result := FRootNode;
    Result.MakeVisible;
    exit;
  end;
  //選択中のフォルダ
  if IncludeTrailingPathDelimiter(Value) = FSelectFolder then begin
    Result := Selected;
    exit;
  end;

  ASearchPath := ExcludeTrailingPathDelimiter(Value);
  if Pos(LowerCase(FRootFolder), LowerCase(ASearchPath)) = 0 then exit;

  //なければルートから順番に展開しながら検索
  NowNode := FRootNode;
  ResFlag := False;

  ASearchPath := FRootFolder;
  BehindPath  := ExcludeTrailingPathDelimiter(Value);
  while True do begin
    //\がなければ選択して終了
    Index1 := Pos('\', BehindPath);
    if Index1 = 0 then begin
      if ResFlag then begin
        Result := NowNode;
        Result.Selected := True;
        Result.MakeVisible;
        FSelectFolder := IncludeTrailingPathDelimiter(Value);
      end;
      exit;
    end;

    //\より後ろのパス名から先頭の名前だけをFolderNameに取出す
    BehindPath := Copy(BehindPath, Index1 + 1, Length(BehindPath));
    Index2 := Pos('\', BehindPath);
    if Index2 = 0 then begin
      FolderName:=BehindPath;
    end else begin
      FolderName := Copy(BehindPath, 1, Index2 - 1);
    end;

    if NowNode.HasChildren then begin
      if NowNode.Count = 0 then begin
        SetFolderTreeNode(ASearchPath, NowNode);
        NowNode.Expand(False);
      end;
    end;
    ResFlag := False;
    for i := 0 to NowNode.Count - 1 do begin
      if LowerCase(NowNode.Item[i].Text) = LowerCase(FolderName) then begin
        NowNode := NowNode.Item[i];
        ResFlag := True;
        break;
      end;
    end;
    ASearchPath := IncludeTrailingPathDelimiter(ASearchPath + FolderName);
    Application.ProcessMessages;
  end;
end;


[7314] Re7:812_フォルダツリーとファイル一覧返信 削除
2014/3/9 (日) 22:40:04 Mr.XRAY
> 結果的に,その関数のコードを以下のようにすると,
> 大文字,小文字の区別なしに検索できるようです.
> 釈迦に説法かも知れませんが,
> この修正では,コンポーネントの再登録は必要ありませんので.


まずい,大文字と小文字の処理が完全じゃないですね.
後で,再度見直ししますです.


[7322] Re8:812_フォルダツリーとファイル一覧返信 削除
2014/3/10 (月) 14:12:39 OE
Mr.Xrayさん

お忙しいところ、ありがとうございます。
ソースを見て勉強していたのですが、お手上げ状態だったので助かりました。
まだ不具合が残ってるとのことですが、
ひとまず私もこの新しいコードでまた勉強してみます。
引き続き、よろしくお願いいたします。


[7324] Re9:812_フォルダツリーとファイル一覧返信 削除
2014/3/10 (月) 15:21:28 Mr.XRAY
▼ OEさん

> 引き続き、よろしくお願いいたします。

了解しました.再度検討して,この関数の部分だけ修正したサンプルを
UP して更新します.

>ソースを見て勉強していたのですが、お手上げ状態だったので助かりました。

みんなそうやって悩んで成長していくのですね.
そして,プログラマーは「廃人」になっていくのです (^^;


INCM/CMT
Cyclamen v3.82