【问题标题】:Get the caret position (line and char) in an FMX TMemo获取 FMX TMemo 中的插入符号位置(行和字符)
【发布时间】:2021-05-08 10:51:35
【问题描述】:

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

我试过了:

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

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

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

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

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

谢谢你的回答。

Selticq。

【问题讨论】:

    标签: delphi firemonkey caret tmemo


    【解决方案1】:

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

    documentation证实了这一点:

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

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

    [...]

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

    【讨论】:

    • :-s,我觉得我太累了...谢谢你的快速反应。
    【解决方案2】:

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

    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.
    

    【讨论】:

    • 感谢您的快速回复和质量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多