Autovervollständigung im StringGrid
Bestimmte Zellen sollen mit einer Autovervollständigung versehen werden. AutoCompleteItems enthält die entsprechenden Wörter. Soll keine Vervollständigung stattfinden, wird die Liste im Hauptprogramm über SelectCell geleert.
Beispiel: if (ACol = 2) then AutoCompleteItems.Load... else AutoCompleteItems.Clear;
Um an den integrierten Editor heranzukommen und auch Änderungen am StringGrid vorzunehmen, wurde eine entsprechende Komponente entwickelt.
Nun mein Problem: Bei der Eingabe im StringGrid erfolgt keine Vervollständigung, erst wenn ich die Zelle erneut mit Enter selektiere klappt's.
Hier die wichtigsten Codefetzen aus der Kombo:
Delphi-Quellcode:
...
type
TRGSInplaceEdit = class(TInplaceEdit)
private
protected
public
published
end;
TRGSStringGrid = class(TStringGrid)
private
...
FAutoComplete: Boolean;
FAutoCompleteItems: TStringList;
...
procedure SetAutoCompleteItems(Value: TStringList);
procedure EditorAutoComplete;
protected
function CreateEditor: TInplaceEdit; override;
procedure EditorChange(Sender: TObject);
procedure EditorKeyPress(Sender: TObject; var Key: Char);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
...
published
...
property AutoCompleteItems: TStringList read FAutoCompleteItems write SetAutoCompleteItems;
end;
...
implementation
(*************************************)
constructor TRGSStringGrid.Create(AOwner: TComponent);
begin
inherited;
...
FAutoComplete := False;
FAutoCompleteItems := TStringList.Create;
end;
(*************************************)
destructor TRGSStringGrid.Destroy;
begin
FAutoCompleteItems.Free;
inherited;
end;
(*************************************)
procedure TRGSStringGrid.SetAutoCompleteItems(Value: TStringList);
begin
FAutoCompleteItems.Assign(Value);
end;
(*************************************)
procedure TRGSStringGrid.EditorAutoComplete;
var i, StartPos: Integer;
begin
for i := 0 to FAutoCompleteItems.Count -1 do
begin
with TRGSInplaceEdit(InplaceEditor) do
begin
if (EditText = '') or (LowerCase(FAutoCompleteItems.Strings[i]) = LowerCase(EditText)) then
exit;
if StrLComp(PChar(LowerCase(FAutoCompleteItems.Strings[i])),
PChar(LowerCase(EditText)), Length(EditText)) = 0 then
begin
StartPos := Length(EditText);
EditText := EditText + Copy(FAutoCompleteItems.Strings[i], StartPos + 1,
Length(FAutoCompleteItems.Strings[i]));
SelStart := StartPos;
SelLength := Length(EditText) - StartPos;
exit;
end;
end;
end;
end;
(*************************************)
procedure TRGSStringGrid.EditorChange(Sender: TObject);
begin
if (FAutoCompleteItems.Count > 0) and FAutoComplete then EditorAutoComplete;
end;
(*************************************)
procedure TRGSStringGrid.EditorKeyPress(Sender: TObject; var Key: Char);
begin
FAutoComplete := (FAutoCompleteItems.Count > 0) and not (Key in NAC);
end;
(*************************************)
function TRGSStringGrid.CreateEditor: TInplaceEdit;
begin
Result := TRGSInplaceEdit.Create(Self);
UpdateEditor(Result);
//------------------------------------
TRGSInplaceEdit(Result).OnChange := EditorChange;
TRGSInplaceEdit(Result).OnKeyPress := EditorKeyPress;
end;
...
Ich bin über jeden Tipp dankbar! RoGa
Das Aufsetzen von Editfeldern oder Comboboxen wollte ich möglichst vermeiden.