![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как
NDR © (2002-07-30 16:09:00)Поиск организован
form1.table1.Locate(dbgrid1.SelectedField.DisplayName,form1.edit1.text,[loPartialKey,loCaseInsensitive]);
Есть кнопка ("Найти далее") (как в Excel) по нажатию на которую.
должно искаться дальше. перебирая и сравнивая значения.
Как узнать. когда поиск был неудачен? null ?
Как организовать поиск внутри слов (по любой его части)
например ищем = BLACK
находим = HORSE BLACK
с Уважением, NDR
ЮЮ (2002-08-01 08:44:00) [21]Лично мне не нравится интерфей типа "найти"-"найти дальше".
Я предпочитаю найти сразу все записи посредством одного запроса и в случае если их много "вывалить" пользователю весь список в "поверхстоящем окне", с возможностью выбора записи и автоматической Locat-изацией оной в базовом наборе данных
NDR (2002-08-01 08:01:00) [22]Спасибо ! попробую !
с Уважением, NDR
FOX (2002-07-31 12:06:00) [23]Один из вариантов:
найти(Ctrl+F): FindExecute( QSMan, DBGrid.SelectedField)
искать дальше(F3): DBFindString(QSMan, DBGrid.SelectedField)
procedure TDM.FindExecute(DataSet: TDataSet; SelectedField: TField);
begin
Find_DataSet := DataSet;
Find_SelectedField := SelectedField;
FindDialog.Execute;
end;
function TDM.DBFindString(DataSet: TDataSet; SelectedField: TField): Boolean;
var
Bookmark: TBookmark;
FindText: string;
SearchString: string;
Step: Integer;
AnyCase: Boolean;
function StopCondition: Boolean;
begin
if Step > 0 then Result := DataSet.EOF else Result := DataSet.BOF;
end;
begin
Result := FALSE;
FindText := FindDialog.FindText;
if FindText = "" then Exit;
AnyCase := not (frMatchCase in FindDialog.Options);
if AnyCase then FindText := AnsiUpperCase(FindText);
if frDown in FindDialog.Options then Step := 1 else Step := -1;
DataSet.DisableControls;
Bookmark := DataSet.GetBookmark;
try
DataSet.MoveBy(Step);
while not StopCondition do
begin
SearchString := SelectedField.AsString;
if AnyCase then SearchString := AnsiUpperCase(SearchString);
if Pos(FindText,SearchString) > 0 then Break;
DataSet.MoveBy(Step);
end;
if StopCondition then
begin
DataSet.GotoBookmark(Bookmark);
MessageDlg("""" + FindDialog.FindText + """ - не найдено.",
mtWarning,[mbOK],0);
end
else Result := TRUE;
finally
DataSet.FreeBookmark(Bookmark);
DataSet.EnableControls;
end;
end;
procedure TDM.FindDialogFind(Sender: TObject);
begin
if DBFindString(Find_DataSet,Find_SelectedField) then FindDialog.CloseDialog;
end;
Пояснения:
{ Private declarations }
Find_DataSet: TDataSet; //переменная
Find_SelectedField: TField;//переменная
FindDialog: TFindDialog;//компонент
FindDialogFind - событие onFind компонента FindDialog.
NDR (2002-07-31 12:00:00) [24]Давай конечно свой компонент.
Это пишет NDR со своей работы !
сбрось его (свой компонент) пожалуйста на officeman@mail.ru
С уважением и НЕИСЧЕРПАЕМОЙ благодарностью, NDR =)
Леха_ (2002-07-30 18:57:00) [25]Я для этого написал свой компонент если хочешь могу прислать для выкладывания он всетаки великоват
blackman (2002-07-30 18:33:00) [26]Не мучайся. Простым перебором записей добьешься полного успеха !
function Isk( oTable: TAdoTable;var Istr:String; var Pstr:String):boolean;
var RRecno: TBookmark;
Rresult,Napr: Integer;
label ZYes,ZNo,ZNo2,Nach,iskfin;
begin
Napr:=0;
RResult := 0;
MyEsc:=False;
RRecno:=oTable.GetBookmark;
oTable.Next;
Nach:
while not oTable.Eof do
begin
RResult :=AnsiPos(Istr,oTable.FieldByName(Pstr).AsString);
if MyEsc then goto ZNo;
if RResult > 0 then goto ZYes;
Application.ProcessMessages();
oTable.next;
If Bookmark(Rrecno) = Bookmark(oTable.Recno) then goto Zno;
end;
ZNo:
oTable.GotoBookmark(Rrecno);
if (Napr = 0) and (MessageDlg("
NDR (2002-07-30 18:07:00) [27]Думайте, думайте ! мастера !
Выручайте! если что умного придет в голову.
пишите сразу процедурку =))
я ведь велосипед не изобретаю. вы наверняка уже сталкивались с этим вопросом. ну...
с Уважением, NDR
Mike Kouzmine (2002-07-30 16:25:00) [28]Но вообще - это медленно.
Mike Kouzmine (2002-07-30 16:24:00) [29]Ну вообще Locate возвращает Boolean, если я не ошибаюсь.
А вообще, тут можно использовать onFilterRecords, где Accept := (Pos("BLACK",TableFileld.Value)<>0)
Johnmen (2002-07-30 16:19:00) [30]Прямое сканирование НД решает все проблемы (кроме м.б.быстродействия)