Max Diesel писал(а):Хм... действительно, эта функция шустрая, она работает примерно в 25-ть раз быстрее чем штатная функция "MatchesMask"
Вот и нашлись те самые 25 раз...
Max Diesel писал(а):и качество определения соответствия маске вроде бы очень высокое
Могу обосновать её работу:
1. Единственный символ шаблона, которому может соответствовать пустая строка в имени - это '*', поэтому эта проверка должна быть первой.
2. Если в шаблоне встретилась '*', то мы можем заменить её на подстроку любой длины (от 0 до длины всей оставшейся части строки). Будем перебирать все варианты в порядке увеличения длины, т. е. пропускать на 1 символ больше после каждой неудачи.
3. Если в шаблоне есть несколько '*', то при неудаче достаточно возврата к последней. Увеличение числа пропускаемых символов у более ранней '*' не может улучшить результат, т. к. подстрока между '*' уже соответствует участку шаблона, при этом величина сдвига уменьшиться не может, а её увеличение возможно и за счёт последней '*'.
4. Если строка закончилась, то это означает конец проверки. Результат соответствует тому, достигнут ли конец шаблона. Это объясняется тем, что единственный символ шаблона, который может что-то изменить - это '*'. Однако, количество пропущенных символов уменьшить нельзя, а его увеличение не сможет изменить результат (конец строки будет достигнут ещё раньше). Кроме того, в шаблоне не могут остаться только '*', т. к. проверка конца строки делается после проверки на '*' в шаблоне.
Max Diesel писал(а):Мне даже стало немного жаль что функция "MatchesMask" в программе используется не очень часто, а то можно было бы заменить ее на эту супербыструю функцию и получить значительное увеличение скорости...
Ну, есть поиск файлов и окрашивание по поисковым запросам...
Хотя я не уверен, используется ли она в поиске... Наверное, нет.
Max Diesel писал(а):Как я уже упомянул чуть выше, вряд ли затраченные на распознание нескольких расширений операции будут оправданы результатом. Фактически это значительно снизило бы скорость чтения листинга, то есть вход в каталог происходил бы дольше.
За счёт чего? Если просматривать имя файла с конца на наличие совпадения с одним из расширений, то время сравнения не зависит от наличия знака '.' в сравниваемых строках. Единственное увеличение времени возможно из-за большей длины строки для сравнения, однако это зависит исключительно от пользователя и того, что он хочет...
Max Diesel писал(а):Использование же совокупности масок вместо совокупности разделенных точкой расширений предположительно должно привести к большему расходу памяти (String vs TStringList), поэтому хотя вариант при учете неплохих результатов функции определения соответствия маске и кажется мне занятным, но тем не менее он лишь может попасть в список возможных нововведений.
При небольшой модификации функции проверки соответствия шаблону, возможно использование строки масок, разделённых символом ':'.
При этом время сравнения увеличивается незначительно (если стараться не использовать '*' в шаблонах). Если в шаблоне есть только текст и '?', то время сравнения увеличится не более чем в 2 раза (думаю, меньше), однако использование, например
вместо
даёт заметный выигрыш в скорости.
Кстати, строки я написал именно так, как предлагаю их хранить и обрабатывать... Почему начало строки "::"? Для проверки конца (а точнее начала) строки при сравнении с шаблоном.
Ещё вопрос. Есть способ указать цвет для папок не поисковым запросом? А то как-то не очень рационально здесь поисковый запрос использовать...