Delphi - Automatikus tartalom kitöltés a TEdit-hez

forráskód letöltése
Az MS Internet Explorer 5.0-tól kezdve, ha a böngészőbe például egy web lap címét kezdjük el begépelni, akkor a program automatikusan felajánl egy listát, mely az addig begépelt szövegnek megfelelő címet takar. Ebből a listából a felhasználó tetszőlegesen választhat.

Ezt a lehetőséget nem csak web címek beírására használhatjuk, hanem más adatbevitelre is.

A mellékelt TAutoCompleteEdit komponens segítségével létrehozunk egy olyan TEdit-ből származó objektumot, mely rendelkezik a fent leírt funkcióval, így most már saját alkalmazásainkban is kihasználhatjuk az IE nyújtotta lehetőséget. A mellékelt példaprogram megnyitása előtt az AutoCompleteEdit.pas-ban lévő komponenst telepítenie kell a Delphi alá.

Nézzük, hogyan használhatjuk ezt a komponenst.

Az Options property-n keresztül a következő beállításokat végezhetjük el:
  • acoFileSystem - a megjelenő listában az állomány rendszer lesz látható, beleérve a virtuális könyvtárakat is, mint például a Control Panel
  • acoUrlHistory - a már meglátogatott weblap címek
  • acoUrlMRU - a Start menü Run menüpontjánál megjelenő ablakánál lévő lista
  • acoUseTab - a Tab billentyű használatának szabályozása, amikor a lista aktív
AppendForce property-nél, ha afOn értéket választunk, akkor a komponensünkbe a szöveg gépelésekor automatikusan beírásra kerül a leginkább megfelelő szöveg az addig begépeltek alapján. Ekkor ez az automatikusan bekerült szövegrész kijelölésre is kerül, így ha tovább gépelünk, akkor felülírjuk azt.

SuggestForce property-nél, ha sfOn értéket választunk, akkor a szöveg begépelésekor megjelenik egy legördülő lista, mint egy TComboBox-nál, ahol felsorolva láthatjuk a lehetséges szövegeket.


Ezek után térjünk át a komponens működésére.

Hogy egy TEdit a fentieknek megfelelően működjön, nincs másra szükség, mint meghívni a Shlwapi.dll-ben lévő SHAutoComplete nevű függvényt, amelynek paraméterként át kell adnunk a TEdit azonosítóját, illetve a fent ismertetett property-kből származó értékeket.

Mivel tehát e függvény külső, így első lépésként deklarálnunk kell azt:
function AutoComplete(Handle: HWND; Flag: DWORD): 
  HRESULT; stdcall; external 'Shlwapi.dll' name 'SHAutoComplete';
Ha ez megvan, akkor a komponens CreateWnd metódusát felülírva meghívjuk ezt a függvényt.
procedure TAutoCompleteEdit.CreateWnd;
const
  ov: array[TAutoCompleteOption] of DWORD=
         (SHACF_FILESYSTEM, SHACF_URLHISTORY, 
          SHACF_URLMRU, SHACF_USETAB);
var
  flag: DWORD;
  i: TAutoCompleteOption;
begin
  inherited CreateWnd;
  flag:=SHACF_DEFAULT;
  for i:=Low(TAutoCompleteOption) to 
       High(TAutoCompleteOption) do begin
    if (i in FOptions) then begin
      inc(flag, ov[i]);
    end;
  end;
  case FAppendForce of
    afOn: inc(flag, SHACF_AUTOAPPEND_FORCE_ON);
    afOff: inc(flag, SHACF_AUTOAPPEND_FORCE_OFF);
  end;
  case FSuggestForce of
    sfOn: inc(flag, SHACF_AUTOSUGGEST_FORCE_ON);
    sfOff: inc(flag, SHACF_AUTOSUGGEST_FORCE_OFF);
  end;
  AutoComplete(Handle, flag);
end;
Ezzel a függvényhívással le is tudtuk a munkánk jelentős részét, a többi már a Shlwapi.dll dolga.