最終更新日: 2009/3/30
1. | [書籍] | P23 List 1-5-5 のコードがコンパイルエラーになる |
2. | [DHGL] | DrawRectangle で Canvas に矩形を描くと矩形の左の線が描かれない |
3. | [DHGL]、[書籍] | サンプルプログラム TextPrint のプレビュー表示がおかしい。 |
4. | [DHGL]、[書籍] | サンプルプログラム TextPrint2 でサンプルプログラムが強制終了する。 |
5. | [DHGL]、[書籍] | P310 List 5-4-7 の誤り |
6. | [DHGL] | DHGL.CNTの誤り |
7 | [DHGL] | メディアンカットによる減色が失敗する |
8 | [DHGL] | C++Builder で NkMM, NkShareMemユニットを使う |
9 | [DHGL] | DHGL は Delphi 7 Studio で使えます |
10 | [DHGL] | PathUtilsユニットの DrawPath の不具合 |
List 1-5-5 のコードが間違っています。正しくは
procedure TForm1.Button4Click(Sender: TObject); begin Canvas.Rectangle(10, 10, 30, 30); end;
です。
2. [DHGL] DrawRectangle で Canvas に矩形を描くと矩形の線が一部描かれないDHGLのヘルプには PathUtils ユニットのDrawRectangle は「単に Canvas 上に 矩形を描く手続としても使えますが、」と書かれていますが、これは誤りです。DrawRectangle はパスに矩形を描くための手続きで、図形を閉じるのに CloseFigure API を使っています。CloseFigure は BeginPath〜EndPath の間でしか機能しませんのでこのような現象が起きます。 DrawRectangle はパスの中に矩形を描くためだけに使用し、TCanvas に矩形を描く場合は TCanvas の Rectangle メソッドを使用してください。 同様の問題は、
でも起こります。パスへではなく TCanvas に普通に図形を描く場合は、TCanvas のメソッドを使用してください。
は問題ありません。 このヘルプファイルの誤りは DHGL 1.1
で修正しました。 先頭に戻る |
4. [DHGL][書籍] サンプルプログラム TextPrint2 でサンプルプログラムが強制終了する。現象:サンプル TextPrint2 で比較的大きなテキストを印刷プレビューすると、アプリケーションが異常終了する。 原因:この問題は Windows 9X/ME のバグのようです。Windows 9X/ME は ExtTextOutW API をサポートしており、スクリーンやプリンタへの文字列描画に問題なく使えますが、ExtTextOutW API を使ってメタファイルに文字列を大量に描画すると、アプリケーションが強制終了されてしまいます。この現象は TextOutW API でも発生します。 この現象はExtTExtOutW API を使ってメタファイルに文字列を描くだけの単純なプログラムを使って、複数の Windows 98 のマシン、WIndows ME のマシンで確認しました。 対処:この問題を避けるには、メタファイルへの文字列の描画時、 ExtTextOutW の使用を避けるしか有りません。ところがアフターケアの4番で述べましたように ExtTextOut API をメタファイルの描画に代わりに使うことはできません。 アフターケアの4番で述べたように、ExtTextOut API で一文字づつ文字を描けば問題はおきません。 そこで ExtTextOutW API と同等のパラメータを受け取り、ExtTextOutA を使って一文字ずつ文字を描く DHGLExtTextOutW を開発いたしました。メタファイルへ文字列を描画するとき、ExtTextOutW を使うべきところに DHGLExtTextOutW を使えば問題は起きなくなります。 書籍の修正:P369 List 6-3-3 の ExttextOutW を使っているところを
に修正します。 DHGLの修正:Chpter6\6-3\TextPrint2 の MainFormU.pas を上記の書籍の修正にあわせて修正しました。この修正は DHGL 1.1 に MetafileUtils.pas の修正とともに入っています。 また MetafileUtils.pas に DHGLExtTextOut と DHGLExtTextOutW を追加しました。 DHGLExtTextOut は 1文字の ExtTextOut API で描画する ExtTextOut API 互換ルーチン、DHGLExtTExtOutW は 1文字の ExtTextOut API で描画する ExtTextOutW API の互換ルーチンです。 尚、両ルーチンとも Windows NT/2000/XP では DHGLExtTextOut は ExtTextOut API に、 DHGLExtTextOutW は ExtTextOutW API にパラメータを渡して実行するだけです。 |
5. [DHGL]、[書籍] P310 List 5-4-7 の誤りP310 List 5-4-7(DHGL サンプルの Chapter5\5-4\ColorCopiesCollateDemo)に誤りがありました。以下に修正を示します。太字が修正部分です。
この修正は DHGL 1.1 に入っています。
|
6. [DHGL] DHGL.cnt の誤りDHGL1.1 のヘルプを Delphi に組み込み、Delphiのヘルプを開くと、下図のように目次に余分な項目が表示されてしまいます。これは DHGL 1.1 の DHGL.cnt のリリースミスです。 特に害はありませんが、見苦しいとお思いの方は、申し訳ありませんが、以下の手順で削除してください。 1) 適当なエディタで DHGL.cnt を開き、下記の赤字の部分を削除してください。
2) Administrator でログオンして、<Delphi をインストールしたフォルダ>\bin にある OH.EXE を起動してください。runas コマンドや、エクスプローラで[別のユーザとして実行]を使って Administrator として OH.EXE を立ち上げても結構です。(Windows 9X/ME をお使いの方は単に OH.EXE を立ち上げるだけでけっこうです)。 3) OH.EXE で <Delphiをインストールしたフォルダ>\Help にある delphi6.ohp(Delphi 6 の場合), 又は delphi5.ohp(Delphi 5 の場合)を開いてください。
4) タブページ[目次]を選び、DHGL.cnt を削除して、再追加してください。そして[ファイル(F)}→[プロジェクトを上書き保存(A)]を選ぶと Delphi のヘルプの目次が更新されます。 このミスは DHGL 1.2 で修正されています。 |
7 [DHGL] メディアンカットによる減色が失敗するMedianCut ユニットのメディアンカットによる減色ルーチン function ReduceColorsByMedianCut(Bitmap: TBitmap; Depth: Integer) : TBitmap; overload; function ReduceColorsByMedianCutV(Bitmap: TBitmap; Depth: Integer) : TBitmap; overload; function ReduceColorsByMedianCutED(Bitmap: TBitmap; Depth: Integer): TBitmap; overload; function ReduceColorsByMedianCutVED(Bitmap: TBitmap; Depth: Integer): TBitmap; overload; function ReduceColorsByMedianCut(Bitmap: TBigBitmap; Depth: Integer) : TBigBitmap; overload; function ReduceColorsByMedianCutV(Bitmap: TBigBitmap; Depth: Integer) : TBigBitmap; overload; function ReduceColorsByMedianCutED(Bitmap: TBigBitmap; Depth: Integer): TBigBitmap; overload; function ReduceColorsByMedianCutVED(Bitmap: TBigBitmap; Depth: Integer): TBigBitmap; overload; は 減色するビットマップが8Mピクセル以上で、ビットマップの色が特定の明るい色に偏っている場合(例えばビットマップの背景が白1色の場合)、減色がうまく行かず、変な色のビットマップを生成してしまいます。 これはTMedianCut クラスの、色の重心を計算する処理で、整数演算のオーバーフローが起きているためです。 MedianCut.pas の procedure TMedianCut.CutCubes 内の色の積算処理を // 各色を積算する {$IFDEF ORIGINAL} RAve := RAve + R * Cubes[i].NumPixels; GAve := GAve + G * Cubes[i].NumPixels; BAve := BAve + B * Cubes[i].NumPixels; {$ELSE} RAve := RAve + Int64(R) * Cubes[i].NumPixels; GAve := GAve + Int64(G) * Cubes[i].NumPixels; BAve := BAve + Int64(B) * Cubes[i].NumPixels; {$ENDIF} end; procedure TMedianCut.CutCubesByVariance 内の色の積算処理を {$IFDEF ORIGINAL} // 各色を積算する RAve := RAve + R * Cubes[i].NumPixels; GAve := GAve + G * Cubes[i].NumPixels; BAve := BAve + B * Cubes[i].NumPixels; {$ELSE} // 各色を積算する RAve := RAve + Int64(R) * Cubes[i].NumPixels; GAve := GAve + Int64(G) * Cubes[i].NumPixels; BAve := BAve + Int64(B) * Cubes[i].NumPixels; {$ENDIF} に変更してください。これで 585Mピクセルまでのビットマップを問題なく減色できるようになります。 尚、この修正は DHGL 1.2 に反映されています。 |
8 C++Builder で NkMM, NkShareMemユニットを使うDelphi Graphic Secrets では DHGL を使う際、Delphiのメモリマネージャのバグに対処するため独自のメモリマネージャ NkMM, NkMemMgr を使うことになっています。同様の問題が C++Builder にもありますが、Delphi Graphic Secrets では触れていませんでした。また C++Builder で NkMM, NkMemMgrを使うには、若干ソース修正が必要なことがわかりました。以下に C++Builder で NkMM, NkMemMgr を使う方法を記述します。 1. ソース修正 まず、NkMM.pas と NkShareMem.pas の先頭の部分を以下のように修正してください。
2. NkMM を EXE 又は DLL で使う方法 NkMMユニットを EXE で使う場合は、プロジェクトに NkMM.pas を加え、プロジェクトソースに以下の記述を加えてください。
NkMMユニットをDLLで使う場合は、プロジェクトに NkMM を加え、DLLのメインのソースファイル(DLLEnttryPointが記述されているファイル)に上の記述を追加してください。 EXEの場合も DLL の場合もプロジェクトのリンカオプションで、「共有 RTL DLL を使う」のチェックを外してからコンパイルしてください。これはメモリマネージャとして BorlandMM.dll が使われるのを防ぐためです。 3. NkShareMem を EXE 又は DLL で使う方法 共有メモリマネージャ NkMemMgr.dll を使い、EXE と DLL がメモリマネージャを共有する場合は NkShareMem.pas を使います。Delphi Graphic Secrets には NkMemMgr.dll は付属していますが、インポートライブラリが付属していません。まずコマンドラインから implib NkMemMgr.lib NkMemMgr.dll としてインポートライブラリを作ってください。 NkShareMem.pasを EXE でつかう場合は、プロジェクトに NkShareMem.pas と上で作ったインポートライブラリ(NkMemMgr.lib)を加え、プロジェクトソースに以下の記述を加えてください。
NkMMユニットをDLLで使う場合は、プロジェクトに NkShareMem と上で作ったインポートライブラリ(NkMemMgr.lib)を加え、DLLのメインのソースファイル(DLLEnttryPointが記述されているファイル)に上の記述を追加してください。 EXEの場合も DLL の場合もプロジェクトのリンカオプションで、「共有 RTL DLL を使う」のチェックを外してからコンパイルしてください。 |
9. DHGL は Delphi 7 Studio で使えますDHGL 1.0, 1.1, 1.2 を Delphi 7 Studio を試験したところ全く問題はありませんでした。 DHGLは Delphi 7 Studio で問題なくご利用いただけます。 尚、DHGL 1.2 のドキュメントに Delphi 7 Studio で使えることを加えた DHGL 1.2 を新たに公開しました。ドキュメント以外中身は全く同じなので バージョンは DHGL 1.2 のままです。 |
10. PathUtilsユニットのDrawPath の不具合DHGL 1.0, 1.1, 1.2 の PathUtils ユニットのDrawPath手続きはパスの座標数が2以下の場合、無限ループに陥ります。下記のように DrawPath手続きを修正してください。赤色の文字が修正個所です。修正内容は DHGL 1.0, 1.1, 1.2 とも同じです。 本問題は DHGL 1.3 で修正済みです。
|