Добавление TextCompletion в ComboBox
Окно адреса Netscape Communicator, диалог "Выполнить" в Windows 98 и другие программы осуществляет очень дружественный интерфейс, известный обычно, как завершение текста. Этот документ описывает, как добавить подобные функциональные особенности в TComboBox.
Наиболее изящный способ и многократного использования добавить эти функциональные возможности - спуститься от TComboBox и overriding ComboWndProc, чтобы обратиться с сообщением WM_KEYUP. Добавляя новое свойство TextCompletion, функциональные возможности могут быть отключены, чтобы использовать ComboBox, подобно стандартному.
unit CompletingComboBox; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TCompletingComboBox = class (TComboBox) private FTextCompletion: Boolean ; function GetTextCompletion: Boolean ; procedure SetTextCompletion( const Value: Boolean ); protected // override the WndProc() so that we can trap KeyUp events. procedure ComboWndProc( var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer ); override; public { Public declarations } published property TextCompletion: Boolean read GetTextCompletion write SetTextCompletion; end ; procedure Register; implementation procedure Register; begin RegisterComponents( 'Standard' , [TCompletingComboBox]); end ; { TCompletingComboBox } function TCompletingComboBox . GetTextCompletion: Boolean ; begin Result := fTextCompletion; end ; procedure TCompletingComboBox . SetTextCompletion( const Value: Boolean ); begin fTextCompletion := Value; end ; procedure TCompletingComboBox . ComboWndProc( var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer ); var rc, len: Integer ; begin inherited ; case Message . Msg of WM_KEYUP: begin // test to see if its a character that should not be // processed. if (Message . WParam <> 8 ) and (Message . WParam <> VK_DELETE) and (Message . WParam <> VK_SHIFT) and (FTextCompletion = True ) then begin // Use CB_FINDSTRING to locate the string in the Items // property rc := Perform(CB_FINDSTRING, - 1 , Integer ( PChar (Caption))); // if its in there then add the new string to the Text // and select the portion that wasn't typed in by the // user if rc <> CB_ERR then begin // store the length of the current string len := Length(Text); // set the new string ItemIndex := rc; // highlight the rest of the text that was added. SelStart := len; SelLength := Length(Text) - len; // return 0 to signify that the message has been // handled. Message . Result := 0 ; end ; end ; end ; end ; // case end ; end . |
Комментарии