> 後で,再度見直しておきますので,とりあえずということで.
結果的に,その関数のコードを以下のようにすると,
大文字,小文字の区別なしに検索できるようです.
釈迦に説法かも知れませんが,
この修正では,コンポーネントの再登録は必要ありませんので.
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;
|