Карта сайтаСсылкиКонтакты

Включение особенности автозавершения

PDF Печать
Статьи

Можно добавить особенность автозавершения, как в Internet Explorer для полей TEdit.

Есть небольшая известная функция по имени SHAutoComplete, которая находится в shwlapi.dll. Вызов этой функции с дескриптором поля редактирования и соответствующих флагов позволяет выполнять автозавершение.

Но есть одна важная вещь - функция работает только после того, как Вы вызываете OLE-связанную функцию CoInitialize ( или CoInitializeEx). Эта задача выполняется инициализацией секции модуля ComObj.

Вот простой пример, как это использовать:


unit AutoCompleteUnit; 

interface 

uses Windows, StdCtrls, ComObj; 

Const 
  SHACF_DEFAULT = $0; 
  SHACF_FILESYSTEM  = $1; 
  SHACF_URLHISTORY  = $2; 
  SHACF_URLMRU  = $4; 
  SHACF_URLALL = (SHACF_URLHISTORY Or SHACF_URLMRU); 
  SHACF_AUTOSUGGEST_FORCE_ON = $10000000; 
  SHACF_AUTOSUGGEST_FORCE_OFF = $20000000; 
  SHACF_AUTOAPPEND_FORCE_ON = $40000000; 
  SHACF_AUTOAPPEND_FORCE_OFF = $80000000; 

function AutoComplete(editField: TEdit; dwFlags: DWORD): Boolean; 

implementation 

function SHAutoComplete(hwndEdit: HWND; dwFlags: dWord): LongInt; 
         stdcall; external 'shlwapi.dll'; 

function AutoComplete(editField: TEdit; dwFlags: DWORD): Boolean; 
begin 
     Result := (SHAutoComplete(editField.Handle, dwFlags) = 0); 
end; 

end. 

Все функции, которые зависят от определенной программы/версии/dll, должны использовать динамическое связывание. Иначе программа не будет запускаться, если необходимая функция недоступна.

Измените код, подобно этому:


unit AutoCompleteUnit; 

interface 

uses Windows, StdCtrls, ComObj; 

Const 
  SHACF_DEFAULT = $0; 
  SHACF_FILESYSTEM  = $1; 
  SHACF_URLHISTORY  = $2; 
  SHACF_URLMRU  = $4; 
  SHACF_URLALL = (SHACF_URLHISTORY Or SHACF_URLMRU); 
  SHACF_AUTOSUGGEST_FORCE_ON = $10000000; 
  SHACF_AUTOSUGGEST_FORCE_OFF = $20000000; 
  SHACF_AUTOAPPEND_FORCE_ON = $40000000; 
  SHACF_AUTOAPPEND_FORCE_OFF = $80000000; 

function AutoComplete(editField: TEdit; dwFlags: DWORD): Boolean; 

implementation 

type TShAutoCompleteFunc = function(hwndEdit: HWND; dwFlags: dWord): LongInt; stdcall; 

var SHAutoComplete: TShAutoCompleteFunc; 
     theDLL: THandle; 

function AutoComplete(editField: TEdit; dwFlags: DWORD): Boolean; 
begin 
  if @ShAutoComplete <> nil then 
     Result := (SHAutoComplete(editField.Handle, dwFlags) = 0) 
  else 
    Result := false; 
end; 

initialization 
  theDLL := LoadLibrary('shlwapi.dll'); 
  if theDLL <> 0 then 
    @ShAutoComplete := GetProcAdress(theDLL, 'SHAutoComplete'); 
finalization 
  if theDLL <> 0 then FreeLibrary(theDLL); 
end. 

По материалам http://delphi.3000.com


 

Добавить комментарий


Защитный код
Обновить