Delphi Tips
>> Index
● 10/02 DataSet を指定していないときに QuickReport の進捗状況を表示する
● 06/25 RichEdit を印刷したい
● 09/09 デフォルトプリンタの設定
● 02/11 プログラムからプリンタのスプーラ表示を開く
● 02/11 プリンタのスプールファイルを TMetafile に読みこむ
● 02/08 TBitmap をきれいに印刷する
● 02/08 クイックレポート関連記事
● 02/08 最新版クイックレポート(英語)の日本語化
● 02/08 QuickReport で Canvas プロパティを使う
● 02/08 用紙の印刷可能範囲を求める
● 02/08 フォームの印刷時にComboBoxの内容が印刷されない
最終更新: 6625 日前
0150 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/02/11 osamu rev 1.2 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 2006/10/02 223 編集
DataSet を指定していないときに QuickReport の進捗状況を表示する
> 今回作ったレポートだと TQuickRep.DataSet:=nil で、 OnNeedDataイベ
> ントですべてのデータを供給しているので、プログレスフォームに進捗
> を表示してくれません。
> 実行時には出力すべきレコード数と現在出力中のレコード番号は分かっ
> ています。こういうときに、うまくプログレスフォームで進捗を表示し
> てあげる方法は用意されていないのでしょうか?
QuickRep.QRPrinter.Progress プロパティに 0..100 の範囲の値を指定すると良さそうです。
procedure QuickRep1.DetailBand1AfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
begin
QrPrinter.Progress:=Trunc((100/MaxBandCount)*BandCount);
end;
MaxBandCount: 最大レコード数
BandCount: 現在のレコード
参照: [Delphi-ML:25304]
0336 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 2003/06/25 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 2003/06/25 osamu 編集
RichEdit を印刷したい
Delphi の Demo にサンプルコードが含まれています。Delphi5 であれば、
Program Files\Borland\Delphi5\Demos\Richedit\richedit.dpr
に RichEdit の印刷ルーチンがあります。
参照: [Delphi-ML:54315] <Win95> <コンポーネント >
0242 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/09/09 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 1999/09/09 osamu 編集
デフォルトプリンタの設定
>「通常使うプリンタ」を変更したいのですが、よい方法が見つかりません。
最近 SetPrinter API の使い方を覚えました。これで出来ます(^^
procedure SetDefaultPrinter(Index: Integer);
begin
var Device, Driver, Port: array[0..511] of Char;
hDevMode: THandle;
hPrinter: THandle;
pInfo2: ^TPrinterInfo2;
Size: DWORD;
begin
Printer.PrinterIndex := Index;
// デバイス名を得る
Printer.GetPrinter(Device, Driver, Port, hDevMode);
// プリンタハンドルを作る。
Win32Check(OpenPrinter(Device, hPrinter, Nil));
try
// Printer_Info_2 に必要なバッファサイズを取得
WinSpool.GetPrinter(hPrinter, 2, pInfo2, 0, @size);
// バッファ確保
GetMem(pInfo2, size);
try
// プリンタ情報を取得
Win32Check(WinSpool.GetPrinter(hPrinter, 2, pInfo2, Size, @size));
// デフォルトプリンタにする
pInfo2.Attributes := pInfo2.Attributes or
PRINTER_ATTRIBUTE_DEFAULT;
// プリンタ情報をプリンタへセットする
Win32Check(WinSpool.SetPrinter(hPrinter, 2, pInfo2,
PRINTER_CONTROL_SET_STATUS));
finally
FreeMem(pInfo2);
end;
finally
ClosePrinter(hPrinter);
end;
end;
Win98 でしか確認していません。あしからず。
参照: [Delphi-ML:33386]
0164 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/02/11 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 1999/02/11 osamu 編集
プログラムからプリンタのスプーラ表示を開く
Delphiで『スタート』→『設定』→『プリンタ』にある複数のプリンタの中から,指定された特定の名前のプリンタ(たとえばEPSON LP-8000S)などを開いてスプーラの表示にしたいのですがどうすればいいでしょうか。
参照: [Delphi-ML:31750]
0144 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/02/11 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 1999/02/11 osamu 編集
プリンタのスプールファイルを TMetafile に読みこむ
プリンタを一時停止にしておいて印刷すると、windows\temp の下にファイルができますが、それをコピーして拡張子を emf に変えて TImage で覗いたらちゃんと表示されました。
これなら、どんなソフトを使っても印刷さえできれば簡単に emf が作れますね。
参照: [Delphi-ML:14852]
0092 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/02/08 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 1999/02/08 osamu 編集
TBitmap をきれいに印刷する
TBitmap 印刷用手続きの中村@NECさんバージョンです。
StretchDIBits を使うところがミソだそうです。
procedure StretchDrawBitmap(Canvas: TCanvas; // 描画先キャンバス
r: TRect; // 描画先の範囲
Bitmap: TBitmap // ビットマップ
);
var OldMode: Integer; // StretchMode のセーブ
Info: PBitmapInfo; // DIB ヘッダ + カラーテーブル
InfoSize: Integer; // DIB ヘッダ + カラーテーブル
Image: Pointer; // DIB のピクセルデータ
ImageSize: Integer; // DIB のピクセルデータのサイズ。
begin
// DIB の「ヘッダ+カラーテーブル」の大きさと ピクセル
// データの大きさを求める
GetDIBSizes(Bitmap.Handle, InfoSize, ImageSize);
Info := Nil;
Image := Nil;
try
// DIB 用のメモリーを確保
Info := AllocMem(InfoSize);
Image := Allocmem(ImageSize);
// DIB を取り出す
GetDIB(Bitmap.Handle, Bitmap.Palette, Info^, Image^);
// 描画!!
OldMode := SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
StretchDIBits(Canvas.Handle,
r.Left, r.Top,
r.Right - r.Left, r.Bottom - r.Top,
0, 0, Info^.bmiHeader.biWidth,
Info^.bmiHeader.biHeight,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
SetStretchBltMode(Canvas.Handle, OldMode);
finally
if Info <> Nil then FreeMem(Info);
if Image <> Nil then FreeMem(Image);
end;
end;
参照: [Delphi-ML:20572] <画像>
0100 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/02/08 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 1999/02/08 osamu 編集
最新版クイックレポート(英語)の日本語化
クイックレポートの最新版を、
http://www.qusoft.com/scripts/download.dll
から落としてきて、Delphiにインストールすることができます。
但し、プレビューのボタンなどが英語になります。
以前のバージョン(2.0g)のdfmファイルをlibディレクトリにコピーするだけで、実行時パッケージを使用しない場合に限り、実行時に日本語で表示できます。
これを、設計時や実行時パッケージを使ったときにも日本語で表示させる方法が、[Delphi-ML:20984]に紹介されています。
参照: [Delphi-ML:20984] <データベース>
0104 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/02/08 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 1999/02/08 osamu 編集
QuickReport で Canvas プロパティを使う
QRPrinter.NewPage は、Windows API とか Printer の NewPage とは若干意味合いが異なって、「新しいページの前に」指定する必要があるようです。座標指定は、0.1mm 単位の座標指定を QRPrinter.XPos()、QRPrinter.YPos()でプリンタの物理座標に変換して指定すれば印刷できると思います。
procedure TForm1.Button1Click(Sender: TObject);
begin
with QuickRep1.QRPrinter do begin
BeginDoc;
NewPage;
Canvas.TextOut(XPos(300), YPos(300), 'test');
EndDoc;
end;
end;
参照: [Delphi-ML:21024]
0110 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/02/08 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 1999/02/08 osamu 編集
用紙の印刷可能範囲を求める
Windows API の GetDeviceCaps 関数を使います。
A--I----------------B
| |
J E-------------F |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| G-------------H |
| |
C-------------------D
用紙サイズ ABCD ・印刷可能範囲 EFGH とした場合GetDeviceCaps関数の引数は
A-B が PHYSICALWIDTH
A-C が PHYSICALHEIGHT
E-F が HORZRES
E-G が VERTRES
A-I が PHYSICALOFFSETX
A-J が PHYSICALOFFSETY
となります。
ピクセル単位で値が返されます。
参照: [builder:6063] [builder:6064]
0040 D1 D2 D3 D4 D5 D6 D7 3.1 95 98 作成: 1999/02/08 osamu rev 1.1 B1 B3 B4 B5 B6 B7 NT3 NT4 2K XP 更新: 1999/02/08 osamu 編集
フォームの印刷時にComboBoxの内容が印刷されない
Delphi3 になって、フォームの印刷時に TComboBox の内容(テキスト)が印刷表示されなくなりました。
Delphi2 ではちゃんと印刷されます。
kohiroさんが[Delphi-ML:19070]で解法を示してくださっています。
参照: [Delphi-ML:19070] <バグ> <フォーム> <Standard> <コンポーネント >
[新規作成] [最新の情報に更新]
How To
Lounge
KeyWords
Osamu Takeuchi osamu@big.or.jp
Tips
Delphi
Home