Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-2463
Sewix
2002-04-09 14:56
2002.05.02
Sql запрос как выбрать все поля кроме конкретного одного


1-2548
alexru
2002-04-18 21:47
2002.05.02
Регулярные выражения как в перле ?


1-2564
alm
2002-04-19 09:35
2002.05.02
Динамический массив исчезает...


3-2497
Sam
2002-04-11 17:23
2002.05.02
MySQL and Delphi6


4-2719
sdan
2002-02-28 17:38
2002.05.02
API





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский