1

我尝试在包含两个标签的状态栏中显示备忘录插入符号的位置。

我试过这个:

lblX.Text := Memo.Caret.Pos.X.ToString();

lblY.Text := Memo.Caret.Pos.Y.ToString();

这两个值似乎代表了备忘录左侧和顶部的实际位置。

是否可以将其作为行(行)和列(字符)?

我想澄清一下,我使用firemonkey是为了能够将我的项目编译到 windows 和 linux 上。

谢谢你的回答。

塞尔蒂奇克。

4

2 回答 2

2

我以前从未使用过 FMX,但使用 Code Insight 我立即发现Memo.CaretPosition.LineMemo.CaretPosition.Pos分别表示当前行和列。

文件证实了这一点:

Line表示包含光标的行号,从零开始索引。

Pos表示光标的水平字符坐标,从零开始索引。

[...]

因此,如果Line = 3Pos = 5,则光标位于第四行和从行首开始的第六个字符处。

于 2021-05-08T11:35:53.790 回答
1

如果要显示备忘录插入符号的位置,可以使用如下代码:

procedure TForm1.UpdateCaretPosDisplay;
begin
    lblX.Text := (Memo1.CaretPosition.Pos + 1).ToString;
    lblY.Text := (Memo1.CaretPosition.Line + 1).ToString;
end;

如果您想要一个完整的示例代码,其中该方法在正确的事件处理程序中调用,这里是:

unit FmxMemoCaretPosDemoMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types,
  FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    StatusBar1: TStatusBar;
    lblX: TLabel;
    lblY: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
    procedure Memo1Enter(Sender: TObject);
    procedure Memo1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift:
        TShiftState);
    procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift:
        TShiftState; X, Y: Single);
  private
    procedure UpdateCaretPosDisplay;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
begin
    UpdateCaretPosDisplay;
    ActiveControl := Memo1;
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
    UpdateCaretPosDisplay;
end;

procedure TForm1.Memo1Enter(Sender: TObject);
begin
    UpdateCaretPosDisplay;
end;

procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
    Shift: TShiftState);
begin
    UpdateCaretPosDisplay;
end;

procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Single);
begin
    UpdateCaretPosDisplay;
end;

procedure TForm1.UpdateCaretPosDisplay;
begin
    lblX.Text := (Memo1.CaretPosition.Pos + 1).ToString;
    lblY.Text := (Memo1.CaretPosition.Line + 1).ToString;
end;

end.
于 2021-05-08T12:17:27.827 回答