Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Autovervollständigung im StringGrid (https://www.delphipraxis.net/121128-autovervollstaendigung-im-stringgrid.html)

roga 22. Sep 2008 22:06


Autovervollständigung im StringGrid
 
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.

roga 23. Sep 2008 16:30

Re: Autovervollständigung im StringGrid
 
Habe die Textvervollständigung jetzt über StringGrid.KeyUp gelöst. Ist zwar nicht wie geplant, aber vorerst muss es genügen - es wird nur nach dem ersten Buchstaben ergänzt, also keine richtige Vervollständigung wie man es bzw. von Excel gewohnt ist. Schade...

RoGa


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz