TRichEditの文字情報をFirebirdのBlob保存しています。
これを読み出して、ビューワ専用にTImageのキャンバスにそのまま、描画したいのですが、よさげなメソッドが見あたりません。
http://mrxray.on.coocan.jp/Delphi/plSamples/T160_RichEdit1.htm
も見たのですが、Delphi7ではTFormatRangeという型がなさそうなので、
どうしたものかと悩んでおります。
ご助言宜しくお願いします。
>Delphi7ではTFormatRangeという型がなさそうなので、
uses に RichEdit を追加すれば、使えませんか?
WindowsのAPIから移植してるだけのはずなので
この辺りを参考に定義したらそのまま使えるんじゃないでしょうか
ttp://msdn.microsoft.com/ja-jp/library/windows/desktop/bb787911(v=vs.85).aspx
> Delphi7ではTFormatRangeという型がなさそうなので
ありますよ。uses に RichEdit を追加してみてください。
> ビューワ専用にTImageのキャンバスにそのまま、描画したい
TRichEdit.ReadOnly := True; ではダメなのでしょうか?
こちらの方が表示内容をコピペできるので使い勝手はいいような気がするのですが…?
[余談]
コピペできないとイラッとする事もあるので、
作るアプリケーションによっては TLabel ではなく
TEdit の枠を消したもので置換する事があります。
みなさんありがとうございます。
USES にRICHEDIT追加しました。
なんとか動きました。
Mr.XRAY氏のソースをお借りして、自分なりに使えるようにしました。
TImageと書いていましたが、実はフェイクで、TStringGridのOnDrawCellに記入していたのです。
以下の手続きにStringGridのセルのキャンバスとRect情報を入れたら望み通りになりました。
一部理解しきれてない部分もありますが、これでいけそうです。
//=============================================================================
// RichEditの内容を描画
// X1 : 描画領域の左端X座標値
// X2 : 描画領域の右端X座標値
// Y1 : 描画領域の上端Y座標値
// Y2 : 描画領域の下端Y座標値
// RichEdit : TRichEdit
//=============================================================================
procedure Tfrm.RichEditDraw(Canvas:TCanvas;X1,X2,Y1,Y2: Integer; Rich: TRichEdit);
var
Range : TFormatRange;
SaveMap : Integer;
begin
//Rangeを0(null)で埋める
FillChar(Range, SizeOf(TFormatRange), #0);
//出力先デバイスのハンドル
Range.hdc := Canvas.Handle;
//書式設定するデバイスのハンドル
Range.hdcTarget := Range.hdc;
//描画領域の指定
Range.rc.Left := MiliToPixcel(X1);
Range.rc.Right := MiliToPixcel(X2);
Range.rc.Top := MiliToPixcel(Y1);
Range.rc.Bottom := MiliToPixcel(Y2);
Range.rcPage := Range.rc;
//テキストの最初から
Range.chrg.cpMin := 0;
//最後まで(-1で自動計算)/
Range.chrg.cpMax := -1;
//マップモードMM_TEXTにして前のマップモードをSaveMapに保存
SaveMap := SetMapMode(Range.hdc, MM_TEXT);
//バッファのフラッシュ}
SendMessage(Rich.Handle, EM_FORMATRANGE, 0, 0);
try
//実際の印刷
SendMessage(Rich.Handle, EM_FORMATRANGE, 1, Longint(Addr(Range)));
finally
//バッファのフラッシュ
SendMessage(Rich.Handle, EM_FORMATRANGE, 0, 0);
//マップモードを元に戻す
SetMapMode(Range.hdc, SaveMap);
//TPrev(plPrev1).ScaleInitialize(Canvas, False);
end;
end;
function TfrmMessage.MiliToPixel(V: Integer): Integer;
var
DC: HDC;
dpi:Integer;
begin
DC := GetDC(0);
dpi := GetDeviceCaps(DC,LOGPIXELSX);//96
ReleaseDC(0, DC);
Result := Trunc(V * 1440 / dpi);//15で丁度いい
end;
解決しました。
ツイート | ![]() |