|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"TMemoのキャレット位置を表示"
◆解説
TMemoのキャレット位置をステータスバーに表示する例です。
同様の処理としては、EM_LINEFROMCHAR, EM_LINEINDEXメッセージを
使う方法が一般的ですが、以下の例は、Delphiのコードエディタと同
様に範囲指定中でもキャレット位置を表示し続けます。
◆動作確認
Delphi3.1 + Win95a
◆例
Form1に Memo1と StatusBar1を置いて下さい。
#StatusBar1の右クリック「パネルの設定」で、TStatusPanelを 1個
#追加して、StatusBar1.Panels[0]が使えるようにしておきます。
----- ここから -----
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
...省略
private
{ Private 宣言 }
procedure MyIdle(Sender: TObject; var Done: Boolean);
...省略
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle := MyIdle;
end;
procedure TForm1.MyIdle(Sender: TObject; var Done: Boolean);
var
saveFont: TFont;
pt: TPoint;
rt: TRect;
sz: TSize;
lno, cno: Integer;
begin
if Memo1.Focused then begin
saveFont := TFont.Create;
saveFont.Assign(Font); //Form1.Fontを待避
try
Font := Memo1.Font;
GetCaretPos(pt);
Memo1.Perform(EM_GETRECT, 0, Longint(@rt));
lno := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0)
+ ((pt.y - rt.Top) div Canvas.TextHeight('W'));
cno := GetScrollPos(Memo1.Handle, SB_HORZ);
GetTextExtentExPoint(Canvas.Handle,
PChar(Memo1.Lines[lno]),
Length(Memo1.Lines[lno]),
pt.x - rt.Left + cno,
cno,
PInteger(nil)^,
sz);
StatusBar1.Panels[0].Text := Format('%4d:%4d', [lno+1, cno+1]);
finally
Font := saveFont; //Form1.Fontをもとに戻す
saveFont.Free;
end;
end;
end;
----- ここまで -----
GetTextExtentExPointの使い方はこれでいいのかなぁ...(^-^;
怪しい点がありましたら、nifty:FDELPHI/MES/11 あたりで突っ込み
入れて下さい。m(_`_)m
98/04/03(金) 22:33 Satobe(JCG00336)
Original document by Satobe 氏 ID:(JCG00336)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|