2016-09-20 227 views
1

あなたはgoEditingオプションセットとセルとのTStringGridを持って、それに数行のテキストを持って、カーソルがそのテキストの最後になります。どのようにカーソルを別の位置に移動できますか?私の特に問題は、テキストの末尾に改行がある場合、ユーザーはセルが空であると考えます。キャリッジが戻る前にカーソルを移動したいと思います。DelphiのStringGridセルでカーソル位置を移動する方法は?あなたがそれをクリックすることで、そのセルを編集するために行くとき

+0

あなた可能性(メイングリッドではない)場所エディタでの、エディタコントロールのホールドを取得し、クリックした後のSelectAllをやってみてください –

答えて

4

VCLを使用しているとしますと、InplaceEditorTCustomGridのプロパティです。タイプTInplaceEditで、TCustomEditから降下しています。あなたはその中にカーソルを移動することができますTEditちょうどのように。

あなたは、セルの内容を編集する自動的な方法を使用している場合は、カーソルを移動するには、次の方法を使用することができます。私はそれを試して、それは私のために働く。

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. 

サム

+0

? TStringGridには、私が見ることのできるSelStartのようなものはありません。 – fullerm

+0

OKしかし、どこでSelStartを設定しますか? GetEditTextまたはSetEditTextに設定することは機能していないようです。 – fullerm

+2

@ fulllermエディタをどのように表示するかわからない。 'ShowEditor'関数を使って編集を開始した場合は、その直後に' SelStart'を設定します。それが自動であれば、より多くの作業をする必要があります。あなたのコードと状況に応じて。 1つの方法は、 'OnGetEditText'の中からメインフォームにカスタムメッセージを投稿し、後で' SelStart'を設定することができます。 – Sam

4

のではなく、エディタのカーソルを操作しようと、私はそもそもStringGridの末尾の改行を保存しないようにしようとしているお勧めします。 OnGetEditTextイベントを使用して、エディタがアクティブになったときに末尾の改行をトリムし、ユーザーが新しいテキストを入力したときにオフフックするOnSetEditTextイベントを使用できます。

+0

(Iは、Windows 10でベルリンを使用しています)私は後続のキャリッジリターンを格納することができる必要があります。 – fullerm

+0

その後、 'OnSetEditText'を使用しないでください。 – NGLN

関連する問題