Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.02;
Скачать: CL | DM;

Вниз

Приветствую Мастеров ! Эт снова Я ! Быстрый поиск по базе ?   Найти похожие ветки 

 
IronHawk   (2002-04-10 13:00) [0]

Есть стандартный "джентельменский набор" на форме : Table1, DataSource1, DBNavigator, и ессно (Не DBGrid) много DBEdit-ов (28 шт.) которые расставлены поразному, И прикреплено это всё к базе abcde.dbf !
Нужно по мере постепенного ввода данных в любой из DBEdit-ов выскакивало продолжение предполагаемое, уже существующее в базе (что-то типа хистори Интернет Ехплорера) и в остальных ессно соответствующие данные !

... заранее длагодарен !!!


 
-=CrazyFish=-   (2002-04-10 13:09) [1]

Используй TTable.FindNearest по индексированному полю


 
roottim   (2002-04-10 13:14) [2]

RXLookupEdit тебе поможет! :)


 
Digitman   (2002-04-10 13:15) [3]

На то есть TDBComboBox и TDBLookupComboBox.


 
IronHawk   (2002-04-10 13:26) [4]


> -=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-ом и меня устраивает !


 
Alx2   (2002-04-10 13:36) [5]

Событие 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) [6]

Не хочешь менять, не меняй, но без изменения ничего не получится


 
-=CrazyFish=-   (2002-04-10 13:37) [7]

> В DBF-e Индексы ? Ню ню ! А ежели у меня их нету ?

в DBase FindNeares ишет по индексированным полям. Если редактируемое поле индексировано, то при вводе его значения используешь FindNearest, передаешь в него то, что набрал и узнаешь наиболее подходящее продолжение, уже существующее в базе.


 
-=CrazyFish=-   (2002-04-10 13:41) [8]

>А я нехочу менять !
>Ежели я просто создал эту форму Database Wizard-ом и меня устраивает !

В таком случае тебе придется подождать когда появится Database Fast Find Wizard


 
IronHawk   (2002-04-10 13:49) [9]


> 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;
{



Страницы: 1 вся ветка

Текущий архив: 2002.05.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
4-2725
Александр_
2002-02-27 19:20
2002.05.02
Вопрос о Звуке.


1-2624
PaRL
2002-04-20 16:58
2002.05.02
ListBox


3-2475
Stif
2002-04-11 10:44
2002.05.02
Быстрый подсчёт суммы чисел столбца. Есть 2 кода, медл. и быстрый


1-2567
bigcrush
2002-04-19 12:08
2002.05.02
Свойство State в методе-обработчике OnDragOver


1-2606
Афоня
2002-04-18 13:31
2002.05.02
Как создать калькулятор