Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перескакивать на запись в таблице при нажатии 
:(
    Опции темы
User
  Дата 24.3.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



Попытался сделать код для быстрого поиска записи в таблице по вводу первой буквы с клавиатуры. Но пришлось применить для этого Edit, который выводится для вставки этой самой буквы. А вот как сделать без него незнаю. Может кто подскажет? А лучше пример поподробнее.....
Код привожу:

Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Table1: TTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Database1: TDatabase;
    Table1ID: TAutoIncField;
    Table1NAME: TStringField;
    Table1PARI: TStringField;
    Edit1: TEdit;
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit1Exit(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    CtrlDown: boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i: integer;
begin
  if ssCtrl in Shift then
  begin
    Edit1.Text := '';
    Edit1.Width := DBGrid1.Columns.Items[DBGrid1.SelectedIndex].Width;
    Edit1.Top := DBGrid1.Top + DBGrid1.Height - Edit1.Height;
    Edit1.Left := DBGrid1.Left+12;
    for i:= 0 to DBGrid1.SelectedIndex-1 do
      if DBGrid1.Columns.Items[i].Showing then
        Edit1.Left := Edit1.Left + DBGrid1.Columns.Items[i].Width + 1;
    Edit1.Visible := true;
    Edit1.SetFocus;
  end;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  Edit1.Visible := false;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Edit1.Text<>'' then
    try
      Table1.Locate(DBGrid1.SelectedField.DisplayName,Edit1.Text,[loCaseInsensitive,loPartialKey]);
    except
    end;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=VK_ESCAPE then
    DBGrid1.SetFocus;
end;

end.

PM MAIL WWW   Вверх
User
Дата 29.3.2005, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



Я так понимаю что не кто не знает ка это сделать?
PM MAIL WWW   Вверх
DimW
Дата 29.3.2005, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



единственное что приходит на ум то SELECT c LIKE использовать, но это не совсем что те нужно, не будет перехода по записям...

мда, вот это вопрос....!!! мне уже самому интересно!!! ну модераторы слово за вами... smile

возтожно ли это сделать средстрами TTable?


PM MAIL ICQ   Вверх
Dimich
Дата 29.3.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Вот, что удалось наспех набросать:
Код
unit uLocate;

interface

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

type
  TForm1 = class(TForm)
    Table1: TTable;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    procedure FormShow(Sender: TObject);
    procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure Table1BeforeOpen(DataSet: TDataSet);
    procedure Table1BeforeScroll(DataSet: TDataSet);
  private
    SearchStr : string;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  Table1.Open;
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
Var
  tmp : string;
begin
  if Key in ['A'..'Z','a'..'z'] then
  begin
    // Начинаем новый поиск, перейти на начало.
    if SearchStr = '' then Table1.First;
    SearchStr := SearchStr + Key;
    // Сработает BeforeScroll, поэтому сохраняем SearchStr
    tmp := SearchStr;
    Table1.Locate('Name',SearchStr,[loCaseInsensitive, loPartialKey]);
    SearchStr := tmp;
  end
  else
  if Key = #27 then SearchStr := '';
end;

procedure TForm1.Table1BeforeOpen(DataSet: TDataSet);
begin
  SearchStr := '';
end;

procedure TForm1.Table1BeforeScroll(DataSet: TDataSet);
begin
  SearchStr := '';
end;

end.

По хорошему, тут бы еще применить закладки (BookMark) и обработать еще парочку событий кроме OnBeforeOpen и OnBeforeEdit. Да, пример конечно сырой. Как есть, его юзать нельзя, но думаю, мысль можно развить или свое что другое придумаете, если это не подходит.....
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
DimW
Дата 30.3.2005, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



тут немного другая проблема...
Locate-ищет полное совпадение, а надо по первым симвалам- нажал "а" и курсор должен перейти на слово начинающееся с символа "а" и т.д.

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

В цикле до конца таблицы делаещь что то вроде:

While not Table.EOF do
begin
if copy(Table.FieldByName('field_name').asstring,1,length(key))=key then break;
Table.next;
end;

блин ненравится мне это.... слишком явно курсор по строкам бегает!!! А если строк 10000 то ждать запаришися пока добежит... smile
PM MAIL ICQ   Вверх
Dimich
Дата 30.3.2005, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Цитата(DimW @ 30.3.2005, 07:57)
Locate-ищет полное совпадение
это не совсем так.
Код
Table1.Locate('Name',SearchStr,[loCaseInsensitive, loPartialKey]);
как раз и будет искать вхождение SearchStr в поле Name с начала. Посмотрите внимательнее TLocateOptions:
Цитата
type
  TLocateOption = (loCaseInsensitive, loPartialKey);
  TLocateOptions = setof TLocateOption;

Description

TLocateOptions is the type of the Options parameter to a dataset’s Locate method. The following table lists the possible values:

Value Description

loCaseInsensitive Key fields and key values are matched without regard to case.
loPartialKey Key values can include only part of the matching key field value; for example, 'HAM' would match both 'HAMM' and 'HAMMER.'

--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
DimW
Дата 30.3.2005, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата
Цитата (DimW @ 30.3.2005, 07:57)
Locate-ищет полное совпадение

это не совсем так.


мда ступил я.... извиняюсь за свое незнание!!!
PM MAIL ICQ   Вверх
Dimich
Дата 30.3.2005, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



DimW, даже самый крутой профессионал может допустить ошибку, но от этого он не перестанет быть профи, если умеет свои ошибки признавать. Так что все Ok!
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Bes
Дата 5.4.2005, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



Тут где-то мы уже эту проблему решили путем like+locate. Замечательно получилось. Поищи на форуме по-лучше.
PM MAIL   Вверх
User
Дата 5.4.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



Спасибо большое за ответы, господа. Но вот небольшой момент который почемуто не где необсуждается для данного примера. А как сделать ввод букв, как бы невидимо, как в виндах при поиске нужного названия папки или файла. Просто выделяем файл и вводя буквы перескакиваем на нужный. Такое можно както проделать и для Table в DBGrid. Заранее спасибо за ответ!
PM MAIL WWW   Вверх
Bes
Дата 6.4.2005, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



Ну дак ты обрабатывай онкейдаун грида и потом уже делай поиск.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.