喫茶XRAYトップページ

[スレッド全体
]

[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