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

Вниз

Нужно реализовать следующий функционал для инкрементного поиска   Найти похожие ветки 

 
-=Mike=-   (2006-01-12 02:56) [0]

Нужно реализовать следующий функционал для инкрементного поиска.

Я сделал специальное окошечко, которое отображает текущую строку поиска, которую набрал пользователь (сделал для легковесности на чистом WinAPI). Мне нужно, чтобы поведение окошечка было таким:

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

- Если пользователь выполняет какие-либо другие действия, отличные от ввода букв (это, например, перемещение окна, изменение размера окна, переключения на другое приложение, переход по Tab на другой контрол, нажатие каких-либо кнопок мыши, нажатие каких-либо кнопок клавиатуры, отличных от буквенных, вызов пунктов меню и т.д. и т.п.), то это окошечко автоматически исчезает.

Т.е. если окошечко появилось на экране, то оно будет отображено до тех пор, пока пользователь что-нибудь не сделает отличное от ввода строки поиска.

Еще для этого окошечка я обрабатываю WM_NCHITTEST вот так:

   WM_NCHITTEST:
     begin
       Result:= HTTRANSPARENT;
     end;


Т.е. я хочу добиться, чтобы окошечко для любых действий пользователя было как бы «прозрачным».

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

Вот такая вот у меня проблема.

Подскажите, пожалуйста, возможные пути решения.


 
ECM ©   (2006-01-12 12:05) [1]

Этот вопрос надо было задавать в конференции "WinAPI" (непонятно какая
связь с KOL?) :))


> Подскажите, пожалуйста, возможные пути решения

...

> Если пользователь нажимает буквенные клавиши, когда фокус
> ввода находится на гриде, то это окошечко появляется

Обработка WM_CHAR (WM_KEYDOWN(UP)) в гриде c анализом нажатого -> показ окна


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

Обработка WM_CHAR(KEYDOUN,UP) + WM_KILLFOCUS (WM_NOTIFY + NM_KILLFOCUS) в дополнительном окне -> скрытие окна (возможно понадобится ретранслировать "ненужные" события клавишь из доп. окна в родительское?)


 
-=Mike=-   (2006-01-13 05:45) [2]

>> Этот вопрос надо было задавать в конференции "WinAPI"

Да, скорее вы правы. Просто я прогу пишу на KOL, вот и подумал может можно использовать что-нибудь чисто KOL-овское.

>> Обработка WM_CHAR   ……………….

Пока сделал так:

1. Обработчик нажатия клавиши, который будет у грида:
procedure TForm1. <Грид>Char(Sender: PControl; var Key: Char; Shift: Cardinal);
var
 P: TPoint;
begin
 if Key = #8 then
   begin
     IncrSearchWindow.DelLastChar;
   end
 else if (Key = #9) or (Key = #13) or (Key = #27) then
   begin
     IncrSearchWindow.Hide;
   end
 else
   begin
     if not IncrSearchWindow.Visible then
       begin
         P.X:= 0; P.Y:= 0;
         P:= <Грид>.Client2Screen(P);
         P.Y:= P.Y + <Грид>.Height + 10;
         IncrSearchWindow.Show(P, Key);
       end
     else
       begin
         IncrSearchWindow.AddChar(Key);
       end;
   end;
end;


2. Обработчик Applet.OnMessage:
function TForm1.KOLApplet1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
 if Form.Visible and IncrSearchWindow.Visible then
   begin
     if IncrSearchWindow.IsCloseIncrSearchWindowMessage(Msg) then IncrSearchWindow.Hide;
   end;
end;


3. А вот сама процедура, которая анализирует текущее сообщение, посылаемое в программу:
function TIncrSearchWindow.IsCloseIncrSearchWindowMessage(const Msg: tagMSG): boolean;
const
 WM_XBUTTONDOWN = $020B;

 SHORTMask = $8000;
 
 VK_0 = $30;
 VK_9 = $39;
 VK_A = $41;
 VK_Z = $5A;

 VK_OEM_1           = $BA;   // ";:" for US
 VK_OEM_PLUS        = $BB;   // "+" any country
 VK_OEM_COMMA       = $BC;   // "," any country
 VK_OEM_MINUS       = $BD;   // "-" any country
 VK_OEM_PERIOD      = $BE;   // "." any country
 VK_OEM_2           = $BF;   // "/?" for US

 VK_OEM_3           = $C0;   // "`~" for US

 VK_OEM_4           = $DB;  //  "[{" for US
 VK_OEM_5           = $DC;  //  "\|" for US
 VK_OEM_6           = $DD;  //  "]}" for US
 VK_OEM_7           = $DE;  //  """" for US

begin
 with Msg do
   begin
     if Message = WM_KEYDOWN then
       begin
         Result:= true;
         // wParam - Specifies the virtual-key code
         // lParam -
         if (hwnd = FKeyMessagesWnd) and
            ((GetKeyState(VK_CONTROL) and SHORTMask) = 0) and
            ((GetKeyState(VK_MENU) and SHORTMask) = 0) then
           begin
             if (wParam = VK_BACK) or
                (wParam = VK_SHIFT) or
                (wParam = VK_SPACE) or
                (wParam >= VK_0) and (wParam <= VK_9) or
                (wParam >= VK_A) and (wParam <= VK_Z) or
                (wParam >= VK_NUMPAD0) and (wParam <= VK_DIVIDE) or
                (wParam >= VK_OEM_1) and (wParam <= VK_OEM_2) or
                (wParam = VK_OEM_3) or
                (wParam >= VK_OEM_4) and (wParam <= VK_OEM_7) { or
                (wParam = ) or}
             then
               begin
                 Result:= false;
               end;
           end;
       end
     else
       begin
         Result:=
           // Mouse Input Messages
           (Message = WM_LBUTTONDOWN) or

           //Keyboard Accelerator Messages
           (Message = WM_SYSCOMMAND) or

           //Keyboard Input Messages
           (Message = WM_ACTIVATE) or
           (Message = WM_APPCOMMAND) or
           (Message = WM_HOTKEY) or
           (Message = WM_SYSKEYDOWN) or

           (Message = WM_KILLFOCUS) or

           // Mouse Input Messages
           (Message = WM_MBUTTONDOWN) or
           (Message = WM_RBUTTONDOWN) or
           (Message = WM_XBUTTONDOWN) or
           (Message = WM_MOUSEWHEEL) or
           (Message = WM_NCLBUTTONDOWN) or
           (Message = WM_NCMBUTTONDOWN) or
           (Message = WM_NCRBUTTONDOWN) or
           (Message = WM_NCXBUTTONDOWN) or

           // Raw Input Messages
           (Message = WM_INPUT);

       end;
   end;
end;


Но здесь получается, что при КАЖДОМ (!) приходящем в программу сообщении, производится его анализ.

Можно ли каким-либо более изящным, простым и быстродействующим образом реализовать нужный функционал???


 
-=Mike=-   (2006-01-13 05:55) [3]

пояснение:

FKeyMessagesWnd - хэндл окна грида, т.е. здесь не рассматриваем сообщения о нажатии клавиши, посылаемые другим контролам.


 
Thaddy   (2006-01-13 11:06) [4]

You can use part of the shellapi like this maybe? Read the options: you can also use it with your own list.


unit autocom1;
{
Title : Autocompleting edit box for KOL
Author : Thaddy de Koning
Date : April 14, 2005
Terms : Copyrighted freeware © 2005
Delphi Version: 4,5,6,7, 2005
Third Party Required: ShlwApi.pas (www.delphi-jedi.org)
Description: As it says :)

program autocomplete;
uses
Kol,
autocom1 in "autocom1.pas";
begin
NewForm1( Form1, nil);
Run(Form1.form);
end.
}

interface
uses
Windows, Messages, Kol, ShlwApi;

const
aoForceOn = $10000000;
aoForceOff = $20000000;
aoAppendForceOn = $40000000;
aoAppendForceOff = $80000000;
aoDefault = $0;
aoFileSystem = $1;
aoUrlHistory = $2;
aoUrlMru = $4;

type

PForm1=^TForm1;
TForm1=object(Tobj)
Form:pControl;
edit:PControl;
public
end;

procedure NewForm1( var Result: PForm1; AParent: PControl );

var
Form1:pForm1;

implementation

procedure NewForm1( var Result: PForm1; AParent: PControl );
var
Options:Dword;
begin
new(Result,Create);
with Result^ do
begin
Form:= NewForm(AParent,"KOL Autocomplete Example").SetSize(400,60);
Applet:=Form;
Form.Add2AutoFree(Result);
Edit:=NewEditbox(form,[]).setalign(caTop);
Edit.color:=clWindow;
Options := aoFileSystem or aoUrlHistory or aoUrlMru or
aoForceOn or aoAppendForceOn;
ShAutoComplete(Edit.Handle,Options);
Edit.Color:=clWindow;
end;
end;

initialization
OleInit;
finalization
OleUnInit;
end.


 
-=Mike=-   (2006-01-13 15:00) [5]

2 Thaddy

Спасибо!
Но это несколько не то, что мне нужно.
Я делаю инкрементный поиск не в контроле типа EditBox, а в контроле таблицы базы данных. Т.е. при наборе пользователем строки появляется сделанное мной окошечко для отображения этой строки и поизционирется курсор таблицы базы данных на найденную строку базы данных. Т.е. я делаю функционал, который сделан в Norton Commander, Total Commander, когда мы держим клавишу Alt и набираем название файла.


 
Thaddy   (2006-01-15 16:45) [6]

Vladimir"s Highlightmemo contains complete ;) autocomplete code for the code completion feature. Simply copy it :)



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

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

Наверх




Память: 0.5 MB
Время: 0.027 c
2-1160418334
dreamse
2006-10-09 22:25
2006.10.29
создание формы динамически


5-1141901266
mss
2006-03-09 13:47
2006.10.29
Как заменить


3-1156914507
jaicomts
2006-08-30 09:08
2006.10.29
Поможите...


2-1160399737
zorik
2006-10-09 17:15
2006.10.29
расширить функции TCanvas


2-1160410435
kami
2006-10-09 20:13
2006.10.29
SendInput( with INPUT_KEYBOARD) &amp; WordPad