喫茶XRAYトップページ

[スレッド全体
]

[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