Hallo Leute,
ich nutze seit längerer Zeit eine Funktion, um ComboBoxen automatisch während der Eingabe zu füllen, dh. man tippt ein Zeichen, und über ein in OnChange verankertes Unterprogramm wird in den Items nach dem ersten passenden Eintrag gesucht. Wird einer gefunden, wird der Eintrag in ComboBox.Text aufgefüllt und markiert. Mit dem nächsten Zeichen wiederholt sich das Ganze.
Nachteil: Man muß bei jeder verwendeten ComboBox in KeyDown ein globale Variable LastKey mit key:word belegen, um diese dann in OnChange auszuwerten. Funktioniert, ist aber lästig.
Nun habe ich eine Komponente erzeugt, die das auch macht, ohne daß ich immer die gleichen Prozeduren hinterlegen muß.
Da es sich um meine erste eigene Komponente handelt, stelle ich das Ergebnis hier zur Diskusion zur Verfügung. Vielleicht sind ja noch ein paar Verbesserungen oder/und sinnvolle Erweiterungen möglich.
Delphi-Quellcode:
unit ComboBoxAF;
//ComboBox AutoFill
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TComboBoxAF =
class(TComboBox)
private
{ Private-Deklarationen }
FAutoFill : Boolean;
FLastKey : word;
FOnKeyDown : TKeyEvent;
function GetLastKey : word;
procedure SetLastKey(key : word);
function GetAutoFill : Boolean;
procedure SetAutoFill(value : Boolean);
protected
{ Protected-Deklarationen }
procedure KeyDown(
var Key: Word; Shift: TShiftState);
override;
procedure Change;
override;
public
{ Public-Deklarationen }
constructor Create(aOwner: TComponent);
override;
Destructor Destroy;
override;
property OnKeyDown : TKeyEvent
read FOnKeyDown
write FOnKeyDown;
published
{ Published-Deklarationen }
property LastKey : word
read GetLastKey
write SetLastKey;
property AutoFill : Boolean
read GetAutoFill
write SetAutoFill;
end;
procedure Register;
implementation
procedure TComboBoxAF.Change;
var
srch :
string;
ix : integer;
begin
if Focused
and AutoFill
then begin
srch := Text;
if LastKey = $08
then begin
LastKey := 0;
end
else begin
LastKey := 0;
ix := Perform(CB_FINDSTRING, -1, LongInt(PChar(srch)));
if ix > CB_ERR
then begin
ItemIndex := ix;
SelStart := Length(srch);
SelLength := Length(Text) - length(srch);
end;
end;
end;
Inherited;
end;
procedure TComboBoxAF.KeyDown(
var Key: Word; Shift: TShiftState);
begin
Inherited;
// KeyDown(Key, Shift);
FLastKey := key;
end;
function TComboBoxAF.GetLastKey : word;
begin
Result := FLastKey;
end;
procedure TComboBoxAF.SetLastKey(key : word);
begin
FLastKey := key;
end;
function TComboBoxAF.GetAutoFill : Boolean;
begin
Result := FAutoFill;
end;
procedure TComboBoxAF.SetAutoFill(value : Boolean);
begin
FAutoFill := value;
end;
constructor TComboBoxAF.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FLastKey := 0;
FAutoFill := true;
end;
Destructor TComboBoxAF.Destroy;
Begin
inherited Destroy;
End;
procedure Register;
begin
RegisterComponents('
Beispiele', [TComboBoxAF]);
//
end;
end.
mfg
eddy