Danke für die Infos bisher
@Hawkeye: Nein, da verschwende ich keinen Gedanken daran, weil mir die Combobox nicht gefällt. Die Daten, mit denen mein Autovervollständigen arbeiten soll werden aus einem StringGrid kommen, das aus einer Datenbank gefüllt wird.
Ich habe jetzt mal was probiert, was sogar (weitgehend) funktioniert, aber noch Fragen bei mir aufwirft.
Delphi-Quellcode:
type
TXTEdit = class(TEdit)
private
FAutocomplete: Boolean;
FBAutocomplete: Boolean;
FSearchList: TStrings;
//FOnAutocomplete: TXTAutocompleteEvent;
protected
procedure DoAutocomplete;
procedure CMChanged(var Message: TMessage); message CM_CHANGED;
public
constructor Create(AOwner: TComponent);Override;
destructor Destroy; override;
property Autocomplete: Boolean read FAutocomplete write FAutocomplete default False;
//property OnAutocomplete: TXTAutocompleteEvent read FOnAutocomplete write FOnAutocomplete;
property Searchlist: TStrings read FSearchlist write FSearchlist;
end;
TForm3 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
Edit: TXTEdit;
public
{ Public-Deklarationen }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
constructor TXTEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSearchlist:=TStrings.Create;
end;
destructor TXTEdit.Destroy;
begin
FSearchlist.Free;
inherited Destroy;
end;
procedure TXTEdit.DoAutocomplete;
var I, StartPos: Integer;
begin
if assigned(FSearchlist) then
begin
for I:=0 to FSearchlist.Count-1 do
begin
if (Text='') or (LowerCase(FSearchlist.Strings[I])=LowerCase(Text)) then
begin
// if assigned(FOnAutocomplete) then
// OnAutocomplete(I);
Exit;
end;
if StrLComp(PChar(LowerCase(FSearchlist.Strings[I])), PChar(LowerCase(Text)),
Length(Text)) = 0 then
begin
StartPos := Length(Text);
Text := Text + Copy(FSearchlist.Strings[I], StartPos + 1, Length(FSearchlist.Strings[I]));
SelStart := StartPos;
SelLength := Length(Text) - StartPos;
// if assigned(FOnAutocomplete) then
// OnAutocomplete(I);
Exit;
end;
end;
end;
end;
procedure TXTEdit.CMChanged(var Message: TMessage);
begin
if FAutocomplete then
DoAutocomplete;
inherited;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
Edit:=TXTEdit.Create(self);
Edit.Parent:=Form3;
Edit.Searchlist:=Listbox1.Items;
end;
procedure TForm3.FormDestroy(Sender: TObject);
begin
Edit.Searchlist:=nil; //Warum brauche ich das???
end;
end.
Wenn ich die Zeile in FormDestroy nicht einfüge, dann kommt es zu einer ungültigen Zeigeroperation. Warum?