Einzelnen Beitrag anzeigen

Benutzerbild von roga
roga

Registriert seit: 15. Jun 2008
Ort: Sachsen-Anhalt
109 Beiträge
 
Delphi XE8 Professional
 
#1

Autovervollständigung im StringGrid

  Alt 22. Sep 2008, 22:06
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.
Ronald
  Mit Zitat antworten Zitat