![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приветствую Мастеров ! Эт снова Я ! Быстрый поиск по базе ? [D5, dBase, FoxPro]
IronHawk © (2002-04-10 13:00:00)Есть стандартный "джентельменский набор" на форме : Table1, DataSource1, DBNavigator, и ессно (Не DBGrid) много DBEdit-ов (28 шт.) которые расставлены поразному, И прикреплено это всё к базе abcde.dbf !
Нужно по мере постепенного ввода данных в любой из DBEdit-ов выскакивало продолжение предполагаемое, уже существующее в базе (что-то типа хистори Интернет Ехплорера) и в остальных ессно соответствующие данные !
... заранее длагодарен !!!
IronHawk (2002-04-10 13:49:00) [1]
> Alx2 © (10.04.02 13:36)
Спасибо, твой вариан чем-то смахивает на вариант из хелпа "советы по Делфи, Кулиба 1000", но твой более оптимизирован !
Спасибо !
> -=CrazyFish=- © (10.04.02 13:37)
Такое непройдёт :
procedure Edit1OnChange(...);
var i:integer;
begin
if not updating then exit;
updating:= false;
Table1.FindNearest([Edit1.text]);
ListBox1.clear;
i:= 0;
while (i < 5) and (not (table1.eof)) do
begin
listbox.items.add(Table1.fields[0].asString);
inc(i);
table1.next;
end;
listbox1.itemindex:= 0;
end;
> -=CrazyFish=- © (10.04.02 13:41)
> В таком случае тебе придется подождать когда появится Database
> Fast Find Wizard
Неприйдёться, вот он :
unit DBFinder;
interface
uses DB, DBTables, SysUtils;
function GrabMemoFieldAsPChar(TheField : TMemoField): PChar;
function DoFindIn(TheField : TField; SFor : String): Boolean;
function FindIt(TheTable : TDataSet; TheFields : array of integer;
SearchBackward : Boolean; FromBeginning : Boolean; SFor : String): Boolean;
{
-=CrazyFish=- (2002-04-10 13:41:00) [2]>А я нехочу менять !
>Ежели я просто создал эту форму Database Wizard-ом и меня устраивает !
В таком случае тебе придется подождать когда появится Database Fast Find Wizard
-=CrazyFish=- (2002-04-10 13:37:00) [3]> В DBF-e Индексы ? Ню ню ! А ежели у меня их нету ?
в DBase FindNeares ишет по индексированным полям. Если редактируемое поле индексировано, то при вводе его значения используешь FindNearest, передаешь в него то, что набрал и узнаешь наиболее подходящее продолжение, уже существующее в базе.
Alx2 (2002-04-10 13:36:00) [4]Событие OnChange у Edit1 делаем такое:
Procedure TMainForm.Edi1Change(Sender: TObject);
Var
len : Integer;
S, S1, FName: String;
Table : TTable;
SaveEvent : TNotifyEvent;
Begin
FName - поле, в котором ищем.
Table - таблица TTable, в которой ищем
If Not CanFindForEdit Then Exit; // Вылетаем, если нельзя использовать инкрементный поиск (ниже - подробности)
S := AnsiUpperCase((Sender As TEdit).Text); // Текст, который ищем
If Table.Locate(FName, S,[loCaseInsensitive, loPartialKey])
Then
Begin // Если в таблице попался подходящий фрагмент
S1 := Table.fieldbyname(FName).Value; // Читаем его
If Pos(S, AnsiUpperCase(S1)) = 1 Then // Если есть совпадение префиксов без учета регистра
Begin
SaveEvent :=(Sender As TEdit).OnChange := Nil; // Запимонаем старый обработчик
(Sender As TEdit).OnChange := Nil; // Временно отказываемся от обработчика OnChange
len := Length(S);
(Sender As TEdit).Text := S1; // Подставляем найденное
(Sender As TEdit).SelStart := len;
(Sender As TEdit).SelLength := Length((Sender As TEdit).Text); // Выделяем тот кусок, который дописан автоматически
(Sender As TEdit).OnChange := SaveEvent;
End;
End;
Еще момент:
Обработчик OnKeyDown у Edit1 должен быть таким
Procedure TMainForm.Edit1KeyDown(Sender: TObject; Var KEY: Word;
Shift: TShiftState);
Begin
Case KEY Of
VK_BACK, VK_DELETE: CanFindForEdit := False; // Глобальную переменную устанавливаем в ложь, для того чтобы BackSpace не вызывал инкрементный поиск в OnChange
end;
end;
Обработчик OnKeyUp у Edit1:
Procedure TMainForm.Edit1KeyUp(Sender: TObject; Var KEY: Word;
Shift: TShiftState);
Begin
CanFindForEdit := True;
End;
PS
Возможны опечатки, так как на ходу адаптировал код.
Anatoly Podgoretsky (2002-04-10 13:36:00) [5]Не хочешь менять, не меняй, но без изменения ничего не получится
IronHawk (2002-04-10 13:26:00) [6]
> -=CrazyFish=- © (10.04.02 13:09)
> Используй TTable.FindNearest по индексированному полю
В DBF-e Индексы ? Ню ню ! А ежели у меня их нету ?
> roottim (10.04.02 13:14)
> RXLookupEdit тебе поможет! :)
Только стандартные компоненты !
> Digitman © (10.04.02 13:15)
> На то есть TDBComboBox и TDBLookupComboBox.
А я нехочу менять !
Ежели я просто создал эту форму Database Wizard-ом и меня устраивает !
Digitman (2002-04-10 13:15:00) [7]На то есть TDBComboBox и TDBLookupComboBox.
roottim (2002-04-10 13:14:00) [8]RXLookupEdit тебе поможет! :)
-=CrazyFish=- (2002-04-10 13:09:00) [9]Используй TTable.FindNearest по индексированному полю