Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1160806186
dreamse
2006-10-14 10:09
2006.10.29
Запись в реестр с ограничеными правами


15-1160061270
ProgRAMmer Dimonych
2006-10-05 19:14
2006.10.29
Подскажите, плз, адреса,


15-1159932205
Александр Иванов
2006-10-04 07:23
2006.10.29
Смешение бизнес-логики и интерфейса в классах


2-1160705558
Sunrice
2006-10-13 06:12
2006.10.29
поиск по тексту с последующим вырезанием кусков


9-1137705526
Аццкий_рыцарь:)
2006-01-20 00:18
2006.10.29
Освещение в DelphiX...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский