Положил на форму компонент Finddialog и кнопку Button. теперь надо на нажатие кнопки открыть окно диалога поиска и сделать так, чтобы при нахождении введенного текста в выведенной на форме таблицы курсор автоматически переместился на эту запись в DBGrid
06.09.04 10:56: Перенесено модератором из 'Базы данных' — _MarlboroMan_
Здравствуйте, <Аноним>, Вы писали:
А>Положил на форму компонент Finddialog и кнопку Button. теперь надо на нажатие кнопки открыть окно диалога поиска и сделать так, чтобы при нахождении введенного текста в выведенной на форме таблицы курсор автоматически переместился на эту запись в DBGrid
Самый легкий для Вас способ, взять грид от ehlib, там уже реализован свой поиск по ctrl+F
... << RSDN@Home 1.1.4 beta 2 0
Здравствуйте, <Аноним>, Вы писали:
А>Положил на форму компонент Finddialog и кнопку Button. теперь надо на нажатие кнопки открыть окно диалога поиска и сделать так, чтобы при нахождении введенного текста в выведенной на форме таблицы курсор автоматически переместился на эту запись в DBGrid
Воспользуйся функцией TCustomADODataSet::Locate.
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, Аноним, Вы писали:
А>Положил на форму компонент Finddialog и кнопку Button. теперь надо на нажатие кнопки открыть окно диалога поиска и сделать так, чтобы при нахождении введенного текста в выведенной на форме таблицы курсор автоматически переместился на эту запись в DBGrid
Вот модулек с классом, который я как-то себе написал и везде в проектах использую.
unit USHSearchDataSet;
interface
uses
SysUtils, DB, ADODB, Classes, Dialogs;
type
TSHSearchDataSet=class
private
FDataSet: TCustomADODataSet;
//набор данных для поиска в котором пользователь хочет производить поиск
FCloneDataSet: TCustomADODataSet;
//клонированный набор данных для поиска
FFindText: string;
//последний текст, который искали
FWholeWord: boolean;
//режим поиска
//true - целиком поле
FFindDialog: TFindDialog;
//диалог для поиска
FFieldName: string;
//поле по которому ведется поиск
protected
procedure FFindDialogOnFind(Sender: TObject);
//обработчик события от диалогового окна
procedure FFindDialogOnClose(Sender: TObject);
//обработчик события от диалогового окна
public
property WholeWord: boolean read FWholeWord;
constructor Create;
destructor Destroy; override;
procedure Execute(ADataSet: TCustomADODataSet; AFieldName: string);
//начать поиск
procedure CloseDialog;
//закрыть диалог
end;
implementation
{ TSHSearchDataSet }
procedure TSHSearchDataSet.CloseDialog;
begin
FFindDialog.CloseDialog;
end;
constructor TSHSearchDataSet.Create;
begin
inherited;
FFindDialog:=TFindDialog.Create(nil);
FFindDialog.OnFind:=FFindDialogOnFind;
FFindDialog.OnClose:=FFindDialogOnClose;
FFindDialog.Options:=FFindDialog.Options+[frDisableUpDown, frDisableMatchCase];
FCloneDataSet:=nil;
end;
destructor TSHSearchDataSet.Destroy;
begin
FFindDialog.CloseDialog;
FreeAndNil(FCloneDataSet);
FreeAndNil(FFindDialog);
inherited;
end;
procedure TSHSearchDataSet.Execute(ADataSet: TCustomADODataSet;
AFieldName: string);
begin
FFieldName:=AFieldName;
FDataSet:=ADataSet;
FreeAndNil(FCloneDataSet);
FCloneDataSet:=TCustomADODataSet.Create(nil);
FCloneDataSet.Clone(FDataSet);
FCloneDataSet.First;
FFindDialog.Execute;
end;
procedure TSHSearchDataSet.FFindDialogOnClose(Sender: TObject);
begin
FreeAndNil(FCloneDataSet);
end;
procedure TSHSearchDataSet.FFindDialogOnFind(Sender: TObject);
var
_isFind: boolean;
begin
_isFind:=false;
if FFindText<>FFindDialog.FindText then
FCloneDataSet.First;
if (frWholeWord in FFindDialog.Options)<>FWholeWord then
FCloneDataSet.First;
FFindText:=FFindDialog.FindText;
FWholeWord:=(frWholeWord in FFindDialog.Options);
while not FCloneDataSet.Eof do
begin
if FWholeWord then
begin
if CompareText(FFindText,
FCloneDataSet.FieldByName(FFieldName).AsString)=0 then
_isFind:=true;
end
else
if Pos(AnsiUpperCase(FFindText),
AnsiUpperCase(FCloneDataSet.FieldByName(FFieldName).AsString))<>0 then
_isFind:=true;
if _isFind then
begin
FDataSet.Bookmark:=FCloneDataSet.Bookmark;
FCloneDataSet.Next;
break;
end;
FCloneDataSet.Next;
end;
if not _isFind then
ShowMessage('Поиск завершен');
end;
end.
Когда пользователь нажимает на форме кнопку "Найти" вызывается метод класса Execute:
Search.Execute(ADOQuery1, FieldName);
которое приводит к появлению окошка поиска и пользователь после ввода слова может нажимая кнопку "Далее" искать очередную строку в датасете