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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2009, 19:36   #1
grom333
Форумчанин
 
Аватар для grom333
 
Регистрация: 21.10.2008
Сообщений: 337
По умолчанию Телефонный справочник поиск

Начал делать телефонный справочник, хочу освоить базы данных. посмотрел по форуму темы. Но везде такие сложные пути решения поиска. Использую ADOConnection, DATAsource, ADOTable, TADOQuery. Как сделать поиск? Посоветуйте какие компаненты использовать для поиска и если можно ссылочку на тему где есть примеры. Спасибо.
Лучше быть последним из львов, чем первым среди шакалов.
Мой чат
community on struggle with zoomics
grom333 вне форума Ответить с цитированием
Старый 07.12.2009, 20:21   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

как-то делал два варианта телефонных справочников:

в-первом - загнал всю базу в TClientDataSet (в ОЗУ обработка) и поиск через Filtered, обработчик в FilterRecord через свойство Accept, например так:
Код:
procedure Ttst.bdcFilterRecord(DataSet: TDataSet; var Accept: Boolean);
var t,a,d,k,f: string;
begin
 t:= upcase(tel.text); // пользовательские поля на форме
 a:= upcase(adr.text);
 d:= upcase(dom.text);
 k:= upcase(kom.text);
 f:= upcase(fam.text);

 //
 if rb1.Checked then       //по номеру телефона
  accept:= (Pos(t, upcase(Dataset.fieldbyname('Телефон').asstring))>0);

 if rb2.Checked then begin //по улице/дому/квартире
  if (adr.Text<>'')and(dom.Text='')and(kom.Text='') then
   accept:= (Pos(a, upcase(Dataset.fieldbyname('Улица').asstring))>0);
  if (adr.Text='')and(dom.Text<>'')and(kom.Text='') then
   accept:= (Pos(d, upcase(Dataset.fieldbyname('дом').asstring))>0);
  if (adr.Text='')and(dom.Text='')and(kom.Text<>'') then
   accept:= (Pos(k, upcase(Dataset.fieldbyname('кв').asstring))>0);
  if (adr.Text<>'')and(dom.Text<>'')and(kom.Text='') then
   accept:= (Pos(a, upcase(Dataset.fieldbyname('Улица').asstring))>0)and
            (Pos(d, upcase(Dataset.fieldbyname('дом').asstring))>0);
  if (adr.Text<>'')and(dom.Text<>'')and(kom.Text<>'') then
   accept:= (Pos(a, upcase(Dataset.fieldbyname('Улица').asstring))>0)and
            (Pos(d, upcase(Dataset.fieldbyname('дом').asstring))>0)and
            (Pos(k, upcase(Dataset.fieldbyname('кв').asstring))>0);
 end;

 if rb3.Checked then //по номеру телефона/улице/дому/квартире/ФИО-Названию
  accept:= (Pos(t, upcase(Dataset.fieldbyname('Телефон').asstring))>0)or
           (Pos(a, upcase(Dataset.fieldbyname('Улица').asstring))>0)or
           (Pos(d, upcase(Dataset.fieldbyname('дом').asstring))>0)or
           (Pos(k, upcase(Dataset.fieldbyname('кв').asstring))>0)or
           (Pos(f, upcase(Dataset.fieldbyname('ФИО/Название').asstring))>0);
end;
во-втором - не использовал базы данных в прямом понимании, а хранил в виде бинарника в ресурсах (текстовым набором), загружал в tmemorystream, поиск проходом методом наименьших квадратов (изврат конечно, но при малых объемах бегает довольно шустро и не привязан к bde, ado...)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 07.12.2009 в 20:23.
raxp вне форума Ответить с цитированием
Старый 07.12.2009, 20:34   #3
grom333
Форумчанин
 
Аватар для grom333
 
Регистрация: 21.10.2008
Сообщений: 337
По умолчанию

Я так сделал подобное нашел в нете. Но не хочет находить:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    booktable: TADOTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    ADOQuery1: TADOQuery;
    Button1: TButton;
    Query1: TQuery;
    procedure Button1Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}





procedure TForm1.Button1Click(Sender: TObject);

var
s: string[50];
begin
s := InputBox('Поиск','Введите фамилию и нажмите OK','');
if s <> '' then
begin
with form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add('SELECT FIO, street, home');
SQL.Add('FROM ":STANDARD1:tab1.db"');
SQL.Add('WHERE');
SQL.Add('(Famil = "'+ s + '")');
SQL.Add('ORDER BY Name, Famil');
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage('Нет записей.');
DataSource1.DataSet:=booktable;
end;
  end;
   end;
end.
Лучше быть последним из львов, чем первым среди шакалов.
Мой чат
community on struggle with zoomics
grom333 вне форума Ответить с цитированием
Старый 09.12.2009, 12:31   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

в смысле не хочет? а в базе цей точно такая-же запись существует, имею ввиду, что например вводите "петров", а в записи "Петров"... еще, выдает-ли всю таблицу без фильтрации ?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 09.12.2009, 13:02   #5
grom333
Форумчанин
 
Аватар для grom333
 
Регистрация: 21.10.2008
Сообщений: 337
По умолчанию

с учетом регистра писал
Лучше быть последним из львов, чем первым среди шакалов.
Мой чат
community on struggle with zoomics
grom333 вне форума Ответить с цитированием
Старый 09.12.2009, 13:53   #6
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Код:
procedure TForm2.Button1Click(Sender: TObject);
var fam:string[30];
begin
 fam:=InputBox('Поиск телефонного номера',
 'Введите имя абонента целиком или его часть и нажмите OK.', '');
 if fam <> '' then // пользователь ввел фамилию
 begin
  with form2.Query1 do
  begin
   Close; // закрыть файл-результат выполнения предыдущего запроса
   SQL.Clear; // удалить текст предыдущего запроса
   // записываем новый запрос в свойство SQL
   SQL.Add('SELECT *');
   SQL.Add('FROM Fones');
   SQL.Add('WHERE');
   SQL.Add('(Name LIKE "'+ fam+'%' + '")');
   Open; // активизируем выполнение запроса
  end;
 if form2.Query1.RecordCount <> 0 then
  begin
   form2.DataSource1.DataSet:=form2.Query1; // отобразить рез-т выполнения запроса
  end else
  begin
   ShowMessage('В БД нет записей, удовлетворяющих критерию запроса.');
   form2.DataSource1.DataSet:=form2.Table1;
  end;
 end; 
end;
SERG1980 вне форума Ответить с цитированием
Старый 14.05.2010, 22:28   #7
Дашкевна
Пользователь
 
Регистрация: 14.05.2010
Сообщений: 10
По умолчанию

Всем привет,я телефонный справочник делаю чисто в delphi.Не подскажите можно ли мне как нибудь сделать поиск по данным???


Код:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
ListBox2.ItemIndex:=ListBox1.ItemIndex;
ListBox3.ItemIndex:=ListBox1.ItemIndex;
ListBox4.ItemIndex:=ListBox1.ItemIndex;
ListBox5.ItemIndex:=ListBox1.ItemIndex;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items:=ListBox1.Items;
ComboBox1.Text:='Выберите фамилию:';

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
Label3.Caption:='ФИО:'+ListBox1.Items [ComboBox1.ItemIndex];
Label4.Caption:='Дата рождения:'+ListBox2.Items [ComboBox1.ItemIndex];
Label5.Caption:='Адрес:'+ListBox3.Items [ComboBox1.ItemIndex];
Label6.Caption:='Телефон:'+ListBox4.Items [ComboBox1.ItemIndex];
Label7.Caption:='Серия и номер паспорта:'+ListBox5.Items [ComboBox1.ItemIndex];
end;

procedure TForm1.Button1Click(Sender: TObject);
Var Familia, Data, Adres, Telefon, Seria: string;
begin
Familia:=InputBox('добавление новой записи',
                                'Введите ФИО нового сотрудника',
                               'Фамилия');
Data:=InputBox('добавление новой записи',
                                'Введите дату рождения сотрудника',
                               'Дата рождения');
Adres:=InputBox('добавление новой записи',
                                'Введите адрес нового сотрудника',
                               'Адрес');
Telefon:=InputBox('добавление новой записи',
                                'Введите номер нового сотрудника',
                               'Телефон');
Seria:=InputBox('добавление новой записи',
                      'Введите серию и номер паспорта нового сотрудника',
                                 'Серия и номер паспорта');

ListBox1.Items.Add(Familia);
ListBox2.Items.Add(Data);
ListBox3.Items.Add(Adres);
ListBox4.Items.Add(Telefon);
ListBox5.Items.Add(Seria);
ComboBox1.Items:= ListBox1.Items;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ListBox1.Items.SaveToFile('Familia1.txt');
ListBox2.Items.SaveToFile('Data1.txt');
ListBox3.Items.SaveToFile('Adres1.txt');
ListBox4.Items.SaveToFile('Telefon1.txt');
ListBox5.Items.SaveToFile('Seria i nomer pasporta1.txt');
Дашкевна вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ справочник телефонный BLacK_TeaR Помощь студентам 3 04.03.2010 13:42
Телефонный справочник Krechet Софт 5 10.08.2009 15:51
телефонный справочник salmanov Общие вопросы C/C++ 1 10.06.2009 20:55
Телефонный справочник на TC Qai Фриланс 5 25.05.2008 01:02
Телефонный справочник CRASH Помощь студентам 5 07.05.2007 17:12