Einzelnen Beitrag anzeigen

Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#1

Komponente ComboBox mit AutoFill-Funktion

  Alt 11. Feb 2003, 23:08
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
  Mit Zitat antworten Zitat