Форум: "KOL";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизНужно реализовать следующий функционал для инкрементного поиска Найти похожие ветки
← →
-=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 вся ветка
Форум: "KOL";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.043 c