Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2011.09.25;
Скачать: [xml.tar.bz2];

Вниз

AnsiCompare и StrList.Find   Найти похожие ветки 

 
BMouradov   (2009-03-20 16:43) [0]

Подскажите, уважаемые, почему код выдает разные результаты? KOL 2.87.

uses KOL;
begin
 if AnsiCompareStr("R", "d") < 0 then
   ShowMessage("<")
 else
   ShowMessage(">=");    //  <--

 if StrComp("R", "d") < 0 then
   ShowMessage("<")      // <--
 else
   ShowMessage(">=");
end.

обе функции должны работать с учетом регистра, и в области латинских букв вроде должны дать одинаковые резултьтаты?

В результате, процедура StrList.Find работает только если сделать StrList.Sort(False), хотя по документации должно быть StrList.Sort(True). Ошибка ли это? Если да, то исправлена ли в последних версиях KOL?


 
mdw ©   (2009-03-20 17:51) [1]

Сталкивался с таким, не фига, результат разный получается. Функции AnsiCompareStr и StrComp по разному работают.

Еще ньюанс, если в списке несколько одинаковых строк, то не факт, что будет найдена первая. Просто удовлетворяюшая условию, поэтому если нужна первая, нужно еше от найденой строки назад цикл делать, пока равна (Пол дня убил пока понял в чем дело...:().


 
mdw ©   (2009-03-20 19:31) [2]

Это я уже StrList.Find имел в виду.


 
Vladimir Kladov ©   (2009-03-22 19:50) [3]

function Find(const S: AnsiString; var Index: Integer): Boolean;
   {* Returns Index of the first string, equal or greater to given pattern, but
      works only for sorted TStrList object
. Returns TRUE if exact string found,
      otherwise nearest (greater then a pattern) string index is returned,
      and the result is FALSE. }


 
mdw   (2009-03-22 22:14) [4]

2 Vladimir Kladov
Владимир, естественно список отсортирован. Но "Returns Index of the first string" выполняется не всегда, вернеее смотря что понимать, под ПЕРВЫМ. Если первая найденая, то да, но не факт, что первая найденая, стоит первой в списке среди одинаковых строк (если их несколько).


 
BMouradov   (2009-03-23 01:42) [5]

Даже если все элементы разные, не выполняется "Returns TRUE if exact string found". Find ищет не только exact, но и case-insensitive.
Почему же при Sort используется StrComp, а при Find - AnsiCompareStr?


 
mdw ©   (2009-03-23 10:56) [6]

AnsiSort() используйте тогда.


 
Vladimir Kladov ©   (2009-03-23 15:53) [7]

Да, я понял, в чём претензия. Дело в том, что ищет Find методом деления пополам. Это намного быстрее, чем каждый раз просматривать с самого начала. Но если строки совпали, то какая должна быть уже разница... Или тогда организуйти поиск сами, или используйте Find и после него небольшой пробег назад до первой несовпавшей строки. Вообще-то когда я делал этот Find, я думал прежде всего о списках строк, в которых одинаковых нет.


 
BMouradov   (2009-03-23 19:02) [8]

Это претензия от mdw. Я же пишу о другом - по документации Find должен искать строки case sensitive, а в реальности - case insensitive. Иногда это существенно! Также, в документации к Find тогда должна быть указана функция, чем сортировать: то ли Sort(False), то ли AnsiSort... Или, может сделать отдельную процедуру Find_NoCase?

Так же и AnsiCompareStr вроде должен был выдать False, а выдает True. То ли в документации непорядок, то ли эти функции выполняют не совсем то, что от них ждут, то ли я не понимаю, а почему они именно так работают. Может кто-нибудь объяснить?



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2011.09.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.003 c
1-1266349494
LightGreen
2010-02-16 22:44
2011.09.25
Деактивация формы при клике на popup-окне


15-1306787399
Юрий
2011-05-31 00:29
2011.09.25
С днем рождения ! 31 мая 2011 вторник


15-1305557376
Kerk
2011-05-16 18:49
2011.09.25
Подскажите с настройкой фильтров Outlook


2-1307346032
harisma
2011-06-06 11:40
2011.09.25
Цикл по элементам TInterfaceList


2-1307190079
Alex_C
2011-06-04 16:21
2011.09.25
Совет по использованию критических секций.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский