在 C++Builder 中,TMemo 與 TRichEdit 均封裝了 Windows 編輯控件,可直接發送底層消息獲取光標所在**行號**與**列號**。本文提供最精簡的實現代碼,雙擊按鈕即可測試。
Memo1:多行文本編輯區;Button1:獲取**行號** → 顯示於 Label1;Button2:獲取**列號** → 顯示於 Label2。// 獲取當前行號 (基於 0 的行索引 + 1)
void __fastcall TForm1::Button1Click(TObject *Sender) {
int line = SendMessage(Memo1->Handle, EM_LINEFROMCHAR, -1, 0) + 1;
Label1->Caption = line;
}
// 獲取當前列號 (光標位置 - 行首字符索引 + 1)
void __fastcall TForm1::Button2Click(TObject *Sender) {
int col = Memo1->SelStart - SendMessage(Memo1->Handle, EM_LINEINDEX, -1, 0) + 1;
Label2->Caption = col;
}
| 消息 | 含義 | wParam | lParam |
|---|---|---|---|
EM_LINEFROMCHAR | 字符索引轉行號 | -1 (當前光標) | 0 |
EM_LINEINDEX | 行號轉行首字符索引 | -1 (當前行) | 0 |
SelStart 為光標在全文本中的**字符偏移量** (0-based);EM_LINEFROMCHAR(-1) 返回光標所在**行索引** (0-based);EM_LINEINDEX(-1) 返回當前行**首字符的全文偏移量**;SelStart - 行首偏移 + 1 (視覺上 1-based)。✅ TMemo、TRichEdit、TEdit (單行時列號即 SelStart+1);
✅ 所有封裝 Windows EDIT 控件的 VCL/FMX 組件。
在 Memo1 的 OnClick、OnKeyUp 事件中調用上述邏輯,可實現狀態欄實時顯示「行:列」,類似 IDE 編輯器體驗。