Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск в TClientDataSet


Rem ©   (2003-12-22 17:02:00) 

TClientDataSet отказывается находить записи, если в условиях поиска присутствуют символы кириллицы. Может, есть какие-то дополнительные локальные настройки? А то искать вручную перебором записей долго.


Nikolay M.   (2003-12-22 22:31:00) [1]

А ведь я спрашивал насчет апдейтов! Может хоть на ссылки обратишь внимание?
http://ziet.zhitomir.ua:8890/bin/shMes.asp?idf=5&idm=3364
http://www.dore.ru/perl/nntp.pl?f=1&gid=9&mid=55120


sniknik   (2003-12-22 20:00:00) [2]

Rem © (22.12.03 17:47) [8]
2 способа ускорения (навскидку можно и больше наверное ежели подумать)

var
Field_sField: TField;
begin
Field_sField:= m_DataSet.FieldByName(a_sField);

вместо этого
(?????).FieldByName(a_sField).AsString (кстати где потерял? уверен что у тебя берет от правильного датасета? (так понял гдето with есть))
вставить
Field_sField.AsString
(исключается разбор заголовка на каждом присвоении, для длинных циклов сушественно)

и вот это (главный тормоз)
Result := (Pos(sTemp, sCurr) = 1);
просматривается вся строка находится вхождение ради чего? сравнить что это вхожденей сначала. а ведь достаточно сравнить первую букву чтобы знать что не подходит(а дальше сравнение бессмысленно, прикинь сколько операций лишних убереш). перепиши своей, с побуквенным сравнением (кстати AnsiUpperCase можно применять к буквам, но тут неизвестно может получится торможение вместо ускорения, тестить нужно).

но вообщето Locate у меня тоже работает(ло сейчас не пробовал). (может действительно не от того датасета?)


Rem   (2003-12-22 17:47:00) [3]

2 MV
да я и ищу руками... точно так же и ищу... да долго это получается - перебирать...
вот написал, так оно ищет нормально:

function TxDataSet.LocateEx(a_sField, a_sValue: string): boolean;
var
BM: TBookMark;
sTemp: string;
sCurr: string;
begin
Result := false;
if not Active then Exit;
sTemp := AnsiUpperCase(a_sValue);
DisableControls;
try
BM := GetBookmark;
try
First;
while not EOF do
begin
sCurr := AnsiUpperCase(FieldByName(a_sField).AsString);
Result := (Pos(sTemp, sCurr) = 1);
if Result then Exit;
Next;
end;
GotoBookmark(BM);
except
on Exception do GotoBookmark(BM);
end;
finally
EnableControls;
end;
end;


но... медленно...


MV   (2003-12-22 17:41:00) [4]

Ну, в отладчике глянь на значения
Grid.SelectedField.FieldName
и
m_sSearch
на всякий случай

И попробуй
MV (22.12.03 17:07) [4]


Rem   (2003-12-22 17:38:00) [5]

да че показывать?

пользователь набирает искомое значение m_sSearch, а оно его не находит:
m_DataSet.Locate(Grid.SelectedField.FieldName, m_sSearch, [loCaseInsensitive, loPartialKey]);


Nikolay M.   (2003-12-22 17:08:00) [6]

Апдейты на дельфи установлены?


MV   (2003-12-22 17:07:00) [7]

Для прикола попробуй "ручками",
while not .eof
...
.next
Что выходит?


JibSkeart   (2003-12-22 17:05:00) [8]

и у меня работает :))


MV   (2003-12-22 17:04:00) [9]

А у меня ищет. Покажи, как делаешь.


Rem   (2003-12-22 17:03:00) [10]

Имеется в виду поиск через Locate()


Наверх

Титульная страница Поиск, карта сайта Написать письмо