VCL How To - Standard 元件篇 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
元件名稱:TMemo 元件的進階使用
文件版本:for BCB
文件作者:bruce0211@yahoo.com.tw 2003/05/02 ■ 取得編輯游標(Edit Cursor)的目前座標 求 y 及 x 座標 int y = Memo1->CaretPos.y;
int x = Memo1->CaretPos.x;
或
int y = SendMessage(Memo1->Handle,EM_LINEFROMCHAR,Memo1->SelStart,0);
int x = Memo1->SelStart - SendMessage(Memo1->Handle,EM_LINEINDEX,y,0);
或
int y = Memo1->Perform(EM_LINEFROMCHAR, -1, 0);
int x = Memo1->SelStart - Memo1->Perform(EM_LINEINDEX, -1, 0); 根據測試 (BCB 5.0) 使用 Memo1->CaretPos.y , Memo1->CaretPos.x 會有 bug , 在某些位置會讀出負值出來
故下面的例子不使用
//------------------------------------------------------------------------- //顯示目前編輯座標的函式,本函式可放於 Memo 的 OnClick() 及 OnKeyUp() 事件中 //隨時將目前編輯座標位置顯示在 Label1 中 //------------------------------------------------------------------------- void __fastcall TForm1::DispPosition() { int begin_position=1; //座標開始位置(筆者喜歡把第一列看做是 Line 1 而不是 Line 0) int y=SendMessage(Memo1->Handle,EM_LINEFROMCHAR,Memo1->SelStart,0); int x=Memo1->SelStart - SendMessage(Memo1->Handle,EM_LINEINDEX,y,0); Label1->Caption="Line:" IntToStr(y begin_position) " Col:" IntToStr(x); }■ 將 MEMO 某列反白 直接在程式碼中做說明 , 使用方法為 若要將 MEMO1 第 5 列整列反白則呼叫 LineIndexTo(5); void __fastcall TForm1::LineIndexTo(int row) { long TopRow,StartPostion,EndPostion; //將 Memo 的 View 移到目的行 TopRow=SendMessage(Memo1->Handle, EM_GETFIRSTVISIBLELINE, 0, 0); //抓取目前 Memo1 中可視的第一列(Row)列號 SendMessage(Memo1->Handle, EM_LINESCROLL, 0, row - TopRow); //向下捲 row - TopRow 列 (若為負值則向上) //取得 row 頭尾字元位置 StartPostion = SendMessage(Memo1->Handle, EM_LINEINDEX, row, 0); //取得 Memo 中第 row 列開頭的字元位置 EndPostion = SendMessage(Memo1->Handle, EM_LINEINDEX, (row 1), 0) - 1 ; //將所指定的範圍位置反白 SendMessage(Memo1->Handle, EM_SETSEL, StartPostion, EndPostion); //上列程式碼同下 //Memo1->SelStart=StartPostion; //Memo1->SelLength=EndPostion-StartPostion-1; Memo1->SetFocus(); } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |