国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

活用 SetSelTextBuf

2019-11-17 05:08:40
字體:
來源:轉載
供稿:網友

  p>  SetSelTextBuf 是 TCustomEdit 類及其子類的文本替換方法,原本用它來置換選定的數據,如我們最常用的Replace 命令多半是由它來完成的。現在,我們把其延伸使用一下,看會有什么結果。我們先從 SetSelTextBuf 的定義開始:
  PRocedure SetSelTextBuf(Buffer: PChar);
  這里,SetSelTextBuf需要一個以空字符結尾字串,所以我們可以知道其后果肯定是一個塊操作。在使用 SetSelTextBuf的時候,一般要配合 SelText 屬性來確診是否有文本塊被選中,然后才進行下一步。當有被選擇的文本對象時,SelText即是其內容,我們可以簡單地修改 SelText 來達到目的,一旦被更改的對象比較龐大, SetSelTextBuf 就會被派上用途。我們試想一下,當沒有選中或是SelText屬性為空 ,這時調用 SetSelTextBuf 就會發生了什么:Buffer 里的東西被填進了當前光標所在的位置。果真如此。這樣一來,對于可以格式化的數據流(文本),利用 SetSelTextBuf 就能大大增強 TCustomEdit類的編輯能力,最起碼對于文本的 Insert, Append 就不費多大的氣力就輕易搞定,盡管 TCustomEdit 類沒有提供這樣的函數和方法。
下面就來說說這種 Insert 與 Append 如何實現。
  Append 對我們來說比較輕易,把光標移到文本后,調用 SetSelTextBbuf 即可。而 移動光標最笨最直接的方法就是追加一空字符或空行,然后再將它刪了,這在TCustom-Edit 類中簡直就是舉手之勞。Insert 要相對復雜一些。只要完成了光標的移動,那么在任何地方的插入就輕易多了(SetSelTextBuf)。從 TCustomEdit 的定義中我們了解到有一個 SetSelStart 的方法起定義為:
   procedure SetSelStart(Value: Integer); virtual;
  本身是個虛方法,具體實現是在子類。它僅僅是發送了一個 EM_SETSEL 消息給編輯控件(當前獲得焦點的對象), 把光標移到了需要編輯的地方(開始選擇之處),對任何文本都不例外,如把上面的移動‘追加一空字符或空行,然后刪除’換成這種方法。學會了移動,還得控制選擇的范圍為0,這樣才能插入。接下來就是:
   procedure SetSelLength(Value: Integer); virtual;
  這也是個虛方法。不過顧名思義,應該知道它是控制選擇長度的函數。這下大家明白該怎么做了吧。最后應該注重的是在各個TCustomEdit子類中,針對不同的構件函數的實現,操作方法應有所不同,如 TEdit、TMemo(無 SetSelStart)、 TRichEdit...。最后是一簡單的例子。
...

type TForm1 = class(TForm)
...
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
... private { Private declarations } public { Public declarations } end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
//清空 Memo1
Memo1.Clear;
//在未載入任何內容時,禁止使用 Append、Insert
Button2.Enabled := False;
Button3.Enabled := False;
...
end;

//裝載任意文本文件
procedure TForm1.Button1Click(Sender: TObject);
begin
...
Memo1.Lines.LoadFromFile( OpenDialog1.FileName );
Caption := Hint + 調入: + OpenDialog1.FileName;
Button2.Enabled := True;
Button3.Enabled := True;
...
end;

//在文件頭插入
procedure TForm1.Button2Click(Sender: TObject);
Var
SWA : TMemoryStream; //建立臨時交換內存鏡象
CNULL : char; //空字符
begin
SWA := NIL;
CNULL := #0;
...
//初始化內存流
SWA := TMemoryStream.Create;
//加載要插入的文件
SWA.LoadFromFile( OpenDialog1.FileName );
//把指針移到流尾,以 #0 結尾,
SWA.Seek(0, soFromEnd);
SWA.Write( CNULL, 1);
//再移到頭
SWA.Seek( 0, soFromBeginning );
//插入偏移量為 0
Memo1.SelStart := 0;
Memo1.SetSelTextBuf(SWA.Memory);
....

end;

procedure TForm1.Button3Click(Sender: TObject);
Var
SWA : TMemoryStream;
CNULL : char; //空字符
begin
SWA := NIL;
CNULL := #0;
...
//初始化內存流
SWA := TMemoryStream.Create;
//加載要追加的文件
SWA.LoadFromFile( OpenDialog1.FileName );
//把指針移到流尾,以 #0 結尾,
SWA.Seek(0, soFromEnd);
SWA.Write( CNULL, 1);
//再移到頭
SWA.Seek( 0, soFromBeginning );
//把 Memo1 的指針移到 Memo1 尾部
Memo1.Lines.Add();
Memo1.Lines.Delete( Memo1.Lines.Count -1 );
//追加
Memo1.SetSelTextBuf(SWA.Memory);
...
end;
....


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南涧| 思茅市| 伊春市| 扎兰屯市| 深泽县| 星子县| 新干县| 邵阳市| 河西区| 田林县| 沙河市| 嘉兴市| 濉溪县| 宜昌市| 浦北县| 桑植县| 扶沟县| 连云港市| 浙江省| 富川| 铜梁县| 泗洪县| 志丹县| 盱眙县| 墨竹工卡县| 济宁市| 米脂县| 海城市| 青冈县| 新乡县| 富蕴县| 屯留县| 武功县| 会宁县| 乾安县| 敦煌市| 和平县| 阿勒泰市| 苍山县| 神木县| 泸定县|