Компонент FindDialog и код процедуры
От: Аноним  
Дата: 06.09.04 06:47
Оценка:
Положил на форму компонент Finddialog и кнопку Button. теперь надо на нажатие кнопки открыть окно диалога поиска и сделать так, чтобы при нахождении введенного текста в выведенной на форме таблицы курсор автоматически переместился на эту запись в DBGrid

06.09.04 10:56: Перенесено модератором из 'Базы данных' — _MarlboroMan_
Re: Компонент FindDialog и код процедуры
От: ironwit Украина  
Дата: 06.09.04 07:22
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Положил на форму компонент Finddialog и кнопку Button. теперь надо на нажатие кнопки открыть окно диалога поиска и сделать так, чтобы при нахождении введенного текста в выведенной на форме таблицы курсор автоматически переместился на эту запись в DBGrid


Самый легкий для Вас способ, взять грид от ehlib, там уже реализован свой поиск по ctrl+F
... << RSDN@Home 1.1.4 beta 2 0
Я не умею быть злым, и не хочу быть добрым.
Re: Компонент FindDialog и код процедуры
От: Эдик Россия  
Дата: 06.09.04 15:10
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Положил на форму компонент Finddialog и кнопку Button. теперь надо на нажатие кнопки открыть окно диалога поиска и сделать так, чтобы при нахождении введенного текста в выведенной на форме таблицы курсор автоматически переместился на эту запись в DBGrid


Воспользуйся функцией TCustomADODataSet::Locate.
... << RSDN@Home 1.1.3 stable >>
Re: Компонент FindDialog и код процедуры
От: shev  
Дата: 07.09.04 05:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Положил на форму компонент 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);

которое приводит к появлению окошка поиска и пользователь после ввода слова может нажимая кнопку "Далее" искать очередную строку в датасете
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.