如何在Delphi StringGrid单元格中移动光标位置?

时间:2016-09-20 15:32:22

标签: delphi tstringgrid

当你有一个设置了goEditing选项的TStringGrid并且一个单元格中有几行文本时,当你通过点击它来编辑该单元格时,光标将位于该文本的最后。如何将光标移动到另一个位置?我的特殊问题是,如果文本末尾有回车符,则用户认为该单元格为空。我想在任何回车之前移动光标。

2 个答案:

答案 0 :(得分:4)

我建议尝试避免在StringGrid中存储拖尾换行符,而不是试图操纵编辑器的光标。您可以使用OnGetEditText事件在编辑器激活时修剪尾随换行符,并使用OnSetEditText事件在用户输入新文本时将其修剪掉。

答案 1 :(得分:4)

假设您使用的是 VCL InplaceEditor属于TCustomGrid的属性。它的类型TInplaceEdit来自TCustomEdit。您可以将光标移动到其中,就像TEdit

一样

如果您使用自动编辑单元格内容的方式,则可以使用以下方式移动光标。我测试了它,它适用于我。 (我在Windows 10中使用柏林)

unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids;

const
  WM_MY_MESSAGE = WM_USER + 1;

type
  TStringGridEx = class helper for TStringGrid
  public
    function GetInplaceEditor(): TInplaceEdit;
  end;

  TForm1 = class(TForm)
    aGrid: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure aGridGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: string);
  private
    procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.aGridGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: string);
begin
  PostMessage(Handle, WM_MY_MESSAGE, 0, 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  y: Integer;
  x: Integer;
begin
  for y := 0 to aGrid.RowCount do
  begin
    for x := 0 to aGrid.ColCount do // fill the grid
      aGrid.Cells[x, y] := Format('Col %d, Row %d'#13#10, [x, y]);
  end;
end;

procedure TForm1.OnMyMessage(var Msg: TMessage);
var
  pInplaceEdit: TInplaceEdit;
begin
  pInplaceEdit := aGrid.GetInplaceEditor();
  if Assigned(pInplaceEdit) then
  begin
    pInplaceEdit.SelStart := pInplaceEdit.EditText.TrimRight.Length;
    pInplaceEdit.SelLength := 0;
  end;
end;

{ TStringGridEx }

function TStringGridEx.GetInplaceEditor: TInplaceEdit;
begin
  Result := InplaceEditor; // get access to InplaceEditor
end;

end.

萨姆