Auto-Vervollständigung aus dem System


In diesem Kapitel soll es nur um die Auto-Vervollständigung gehen, die Ihnen vom System zur Verfügung gestellt wird. Minimal erforderlich ist dazu allerdings der Internet Explorer 5. Das bedeutet, unter Windows 95 und 98 sowie NT4 könnte es möglicherweise zu Problemen kommen, wenn der Anwender keinen oder einen veralteten IE benutzt.

Die Auto-Vervollständigung lässt sich nur für Eingabefelder verwenden. Dazu zählt auch das in eine ComboBoxEx eingebettete Edit-Control. Und sie verhält sich wie die vom System bekannten Funktionen. Das heißt, bei einer ComboBoxEx zeigt Ihnen die Auto-Vervollständigung nicht die Werte an, die in Ihrer ComboBox stehen, sondern Sie sehen die Namen von gestarteten Programmen, die URLs aufgerufener Internetseiten, usw.



In der Praxis lohnt sich diese Shell-Funktion daher eigentlich nur, wenn Sie Ihr Programm mit einer ähnlichen Eingabezeile wie Start/Ausführen ausrüsten wollen und zusätzlich gern Unterstützung vom System hätten.

Die Auto-Vervollständigung besteht aus zwei Teilen: AutoAppend bedeutet, dass der von Ihnen eingegebene Text automatisch beim Tippen komplettiert wird (sofern irgendein String in der MRU-Liste der Shell mit den getippten Buchstaben identisch ist). Und als AutoSuggest bezeichnet man das kleine Fenster, dass beim Tippen aufklappt und Ihnen die MRU-Liste anzeigt.

Hinweis

Möglicherweise ist Ihre Delphi-Version zu alt und kennt den Befehl "SHAutoComplete" deshalb noch nicht. Für den Fall finden Sie in den Beispielprogrammen die Unit "ShlObj_Fragment.pas", die den Befehl samt Flags enthält und auch vom Beispielprogramm ("Edit_R2.dpr") benutzt wird.

Um die Auto-Vervollständigung nutzen zu können, muss Ihr Programm beim Start den Befehl "CoInitialize", und beim Beenden "CoUninitialize" (Unit "ActiveX") aufrufen.
Das bedeutet aber auch, dass speziell der letzte Befehl nicht irgendwo vorher ein zweites Mal aufgerufen werden darf. Idealerweise sollten Sie darum so vorgehen:

if(CoInitialize(nil) = S_OK) then
try
  // Fenster erzeugen, &
  // Nachrichtenbearbeitung starten
finally
  CoUninitialize;
end;

und zwischen try und finally den notwendigen Code zum Erstellen der Anwendung usw. einfügen.

Wenn Sie ein Edit-Control mit der Auto-Vervollständigung ausrüsten wollen, dann benutzen Sie einfach dessen Handle und rufen Sie den schon genannten Befehl "SHAutoComplete" auf:

SHAutoComplete(hwndEdit1,SHACF_DEFAULT);

Der zweite Parameter kann dabei eins der folgenden Flags sein

Wert Bedeutung
SHACF_DEFAULT Identisch mit SHACF_FILESYSTEM + SHACF_URLALL. Kann nicht mit anderen Flags kombiniert werden!
SHACF_FILESYSTEM Berücksichtigt das Dateisystem (sprich: die MRU-Liste der gestarteten Programme, usw.)
SHACF_URLALL Berücksichtigt den Verlauf und die zuletzt eingetippten URLs des IE. Entspricht SHACF_URLHISTORY + SHACF_URLMRU
SHACF_URLHISTORY Berücksichtigt den Verlauf
SHACF_URLMRU Berücksichtigt die zuletzt eingetippten URLs im IE
SHACF_USETAB Mit Tab kann nun jeweils ein Item aus der MRU-Liste (AutoSuggest) gewählt werden. Ist das Flag nicht gesetzt, gelangt man mit Tab wie gewöhnlich zum nächsten Control. Nur in Kombination mit SHACF_FILESYS* oder SHACF_URL* sinnvoll.

Die folgenden Flags dienen dazu, die IE-Einstellungen in der Registry zu überschreiben. Und sie funktionieren nur in Verbindung mit den SHACF_FILESYS*- oder SHACF_URL*-Flags

SHACF_AUTOAPPEND_FORCE_OFF unabhängig von der Registryeinstellung wird AutoAppend für die Eingabezeile ausgeschaltet
SHACF_AUTOAPPEND_FORCE_ON unabhängig von der Registryeinstellung wird AutoAppend für die Eingabezeile eingeschaltet
SHACF_AUTOSUGGEST_FORCE_OFF unabhängig von der Registryeinstellung wird AutoSuggest für die Eingabezeile ausgeschaltet
SHACF_AUTOSUGGEST_FORCE_ON unabhängig von der Registryeinstellung wird AutoSuggest für die Eingabezeile eingeschaltet

Zu guter Letzt noch ein kleiner Blick darauf, wie man die Auto-Vervollständigung für eine ComboBoxEx benutzt. Die Aufgabe beschränkt sich allerdings nur darauf, das Handle des eingebetteten Edit-Controls zu erhalten. Die ComboBoxEx stellt dazu eine eigene Nachricht zur Verfügung, "CBEM_GETEDITCONTROL", womit auch klar wird, warum die Auto-Vervollständigung nur bei ihr nutzen kann: die normale ComboBox bietet nichts vergleichbares.
Wie dem auch sei, wenn Sie das Handle des Eingabefeldes ermittelt haben, dann entspricht der Aufruf des Befehls dem eingangs gezeigten Beispiel:

hEdit := SendMessage(hCBEx,CBEM_GETEDITCONTROL,0,0);
if(hEdit <> 0) then
  SHAutoComplete(hEdit,SHACF_DEFAULT);