よくあるご質問

ホーム What's New アフターケア ダウンロード よくあるご質問 More Secrets

更新日 : 2009/3/30

このページは Delphi Graphic Secrets 及び DHGL のよくあるご質問とその回答を集めたものです。

目次

  1. DHGLとはなんですか?
  2. DHGL にはどんなものが含まれていますか?
  3. DHGLの使用に制限はありますか?
  4. DHGLが対応している Delphi の版は?
  5. インストールはどうするの?
  6. ヘルプはどうやって使うの?
  7. DHGLの使い方を学ぶには?
  8. TBigBitmap の大きさの限界は?
  9. DHGLをインストールし、イメージコントロールにメタファイルを読み込むと、メタファイルがイメージコントロールからはみ出して表示される。
  10. PrinterUtils.pas と NkPrinter 
  11. TBigBitmapでビットマップをクリップボードに送るとOSがハングアップします。

1. DHGL とはなんですか?

DHGL は Delphi High-Level Graphic Library の略です。Delphi のグラフィック機能を補う目的で作成しました。書籍Delphi Graphic SecretsはDHGLの解説書という性格も持っています。

先頭に戻る

2. DHGL にはどんなものが含まれていますか?

DHGLには以下のユニットが含まれています(DHGL 1.2)。

ユニット名 クラス、ルーチン名 説明
BitBitmap.pas TBigBitmap 巨大なビットマップを保持でき、安定な印刷を提供するグラフィッククラスです。
CopyRectBigBitmap
(DHGL 1.2 以降)
TBigBitmapの任意の領域を任意のCanvas の任意の領域へコピーします。
BitmapEx.pas TBitmapEx TBitmapの改良版です。
BitmapUtils.pas AffineTransformBitmap ビットマップをアフィン変換するルーチンです。
BitmapFilter ビットマップをフィルタ処理するルーチンです。
Enlarge ビットマップを Bi-Linear 法で拡大するルーチンです。。
HorzMirrorBitmap ビットマップを水平方向に反転させるルーチンです。
RotateBitmap ビットマップを回転させるルーチンです。 90度毎に角度が指定できるものと任意角度で回転中心が指定できるものの2種類が有ります。
Shrink ビットマップを積分法で縮小するルーチンです。
Stretch ビットマップを Bi-Linear and 積分法で拡大/縮小するルーチンです。
StretchBitmap ビットマップを TransformBitmap で拡大縮小するルーチンです。
TransformBitmap ビットマップを変形するルーチンです。
VertMirrorBitmap ビットマップを垂直方向に反転させるルーチンです。
DIBUtils.pas CreatePaletteFromDIB DIB からパレットを作成するルーチンです。
LoadDIBFromStream ストリームからビットマップファイルイメージを読み、メモリ上に DIB として展開するルーチンです。
SaveDIBToStream DIB をストリームに書き込むルーチンです。
DIB32_16ToDIB24 16/32bppのDIB を 24bpp に変換するルーチンです。
Convert8BitRLETo8BitRGB 8bpp の RLE圧縮DIBをデコードするルーチンです。
Convert4BitRLETo4BitRGB 4bpp の RLE圧縮DIBをデコードするルーチンです
ErrDef.pas ErrorDefusion ビットマップに Floyd-Steinberrgフィルタ処理を行うルーチンです。TBitmap、TBigBitmapの両方をサポートしています。
Gradation.pas TGradation グラデーションを保持/表示するグラフィッククラスです。
GradationControl.pas TGradationControl グラデーションを表示するコンポーネントです。
IconEx.pas TIconEx 改良版のTIconです。
MedianCut.pas

このユニットに含まれる減色ルーチンは TBitmapとTBigBitmapの両方をサポートしています。

TMedianCut Median Cut 減色アルゴリズムを提供するクラスです。
ReduceColorsByMedianCut Median Cut でビットマップを減色するルーチンです。
ReduceColorsByMedianCutV 分散で分割を行う Median Cut でビットマップを減色するルーチンです。
ReduceColorsByMedianCutED Median Cut と誤差拡散でビットマップを減色するルーチンです。
ReduceColorsByMedianCutVED 分散で分割を行う Median Cut と誤差拡散でビットマップを減色するルーチンです。
MetafileEx.pas TMetafileEx 改良版のTMetafileです。
MetafileUtils.pas AdjustFont CanvasのFontの横幅を適切な値に設定するルーチンです。
AdjustPhysicalInch メタファイルの物理インチを変更するルーチンです。
FixMetafileFor9X
(DHGL 1.1 以降)
Windows 9X/ME でも文字列を含むメタファイルを他のメタファイルに描画できるように、メタファイルを変換します。
DHGLExtTextOut
(DHGL 1.1 以降)
Windows 9X/ME でもメタファイルに対して使える、ExtTextOut API 互換ルーチンです。
DHGLExtTextOutW
(DHGL 1.1 以降)
Windows 9X/ME でもメタファイルに対して使える、ExtTextOutW API 互換ルーチンです。
NkMemMgr.dll 共有メモリマネージャ
NkMemMgr.dpr 共有メモリマネージャのプロジェクト
NkMM,pas メモリマネージャ
NkShareMem.pas 共有メモリマネージャ、インポートライブラリ

 

ユニット名 クラス、ルーチン名 説明
Octree.pas TOctree Octree 減色アルゴリズムを提供するクラスです。
ReduceColorsByOctree Octreeでビットマップを減色するルーチンです。TBitmapとTBigBitmapの両方をサポートしています。
PathUtils.pas TPath パス情報を保持しパスの取り扱いを簡単にするクラスです。
DrawArc 弧をBezier曲線で描くルーチンです。<
DrawAngleArc 弧をBezier曲線で描くルーチンです。
DrawChord 弦をBezier曲線と直線で描くルーチンです。
DrawAngleChord 弦をBezier曲線と直線で描くルーチンです
DrawPie 扇形をBezier曲線と直線で描くルーチンです。
DrawAnglePie 扇形をBezier曲線と直線で描くルーチンです。
DrawRectangle 矩形を直線で描くルーチンです。
DrawRoundRect 角マル矩形をBezier曲線と直線で描くルーチンです。
DrawEllipse 楕円をBezier曲線で描くルーチンです。
DrawFigure 多角形に沿って太い破線を描くルーチンです
DrawPath パス情報に沿って太い破線を描くルーチンです。
PrinterUtils.pas GetPaperInfo プリンタの紙に関する情報を収集するルーチンです。
GetPaperNumbers プリンタがサポートする全ての紙サイズの紙サイズ番号の一覧を取得するルーチンです。
GetPaperNames プリンタがサポートする全ての紙サイズの紙サイズ名の一覧を取得するルーチンです。
GetPaperSizes プリンタがサポートする全ての紙サイズの紙の大きさの一覧を取得するルーチンです。
GetPrinterSettings 現在のプリンタの設定を取得するルーチンです。
SetPrinterSettings プリンタの設定を更新するルーチンです。
PrintPreview.pas TPrintPreview 印刷プレビュー用コンポーネントです。プレビューのためのページ情報(メタファイル)を蓄えます。
RegionUtils.pas TRegion リージョンを保持し、リージョンを簡単に扱えるようにするクラスです。
ROPUtils.pas ModifyDIBForROP DIBでROP3が可能になるようにカラーテーブルとビットマップの内容を整えるルーチンです。
StatErrDef.pas StaticErrorDefusion ビットマップを固定パレット誤差拡散法により減色します。TBitmap, TBigBitmap の両方をサポートしています。
TextUtils.pas GetTextAAdjust 文字列の最初の文字が文字セルの前にはみ出す長さを算出するルーチンです。
GetTextCAdjust 文字列の最後の文字が文字セルの後ろにはみ出す長さを算出するルーチンです。
GetTExtPosition テキストの段落を行に分解するルーチンです。
 

先頭に戻る

3. DHGLの使用に制限はありますか?

DHGLは完全にフリーです。フリーソフトへの利用はもちろん商用利用も出来ますし、利用に際して著作権表示も不要です。ご自由にお使いください。

先頭に戻る

4. DHGLが対応している Delphi の版は?

DHGLは Delphi 5, 6、7, 2009 で試験しています。

C++Builder 5 でも動作確認を行っています。

Delphi 4, 2005, 2006, 2007 でもおそらく動くと思いますが、動作試験の予定はございません。

先頭に戻る

5. インストールはどうするの?

DHGL のインストールは簡単です。Delphi Graphic Secretsの付属CD-ROM  のCommon フォルダをHDDにコピーしたら(DHGLをダウンロードした場合はアーカイブを解凍したら) Common フォルダを Delphiのライブラリパスに加えてください。CD-ROMからHDDにコピーした場合は各ファイル/フォルダの読み取り専用属性を解除したほうがよいでしょう。

ライブラリパスは Delphi のIDE のメニューから [ツール(T)]-[環境オプション(O)] 
を選んで[環境オプション]のダイアログを開き、[ライブラリ]タブの中にある[ライブラリパス(B)]で変更できます。



詳細は Delphi のマニュアルを参照してください。また上図のタブの「ライブラリパス」の横にあるボタンを押せば、使い方はすぐに判るでしょう。


DHGL に含まれる GradationControlコントロール(GradationControl.pas) と PrintPreviewコンポーネント(PrintPreview.pas)コンポーネントを使うには、コンポーネントをインストールしておく必要が有ります。

IDE のメニューから[コンポーネント(C)]-[コンポーネントのインストール(I)]

を選んでコンポーネントのインストール用のダイアログを開き、上記のファイルを選んでインストールを行ってください。

先頭に戻る

6. ヘルプはどうやって使うの?

DHGL のヘルプDHGL.CNT DHGL.HLP の2つのファイルからなり  Document フォルダに収録されています。

Delphi 7 以前のDelphiでは、DHGL のヘルプを Delphi IDE のヘルプに組み込むと、Delphi IDE の中からヘルプが引けるようになります。例えばフォーム上のコンポーネントを選択して F1 キーを押すだけで DHGL のヘルプが引けるようになります。

IDE DHGL のヘルプを組み込むには Open Help ユーティリティを使います。

Delphi をインストールしたフォルダの直下の bin フォルダに oh.exe という実行ファイルが有ります。これが Open Help です。 Delphi のヘルプの、目次、キーワードの検索範囲、状況感知型ヘルプの検索範囲に新たなヘルプの加えることができます。以下の手順で DHGL のヘルプを IDE に組みこんでください。

OH.EXE を起動します。Windows NT/2000/XP をお使いの場合は administrator でログオンしてから OH.EXE を起動します。runas や「別ユーザで起動」を使っても構いません。とにかく administrator として起動してください。Open Help はレジストリを書き換えるので NT系列の Windows では一般ユーザで Open Help を使うことはできません。
[ファイル]-[プロジェクトを開く]で Delphi5.ohp(Delphi 6 の場合は Delphi6.ohp) を開いてください。Delphi5.ohp(Delphi6ohp) Delphi をインストールしたフォルダの直下の Help フォルダの中に有ります。
[目次]タブを選び、[ファイルを追加]ボタンを押し、DHGL.cnt を追加します。
[キーワード]タブを選び、[ファイルを追加]ボタンを押し、DHGL.hlp を追加します。
[リンク]タブを選び、[ファイルを追加]ボタンを押し、DHGL.hlp を追加します。
[プロジェクトを上書き保存]ボタンを押します。
Open Help を終了します。

注意

Open Help DHGL のヘルプを組み込んでもキーワードに DHGL のヘルプのキーワードが現れないことが有ります。これは Windows 95/98/ME のヘルプシステムの制限です。この場合、IDE に組み込まれているヘルプの数を減らしてください。

Windows NT, 2000, XP ではこの問題は起きません。

先頭に戻る

7. DHGLの使い方を学ぶには?

まず、サンプルプログラムを動かして見るのが早道でしょう。Document フォルダにあるSamples.hlp にはコンパイルの仕方と各サンプルの説明が写真入りで入っています。また多くののサンプルは、書籍Delphi Graphic Secrets内で解説されています。

DHGL は付属のヘルプとソースコードをご覧になればある程度使えるとは思いますが、書籍Delphi Graphic Secretsに詳細な解説があります。もしお金があれば買って読んでみてください(^^;

Delphi Graphic Secrets をご購入で無い方へ:

Samples.hlpDelphi Graphic Secrets のサンプルプログラムの説明で、DHGL専用の物では有りません。Chapter1, Chapter2 フォルダの中の多くのサンプルはDHGLとは直接関係のないものです。また説明は Delphi Graphic Secrets の説明を数多く参照していますので、予めご了承ください。

DHGLに含まれるサンプルプログラムの一覧です。

フォルダ名

内容
Chapter1\1-1

このフォルダには1-1節の List 1-1-1 で紹介したフォームにマーカを打つサンプルプログラム Marker.dprが含まれています。

Chapter1\1-4 このフォルダには 1-2節の List 1-4-1 と List 1-4-2 で紹介した ブラシとペンが図形の描画に与える影響を見るためのプログラム Pen.dpr と Brush.dpr とが含まれています。
Chapter1\1-5 このフォルダには1-5節で紹介したCanvasの様々な描画用メソッドの動作を確認するためのプログラム Figures.dprが含まれています。 このプログラムは図形を描画するだけではなく描画結果を目盛り付きで拡大表示し、いろいろな描画用メソッドの描画をピクセルレベルで確認できるようにになっています。
Chapter1\1-6 このフォルダには1-6節の List 1-6-1 と List 1-6-2 で紹介した、 フォントが文字列の描画にどのような影響を与えるか確認するためのプログラムが含まれています。
Chapter1\1-7 このフォルダには 1-7節の List 1-7-1 で紹介した、 スクリーンの論理インチと物理インチを計算して表示するプログラム PixelSize.dpr が含まれています。
Chapter1\1-9 このフォルダには1-9節の List 1-9-1 で紹介した ROP2 の効果を確認するためのサンプルプログラム Penmode.dpr が含まれています。
Chapter1\1-10 このフォルダには1-10節の List1-10-1 〜 List 1-10-5 で紹介したコードを全て含む、 ブラシと背景モードと背景色の関係を確認するためのプログラム background.dpr が含まれています。 このプログラムではブラシのスタイルと背景モードの関係を確認するコードに加えて、 Canvas の背景モードの問題に対処するためのコード例も含んでいます。
Chapter1\1-12 このフォルダには 1-12 節の List 1-12-1 で紹介した、 回転した文字列を表示するサンプルプログラム FontRotation.dpr が含まれています。
Chapter1\1-13 このフォルダには1-13節の List 1-13-1 で紹介した、Canvas の無効領域を正しく扱うように改良した、 改良版 Markerプログラム Marker2.dpr が含まれています。
Chapter2\2-4 このフォルダには 2-4節で解説したパレットを使ってグラデーションを表示するプログラム Palette.dpr が含まれています。
Chapter2\2-7 このフォルダには 2-7 節で紹介したしたパレットを使ったプログラム例が 3種入っています。 

Gradation.dpr はパレットを使ってグラデーションを表示する単純なアプリケーションです。 

BitmapView.dpr はビットマップのビュワーです。 Image コントロールを使わずに TBitmap を使ってビットマップを表示する時のパレットの取り扱い方法を含んでいます。

 GradationControlDemo.dpr はパレットを使ってグラデーションを表示するコントロールのデモプログラムです。

Chapter3\3-1 このフォルダには 3-1節の List 3-1-4 で紹介したメタファイルをリソースからロードして表示する LoadFromStreamDemo.dpr が含まれています。 このデモは実行ファイルにリンクされたリソースからメタファイルをストリームとして取りだし、 TMetafile の LoadFromStream メソッドを使って読み出して表示します。
Chapter3\3-2 このフォルダには 3-2 節で紹介した TBitmap に関するいくつかのサンプルプログラムが含まれています。 

DrawToBitmap.dpr は List 3-2-1 で紹介したTBitmap のCanvas を使ってビットマップに文字列と図形を描くサンプルプログラムです。 

GradationByBitmap.dpr は List 3-2-2 で紹介したビットマップ(DDB)を使ってグラデーションを表示するサンプルプログラムです。 

GradationByDIBSection.dpr は List 3-2-4 で紹介したビットマップ(DIB Section)を使ってグラデーションを表示するサンプルプログラムです。 このサンプルには、DIB Section のピクセルデータへのアクセスの仕方や DIB Section のカラーテーブルの差し替え方などが含まれています。

 CreateMonochromeBitmap.dpr は List 3-2-7 で紹介した、モノクロビットマップを作成するサンプルプログラムです。 

DrawToMonochromeBitmap.dpr は List 3-2-9 で紹介したモノクロビットマップに図形やカラービットマップを描くサンプルプログラムです。 

DrawMonochromeBitmap.dprは List 3-2-10 で紹介したモノクロビットマップをスクリーン(フォーム)に描画するサンプルアプリケーションです。

Chapter3\3-3 このフォルダには 3-3 節で説明した TMetafile に関するいくつかのサンプルプログラムが含まれています。 

UseMetafile.dpr は List 3-3-1 のコードを含むメタファイルの使用例です。メタファイルがスケーラブルで図形を自由に変形できることを確認できます。 

MetafileTrouble.dpr は List 3-3-5 と List 3-3-6 で紹介した AdjustFont ルーチンと AdjustPhysicalInchi ルーチンの効果を確認するデモプログラムで, Fig. 3-3-5 〜Fig.3-3-8 を表示できます。

Chapter3\3-4 このフォルダには 3-4 節で説明した TIcon に関するいくつかのサンプルプログラムが含まれています。 

ListIcon.dpr は本文の Fig. 3-4-1 を表示するプログラムです。 本文では触れていませんが、このプログラムはアイコンファイルに含まれるアイコンイメージを全て表示するサンプルプログラムです。 アイコンディレクトリの取り扱い方の例になっています。 

IconSize.dpr は System Large Icon, System Small Icon, Shell Large Icon, Shell Small Icon の大きさを表示するサンプルプログラムです。

Chapter3\3-5 このフォルダには 3-5 節で説明した TPicture のサンプルプログラムが含まれています。 AddDIBExt.pas は List 3-5-1 のコードが入ったユニットです。本文で述べられていますように、このユニットを設計時パッケージに加えると、 拡張子が .dib のビットマップファイルを設計時にImageコントロールに読み込むことができるようになります。
Chapter3\3-6 このフォルダには 3-6 節で紹介した新しいグラフィッククラス TGradation と TIconEx のデモプログラムが含まれています。 

GradationDemo.dpr は TGradation クラスのデモプログラムです。グラデーションデータをファイルから読んで表示したり、グラデーションデータをファイルにセーブできます。 

IconExDemo.dpr は TIconEx クラスのでもプログラムです。アイコンを任意の大きさで表示できます。またアイコンをクリップボードにコピーしたり、 アイコンをクリップボードからぺーストしたりできます。

Chapter4\4-1 このフォルダには 4-1 節で紹介したラスターオペレーションに関するサンプルプログラムがいくつか含まれています。 

RO3.dpr は List 4-1-1 と List 4-1-2 のコードを含む、 ROP3 の効果を確認するためのサンプルプログラムです。 イメージの反転と網掛けを行うことができます。 

TransparentDraw.dpr は List 4-1-3 、List 4-1-4 による透明描画のサンプルプログラムです。List 4-1-5 の ModifyDIBForROP ルーチンを使用した DIB Sectionによる透明描画もテストできるようになっています。

尚、ModifyDIBForROP ルーチンを含む ROPUtilsユニットは Commonフォルダに収録されています。

Chapter4\4-2 このフォルダには 4-2節で紹介した TBitmapEx のサンプルプログラム TBitmapExDemo.dpr が含まれています。 このサンプルは TBitmapEx でビットマップファイルを読み表示するだけの単純なプログラムです。 

尚、TBitmapEx グラフィッククラスを含む BitmapEx.pas ユニット、及び、TBitmapEx で使われている各種汎用ルーチンを含む BitmapUtils.pas ユニットは Common フォルダの中にあります。

Chapter4\4-3 このフォルダには 4-3節で紹介した TBigBitmap のサンプルプログラム TBigBitmapDemo.dpr が含まれています。 このデモプログラムでは、TBigBitmapが大きなビットマップを読み込み可能なこと、ビットマップを大きな拡大縮小率で描画可能なことを TBitmapの場合と対比しながら確認できます。

尚、TBigBitmapグラフィッククラスを含む BigBitmap.pas ユニット、 及び、TBigBitmapで使われている各種汎用ルーチンを含む BitmapUtils.pasユニットは Common フォルダの中にあります。

Chapter4\4-4 このフォルダには 4-4節で紹介したピクセル単位の高速処理に関するサンプルプログラムがいくつか含まれています。 

Rotation90.dpr は List 4-4-1 のコードを含む、TBitmap を使ってビットマップを90度回転させるサンプルプログラムです。 Pixels と Scanlineプロパティの速度差を確認することが出来ます。 

Rotation90ForBigBitmapは Rotation90.dpr の TBigBitmap版です。 TransformBitmapDemo.dpr は Fig. 4-4-2 で紹介した関数のデモプログラムです。 TransformBitmap を使ってビットマップの拡大縮小、30度回転、90度回転、ミラー、渦巻き変換の動作が確認できます。 デモでは TBitmapと TBigBitmapの両方が使えるようになっていますので、巨大なビットマップを使った実験も出来ます。 

尚、TransFormBitmap関数は TBitmap用とTBigBitmap用の2種類が有り、両方ともBitmapUtils.pas ユニットに含まれています。 BitmapUtils.pas は Commonフォルダの中にあります。

Chapter4\4-5 このフォルダには 4-5節で紹介したビットマップの美しい拡大縮小に関するサンプルプログラム Demo.dpr が含まれています。Demo.dpr では 4-5 節で紹介した 3 個の拡大/縮小ルーチンの動作を確認できます。 サンプルは TBitmap と TBigBitmap の両方で使えるようになっていますので、巨大なビットマップでの確認も行えます。 尚 4-5節で紹介した拡大縮小ルーチン(EnLarge, Shrink, Stretch)は全て TBitmap版とTBigBitmap版が有り BitmapUtils.pas ユニットに含まれています。 BitmapUtils.pas は Common フォルダの中にあります。
Chapter\4-6 このフォルダには 4-6節で紹介した画像フィルターに関するサンプルプログラム FilterDemo.dpr が含まれています。 FilterDemo.dpr では 4-6 節で紹介した BitmapFilter ルーチンの動作を確認できます。 エンボスフィルタ、シャープフィルタ、ソフトフィルタ、ラプラシアンフィルタをお楽しみいただけるようになっています。 サンプルは TBitmap とTBigBitmapの両方が使えるようになっていますので、巨大なビットマップでの確認も行えます。 

尚、 4-6節で紹介したフィルタールーチン BitmapFilter は TBitmap 版と TBigBitmap 版が有り BitmapUtils.pas ユニットに含まれています。 BitmapUtils.pas は Common フォルダの中にあります。

Chapter4\4-7 このフォルダには 4-7 節で紹介した減色と誤差拡散に関するサンプルプログラム ReduceColors.dprが含まれています。 ReduceColors.dpr では 4-7 節で紹介した各種の減色ルーチンを使った減色を確認できます。 Octree, Median Cut、分散を使ったMedian Cut, Median Cut + 誤差拡散、分散を使ったMedianCut + 誤差拡散、固定パレットによる誤差拡散、計6種類の減色方式を確認できます。 サンプルでは TBitmapとTBigBitmap の両方が使えるようになっていますので、巨大なビットマップでの確認も行えます。 

尚、4-7節で紹介した各種の減色ルーチンは全て TBitmap 版と TBigBitmap版が有り、 MedianCut.pas、Octree.pas, ErrDef.pas, StaticErrDef.pas, ユニットに含まれています。これらは全て Common フォルダの中にあります。 本文で紹介しなかったルーチンも多数含まれていますので、詳細は本書の付録「CD-ROMの使い方」をご覧下さい。

Chapter5\5-1 このフォルダには 5-1 節で紹介した「印刷の基本」に関連するサンプルプログラムが含まれています。 

SimplePrint.dpr は List 5-1-1 を含む簡単な印刷の基本的なコーディングのやり方を示すサンプルアプリケーションです。 

PaperInfo.dpr は List 5-1-2 を含む、プリンタの紙情報を表示するサンプルアプリケーションです。

Chapter5\5-2 このフォルダには 5-2節で紹介した List 5-2-3 のコードを含む「プレビュー付きテキスト印刷プログラム」TextPrint.dpr が含まれています。 メタファイルと DrawText API によるプレビューと印刷を確認できます。

尚、List 5-1-2 で紹介した汎用ルーチン GetPaperInfo と、List 5-2-2 で紹介した PrintPreview コンポーネントは、 Commonフォルダに PrinterUtils.pas ユニット、PrintPreview.pas ユニットとして含まれています。

Chapter5\5-4 このフォルダには 5-4節で紹介した「プリンタの制御」に関連したサンプルプログラムが含まれています。 SimplePrinterSetup.dpr は List 5-4-1 を含むプリンタ制御の基本形を確認していただくためのサンプルで、紙サイズと紙の方向を変更できます。 GetPaperSizeDemo.dpr は List 5-4-3 を利用した紙サイズの一覧を表示するサンプルアプリケーションです。 このプログラムは本文にはリストが紹介されていませんが、Fig. 5-4-4 がその表示例です。

 尚、List 5-4-3 の汎用ルーチンは Common フォルダの PrinterUtils.pas ユニットの中にあります。 

ChangeUserDefinedPaperSize.dpr は List 5-4-6 を含む、プリンタのユーザ定義サイズを変更するサンプルプログラムです。 この中で使われている List 5-4-5 の汎用ルーチンは Commonフォルダの PrinterUtils.pas ユニットの中にあります。

 ColorCopiesCollateDemo.dpr は List 5-4-7 を含む、「カラー印刷」、「部数」、「部単位の印刷」の印刷設定を行うサンプルアプリケーションです。 「部数」、「部単位の印刷」のシミュレーションのサンプルとしてもお使いいただけます。

PrintQualityDemo.dpr は List 5-4-8 を含む、プリンタの印刷品質の変更を行うサンプルアプリケーションです。

Chapter5\5-5 このフォルダには 5-5節で紹介したプリンタの切り替え機能を確認するための List 5-5-1 のコードを含むサンプルプログラム ChangePrinter.dprが含まれています。
Chapter6\6-1 このフォルダには 6-1 節で紹介した「リージョン」に関連するサンプルプログラムが含まれています。 

SimpleClipping.dpr は List 6-1-2 で紹介した簡単なリージョンを利用したクリッピングの例を示すサンプルアプリケーションです。 

DrawWithRegion.dpr List 6-1-3 で紹介したより複雑なリージョン演算を使ったクリッピングの効果を示すサンプルアプリケーションです。 

tokei.dpr は List 6-1-7 で紹介したリアルタイムにアニメーションを表示するプログラムです。 透き通った時計がリアルタイムに針を動かしながら表示されます。 

List 6-1-1 で紹介したリージョンを楽に扱えるクラス TRegion を含む RegionUtils.pas と List 6-1-5 で紹介した TMetafile の改良版 (Windows 95/98 のバグ回避版)TMetafileEx クラスを含む MetafileEx.pas は Common フォルダ に収められています。

Chapter6\6-2 このフォルダには 6-2 節で紹介した「パス」に関連するサンプルプログラムが含まれています。 6-2 節の「パス情報」 Fig. 6-2-4 、 Fig. 6-2-5 や Fig. 6-2-6 などでパス情報の具体的な内容を示しましたが、 パス情報を解析して表示するのがサンプルプログラム PathReader.dpr です。 このプログラムはパスを作成するコードをサンプルアプリケーションに実際に書き込んでから動かします(デフォルトで簡単なコードが既に書き込んで有ります)。 どのようなコードがどんなパス情報になるのかが簡単に確かめられます。 

TextEffect.dpr は List 6-2-3 と Fig. 6-2-7 で紹介したテキストをひねって表示する、パスを使ってテキストに表示効果を加えるサンプルアプリケーションです。 

WideDashedLine.dpr は List 6-2-6 と Fig. 6-2-10 で紹介した太い破線を描くサンプルアプリケーションです。 Windows 95系列のWindowsでも太い破線を描けます。

 尚、Windows 95 系列のWindows でもパスで円や楕円、矩形などを利用可能にするルーチン、 DrawArc 、DrawAngleArc、DrawChord、DrawAngleChord、DrawPie、DrawAnglePie、DrawRectangle、DrawRoundRect、DrawEllipse、及び、 パス情報を保持し、パスを楽に扱えるようにする TPath、Windows 95 系列の Windows でも太い破線を描くことができる DrawFigure, DrawPath は Commonフォルダの PathUtils.pas に収録されています。

Chapter6\6-3 このフォルダには 6-3節で紹介した「テキストフォーマッティング」に関連するサンプルプログラムが含まれています。

 TextOut.dpr は Fig. 6-3-2 で紹介した Canvas.TextWidth と実際に TextOut API で描画される文字列のとの関係を確認するためのサンプルアプリケーションです。 

CorrectWidth.dpr は Fig. 6-3-5 で紹介した List 6-3-1 GetTextAAdjust, GetTextCAdjust ルーチンを使っってテキストの描画領域を正しく表示するサンプルアプリケーションです。 

TextPrint2.dpr は List 6-3-3 で紹介したテキスト整形を行いつつ段落を行に分解するルーチンGetTextPositionを使ったプレビュー付きのテキスト印刷プログラムです。 

尚、GetTextAAdjust, GetTextCAdjust, GetTextPosition を含む TextUtils.pas は Common フォルダに収録されています。

先頭に戻る

8. TBigBitmap の大きさの限界は?

NT系の Windows では特に大きさの限界はありません。使用できる仮想メモリの大きさ次第です、

Windows 9X/ME の場合は 1万X1万ピクセルを目安としてください。

TBigBitmap が 24bppp のビットマップを保持している場合は、Windows 9X/MEが作成できるビットマップの総容量、つまり 350MB〜400MB が限界になります。1万X1万ピクセルの 24bpp のビットマップは 300MB になります。

8bpp の場合は 1万X1万ピクセルで 100MB になりますが、この場合は GDIヒープ(64KB)がネックになります。TBigBitmap はビットマップを 8MB に分割して持ちますが、8bppのビットマップはパレットを使いますので、これが分割されたビットマップ毎に最大 1KB のGDIヒープを消費するからです。8bpp で 400MB のビットマップを作ると GDI ヒープを 50KB も消費してしまい、おそらく 障害が起きるでしょう。1万X1万ピクセルならば13KBで済みます。ビットマップの操作のために一時的にこの倍のパレットが必要になる場合がありますからこのあたりが限界になります。

4bpp, 1bpp のビットマップの場合は1万X1万ピクセルよりずっと大きくできます。ビットマップの容量がずっと小さくなるからです。1/4/8bppのビットマップの大きさは 100MB程度に抑えてください。

将来的にはパレットを共有できるビットマップクラスを作成して 8bpp の制限を取り払う予定です。

先頭に戻る

9. DHGLをインストールし、イメージコントロールにメタファイルを読み込むと、メタファイルがイメージコントロールからはみ出して表示される。

書籍の P335 の説明にありますように、TMetafileExクラスでは Windows 95, 98 のリソースリークの問題に対処するためメタファイルを描画する際、クリッピングを抑止しています。TMetafileEx は PrintPreview コンポーネントをインストールすると自動的に設計パッケージに 組み込まれますのでこのような現象が起きます。

この処置は、Windows 95/98 における Delphi の使用、及びDelphi で作成したアプリケーションの実行には必須のもので、Windows 95/98 の RestoreDC API のバグのためにイメージコントロールで GDI ヒープのリークが起きるのを防ぐためのものです。イメージコントロールをパネルに貼り付けるなどして、メタファイルがはみ出して描画されることを防ぐようにしてください。

しかしながら、Windows 95/98 向けのアプリケーションを今後作成しないという方もたくさんおられると思います。そのような場合は、MetafileEx.pas ユニットの 以下のコード(初期化部と終了部)を削除してください。このようにすると TPicture は TMetafileEx を使わなくなるため、TPicture を使う イメージコントロールも TMetafileEx を使わなくなります(TPicture のGraphic プロパティに明示的に TMetafileEx のインスタンスを代入した場合は、もちろん TMetafileEx が使われます)。

修正後、DHGLのPrintPreviewコンポーネントを組み込んだ設計時パッケージを再コンパイルすれば、この問題は起きなくなります。

initialization
  TPicture.UnregisterGraphicClass(TMetafile);
  TPicture.RegisterFileFormat('wmf', 'Windows Metafile', TMetafileEx);
  TPicture.RegisterFileFormat('emf', 'Enhanced Metafile', TMetafileEx);
  TPicture.RegisterClipboardFormat(CF_METAFILEPICT, TMetafileEx);
  TPicture.RegisterClipboardFormat(CF_ENHMETAFILE, TMetafileEx);

finalization
  TPicture.UnregisterGraphicClass(TMetafileEx);

先頭に戻る

10. PrinterUtils.pas と NkPrinter

拙作の NkPrinter と DHGL の PrinterUtils.pas の関係について問い合わせるメールを何通か戴きました。

Delphi Graphoc Secrets 5章 印刷の各種のサンプルコードと DHGLの PrinterUtils.pas は TPrinter の扱い方とプリンタ制御の理解を助けるために作ったコードです。TPrinter の扱い方を学ぶにはよいコードだとは思っていますし、通常の印刷処理を書くのに、PrinterUtils.pas とサンプルプログラムは十分に役に立つと思います。但し、TPrinter の基礎知識無しでは使えません(5章を読んでください(^^;)。

筆者が作成した NkPrinter は、あまり TPrinter の知識をもっていなくても、簡単にプリンタの各種の制御を行うことができるオブジェクト(グローバル変数)です。紙に関する各種情報の取得、紙サイズ、ユーザ定義サイズ、給紙方法、印刷品質、両面印刷、カラー印刷、部単位の印刷、印刷部数などの取得/設定、プリンタの一覧の取得と切り替えなどが簡単に行えます。Delphi 3/4/5/6/7/2009 で動作します。

TPrinter をブラックボックス的に使いたいならこちらがお勧めです。以下の場所からダウンロードできます。フリーソフトで、どなたでも商用目的でもご利用いただけます。

中村の里 内のダウンロードエリア 最新版は 0.53 です。

先頭に戻る

11 TBigBitmapでビットマップをクリップボードに送るとOSがハングアップすることがある。

残念ながらこの問題は Windows 95系列の Windows の制限でどうしようもありません。

Windows 95系の OS は、16MB を越えるビットマップをクリップボードに送るとハングアップします。Windows 95系の OSには16MBを越えるビットマップをクリップボードに貼り付けないでください。

TBigBitmap はCF_DIB形式、つまり DIB をクリップボードに送ります。すると Windows 95系列の Windows はこれをもとに CF_BITMAP 形式、つまり DDB 形式のビットマップも作ろうとします。しかし、WIndows 95系列の Windows は 16MB 以上の DDB を作れないので、ハングアップしてしまいます。つまり、DIBをDDBに変換した後のビットマップの大きさが 16MB以上になるとハングアップします。

ハングアップせずにエラーになるのが正しいと思うのですが、残念ながら Windows 95 系列の Windows は悲しいことにそういう賢い設計にはなっていません。気をつけてください。

先頭に戻る

Copyright (C) 2002  中村拓男 All rights reserved. 
inserted by FC2 system