Форум: "Базы";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
ВнизПриветствую Мастеров ! Эт снова Я ! Быстрый поиск по базе ? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c