Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 22:07   #1
Liprikon7
 
Аватар для Liprikon7
 
Регистрация: 17.05.2009
Сообщений: 8
Вопрос Поисковик в Grid

Здравствуйте всем я столкнулся с ситуацией которая мне не по зубам и вот решил спросить совета у знающих людей.
Проблема такова, у меня есть таблица Sab в dbf формате и я не как не могу прикрутить к ней вот этот код;

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB;

type
TForm1 = class(TForm)
con1: TADOConnection;
qry1: TADOQuery;
ds1: TDataSource;
dbgrd1: TDBGrid;
edt1: TEdit;
btn1: TButton;
lbl1: TLabel;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
{ В этой закладке хранится ссылка на строку
с предыдущим найденным числом }
BookMark: TBookmark;

implementation

uses StrUtils;

{$R *.dfm}
{ Фунция поиска строки в столбце Dataset-a
ACol - столбец, в котором ищется значение
AStr - строка для поиска }
function FindStr(dbgrd1: TDataSet; ds1: Integer; fio: String): Boolean;
var
OldPos: Integer;
begin
Result := False;
{ Запоминаем номер строки для выхода из цикла }
OldPos := dbgrd1.RecNo;

{ Если закладка пустая - ставим закладку на
первую запись}
if BookMark <> nil then
begin
dbgrd1.GotoBookmark(BookMark);
dbgrd1.Next;
end else begin
dbgrd1.First;
BookMark := dbgrd1.GetBookmark;
end;

repeat
{ Если достигли конца DataSet - ищем с первой записи }
if dbgrd1.Eof then
dbgrd1.First;

{ Если строка найдена - выставляем на нее закладку
и выходим }
if Pos(fio, dbgrd1.Fields[ds1].AsString) <> 0 then
begin
BookMark := dbgrd1.GetBookmark;
Result := True;
Exit;
end;

{ Если прошли все записи - выходим }
if OldPos = dbgrd1.RecNo then exit;
{ Иначе переходим на следующую запись }
dbgrd1.Next;
until not True;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
DBGrd1.DataSource.DataSet.DisableControls;
FindStr(DBGrd1.DataSource.DataSet, 0, Edt1.Text);
DBGrd1.DataSource.DataSet.EnableControls;
DBGrd1.SetFocus;

end;

end.

Код я нашол на одном из сайтов поэтому не знаю на сколько он рабочий но при моих экспериментах над ним он так не разу и не заработал, может я что то не до понимаю? Хотя и расписано довольно таки понятно но почему то не хочет он в моих руках работать.
Таблицу я подключал через ADOQuery на картинке должно быть видно.



Суть задачи такова мне надо что бы при нажатии на кнопку поиска выводилась первая подходящая запись, при нажатии ещё раз следующая подходящая запись и так далее, конечно если бы в конце поиска ещё и сообщение выдавало типа поиск завершён было бы не плохо.
Поиск мне надо выполнить по полю FIO в Gride.
Я изначально хотел с FindDialog сделать но подходящей информации так и не нашол а это был бы идеальный вариант.
В общем заранее очень признателен за советы.
Liprikon7 вне форума Ответить с цитированием
Старый 13.10.2010, 11:05   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Неинтересный поиск. Особенно если там записей несколько тысяч.

Напиши в событии OnChange своего Edita
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var aSQL: string;
begin
  with qry1 do
  begin
    if (Edit1.Text = '') or (Length(Edit1.Text) < 2) then 
{искать будем если в Edit1 больше 2-х символов, иначе покажем всю таблицу}
    aSQL := 'select * from TABL' else
      aSQL := 'Select * from TABL where FIO LIKE "%' + Edit1.Text + '%";';
    Close;
    SQL.Clear;
    SQL.Add(aSQL);
    Open;
  end;
end;
TABL - имя твоей таблицы
_SERGEYX_ вне форума Ответить с цитированием
Старый 13.10.2010, 14:01   #3
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

еси что нибудь поймещь, подгоняй под свой проект
работает если введешь хотябы несколько искомых букв

Код:
var SearchFields:string;
begin
if memo1.Text<>'' then
  begin
 DataModule2.tbl2.Filtered:=False;
  case combobox1.ItemIndex of
      0: SearchFields:= DataModule2.dtmfldtbl2DSDesigner3.FullName;
      1: SearchFields:= DataModule2.wdstrngfldtbl2DSDesigner5.FullName;
  end;
  if combobox1.ItemIndex<>1 then
    DataModule2.tbl2.Locate(SearchFields,memo1.Text,[loPartialKey,
      loCaseInsensitive])
  else
  begin
    DataModule2.tbl2.Filter:= SearchFields+' LIKE '+QuotedStr('%'+
      memo1.Text+'%');
    DataModule2.tbl2.Filtered:=True;
  end;
end
else
begin
 DataModule2.tbl2.Filtered:=False;
end;
end;
Помог, нажми весы слева

Последний раз редактировалось grafgrial; 13.10.2010 в 14:03.
grafgrial вне форума Ответить с цитированием
Старый 13.10.2010, 16:00   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Хранить ФИО в одном столбце - это мягко говоря неправильно.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.10.2010, 00:27   #5
Liprikon7
 
Аватар для Liprikon7
 
Регистрация: 17.05.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Неинтересный поиск. Особенно если там записей несколько тысяч.

Напиши в событии OnChange своего Edita
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var aSQL: string;
begin
  with qry1 do
  begin
    if (Edit1.Text = '') or (Length(Edit1.Text) < 2) then 
{искать будем если в Edit1 больше 2-х символов, иначе покажем всю таблицу}
    aSQL := 'select * from TABL' else
      aSQL := 'Select * from TABL where FIO LIKE "%' + Edit1.Text + '%";';
    Close;
    SQL.Clear;
    SQL.Add(aSQL);
    Open;
  end;
end;
TABL - имя твоей таблицы

Я не понял почему вы сказали что не интересный поиск и мой или ваш тоже не понятно но всё же спасибо за старания хотя и у меня ваш код не заработал, выдал ошибку и что с ней делать я не знаю да и разбираться не стал так как не понятно как дальше делать поиск после первого подходящего результата?
Кстати записей 30704.

Последний раз редактировалось Liprikon7; 14.10.2010 в 03:56.
Liprikon7 вне форума Ответить с цитированием
Старый 14.10.2010, 00:37   #6
Liprikon7
 
Аватар для Liprikon7
 
Регистрация: 17.05.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от grafgrial Посмотреть сообщение
еси что нибудь поймещь, подгоняй под свой проект
работает если введешь хотябы несколько искомых букв

Код:
var SearchFields:string;
begin
if memo1.Text<>'' then
  begin
 DataModule2.tbl2.Filtered:=False;
  case combobox1.ItemIndex of
      0: SearchFields:= DataModule2.dtmfldtbl2DSDesigner3.FullName;
      1: SearchFields:= DataModule2.wdstrngfldtbl2DSDesigner5.FullName;
  end;
  if combobox1.ItemIndex<>1 then
    DataModule2.tbl2.Locate(SearchFields,memo1.Text,[loPartialKey,
      loCaseInsensitive])
  else
  begin
    DataModule2.tbl2.Filter:= SearchFields+' LIKE '+QuotedStr('%'+
      memo1.Text+'%');
    DataModule2.tbl2.Filtered:=True;
  end;
end
else
begin
 DataModule2.tbl2.Filtered:=False;
end;
end;
Спасибо но я не настолько знаком с делфи чтобы что то подгонять я больше надеялся что тот код который я пытался прикрутить в первом посте мне помогут найти в нём ошибку и он заработает, темболее у вас тут сплошные мемо поля, много переделывать наверное.
Liprikon7 вне форума Ответить с цитированием
Старый 14.10.2010, 00:38   #7
Liprikon7
 
Аватар для Liprikon7
 
Регистрация: 17.05.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Хранить ФИО в одном столбце - это мягко говоря неправильно.
Да вы правы но что есть то и имеем.
Liprikon7 вне форума Ответить с цитированием
Старый 14.10.2010, 00:55   #8
Liprikon7
 
Аватар для Liprikon7
 
Регистрация: 17.05.2009
Сообщений: 8
По умолчанию

Может если с первым постом не получится ответить тогда может кто подскачет такова рода
Код:
если в Edit1 ввести первые искомые буквы тогда в DBGrid1 выводятся все подходящии записи без нажатия кнопок но с кнопкой очистить Edit1
И если вас не затруднит с кратким описанием, заранее примного благодарен, спасибо.
Liprikon7 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поисковик в DLL LeDиNkо Помощь студентам 0 17.12.2009 23:48
поисковик C# Neymexa Общие вопросы .NET 8 29.03.2009 10:39
поисковик C# Neymexa Помощь студентам 2 27.03.2009 22:28