第0章 ようこそ!

Win32 API by Object Pascal of Delphi のページにようこそ! このページでは、 Borland(旧INPRISE)社のプログラム開発環境である Delphi で使われている Object Pascal という言語をつかって、Windows 95/98/2000DLL (ダイナミック・リンク・ライブラリ)として提供している Win32 API (アプリケーション・プログラミング・インターフェース)という関数群を呼び出してウィンドウズアプリケーションをつくる方法を解説しています。

どのようなプログラム言語を使ってアプリケーションを開発するにしても、できあがったプログラムは直接的に、またはクラスライブラリなどをとおして間接的に API を呼び出しているのです。 したがって、プログラミング技術を突き詰めていくと、究極的には API の適切な使用方法に関する知識が不可欠であることが分かって来るでしょう。ここでは、ごく基礎的なことからかなり高度な内容まで、出来るだけ分かり易く解説することを目指したつもりです。 どうかご一読ください。

ここの内容

どんな方々を対象にしているのか?
Delphi讃歌
ここでする事
本稿の読み方と使い方
About me...


| arrw18c.gif トップページへ | 総目次へ | 次の章へ arrw18d.gif

どんな方々を対象にしているのか?


orangeba.gif先頭へ戻る

Delphi讃歌

Dephi は素晴らしい。私は Delphi にぞっこんです。なにがいいかって? そう、RAD ベースで簡単にウィンドウズアプリケーションがつくれること。パスカルというプログラミング言語には曖昧さがなくて、使っていても気持ちいいこと。VCL (ビジュアル・コンポーネント・ライブラリ)が美しい。そして、なによりコンパイラがすばらしい!!

Borland 社(あえて INPRISE とは言わない)が長年育ててきたパスカルとそのコンパイラは、非常に素晴らしい。C++Basicなどの言語を使った事がある人でも、Delphiのコンパイラが非常に優れたものであることには異論があるとは思えないほどである。さらに言えば、VCL も素晴らしい。ソースを見ることができるひとには、是非、このVCLソースを深く味わうことをおすすめする。 VCLObject Pascal という強力な言語を材料としてクラスの階層を積み上げて出来ており、 人工的な構築物としては最も美しいものの一つである、と感じるのは私だけではあるまい。

しかし、しかしである。VCL を使った RAD 環境でのプログラミングにある程度習熟してくるにしたがい、フォームにコンポーネントをドロップしてイベントハンドラを書くということを繰り返していて、何となく疑問やむなしさを感じることはありませんか? イベントハンドラを呼び出すメッセージは、どこからどのような仕組みでコンポーネントのメソッドを呼び出すのか? ここをこうしたいんだけど、このクラスのプロパティーやメソッドを使ってはできないかもしれない、とか。このようなプログラマが進む次の段階がコンポーネントの作成である。 Delphi の特徴の一つは、自分自身でコンポーネントを作成して、その機能を拡張できることだ。 巷間には、便利なコンポーネントやその作り方を解説した書籍が多数あるし、インターネットからはソースを参照できるコンポーネントが数千あるいは数万個もダウンロードできる。これらのコンポーネントの動作とソースを参照すれば、プログラマとしてのスキルは確実にアップする。 さて、その次の段階は?

orangeba.gif先頭へ戻る

ここでする事

Delphi のプログラミングテクニックに関する TipsFAQ についての書籍やインターネットのホームページを見てみると、あまり使われない関数やクラスのプロパティーやメソッドを使用するか、Win32 APIを使えば解決できるものが9割以上を占めています。 特に、「APIを使えばできます」という答えが7割くらいあるでしょう。APIに関するレファレンスは、で書かれたものが多数出版されています。コードレベルでみれば、Pascal の差異はほんのわずかですから、少し を勉強すればこれらの書籍は非常に参考になります。 また、Delphi 用に Pascal を使った API のレファレンスも最近出版されました。 これらを参考にすることで、RAD 環境での API の使用には適切に対処できます。

しかし、特定の問題を二、三個のAPI関数を使用して解決したとしても、 それは断片的な知識として残るだけです。 このようなことを多数回繰り返しても、 決してAPIに関する体系的な知識を得ることは出来ません。 第一、どのようなときにどのようなAPIを使ったらいいのか分かりません。 なぜ、このAPIを使えばその問題を解決できるのか、ということが分かりません。 ではどうしたらよいでしょうか?

ここでは Win32 APIを体系的に学ぶために、以下のことをします。

redball.gifDelphi の Object Pascal を使って Win32 アプリケーションを作成するが TObject 以外の VCL コンポーネントは一切使用しない。
メインウィンドウはもちろんのこと、プッシュボタン、チェックボックス、ラジオボタン、グループボックスなどのボタンコントロールやリストボックス、エディット、メモ、コンボボックス、スクロールバーなどのコントロールをコードとAPIだけをつかって Pascal で作成し、使用する。

redball.gif上記のようなコントロールを Object Pascal のコードで包み込んだラッパークラスを作成する。
コードレベルでのコントロールの使用法が分かったところで、コードの再利用性を高め、保守を容易にするためにコントロールのラッパークラスを作成し、簡単な使用法を示す。

redball.gifタイマやドラグドロップの機能をコードで実現し、またそのラッパークラスを作成する。
非ビジュアルコンポーネントに対応する機能をAPIコードで示し、またそのラッパークラスを作成する。

redball.gifウィンドウのクライアント領域に絵を描く機能をAPIで実現する。
この機能をつかって、TImage や TPaintBox が何をやっているのかを知ることが出来る。

redball.gif上記のグラフィックス操作とメッセージ処理機能を組み合わせて、ラベルやスピードボタンをコードで作成し、またそのラッパークラスを作成する。
以上で作成したラッパークラスを使用することにより、VCLのコンポーネントパレットの standard ページの機能のほとんどが実現できる。

redball.gifメニューとダイアログボックスをコードで作成し、またそのラッパークラスを作成する。
本来、リソースとしてプログラムにリンクして使うメニューやダイアログボックスをAPIを使ってコードで作成し、その機能のラッパークラスを作成する。

redball.gifディスクファイルへのアクセスや操作をコードで行う例を示す。
ディスクファイルを読みとったり、書き込んだり、作成したりする方法を示す。 また、コピー、移動、削除などの仕方を示す。

redball.gifビットマップ、アイコン、メタファイルの使い方、作成方法、ディスクファイルへの保存方法を示す。
Win32 が標準でサポートするグラフィックであるビットマップ、アイコン、メタファイルについて、その表示方法やファイル形式について説明し、実際にコードで表示、作成、保存を行う。 また、外部DLLを使用して、JPEG や GIF、TIFF などの表示を行う。さらに、この機能をカプセル化したクラスを作成する。

redball.gifコモンダイアログのコードでの使用方法を示す。
Delphi の VCL の Dialogs ページにある[色の選択]、[フォントの選択]、[ファイルの保存] などのコモンダイアログのコードレベルでの使用方法を示し、簡単に使用するための関数を作成する。

redball.gifプリンタへの印刷方法を示す。
プリンタへの絶対座標による文字列やグラフィックスの出力方法、およびユーザー定義座標によるグラフィックス出力の方法を示す。

redball.gifコモンコントロールのコードレベルでの使い方を示し、そのラッパークラスを作成する。
ツールバー、ステータスバー、アップダウン、スピン、トラックバー、プログレスバー、タブ、ツリービューなど Win32 で初めて導入されたコモンコントロールをコードレベルで使う方法を示し、そのラッパークラスを作成する。

redball.gifクリップボードなどを使ったアプリケーション間の通信についてコードレベルでの幾つか使用例を示す。
クリップボードの機能やビューア機能をカプセル化したクラスも作成する。

redball.gifAPIをつかって、コンソールアプリケーションを作る方法とその操作方法を示す。
小さなユーティリティーや逆に大規模な数値計算をするアプリケーションで用いられるコンソールアプリケーション(いわゆるDOS窓ではない!)をAPIを使って作成し、操作する方法を示す。

redball.gif簡単なレジストリの操作方法を示す。
レジストリへの登録、変更、削除などをAPIを使って行う。

以上のことを、必ずしもここに挙げた順番ではありませんが、順を追って説明します。 これらのことを実際にコードを追い、また、Delphi で実行してみることにより、 Win32OS としての姿が自然に浮かび上がってくることでしょう。 また、メッセージの伝達方法とその処理方法が明確に知識として身に付き、API のレファレンスを読むだけで自力で使用方法を開拓できるようになります。 おまけとして、 VCL よりはるかに小さなクラスライブラリを手に入れることが出来、それを使って RAD 環境で作成されるより、はるかに小さな(典型的には1−2割の大きさの)実行ファイル(*.exe) が作成できます。また、ここで作成した多数のラッパークラスは RAD 環境でも使うことが出来ます。

orangeba.gif先頭へ戻る

本稿の読み方と使い方

本稿は、眺めているだけではあまり役に立ちません。読んで頂く必要があります。 本稿は、 DelphiObject Pascal を道具として、Win32 システムが提供する API関数だけを使ってアプリケーションを開発する手法を紹介しています。 したがって、VCL や Object Pascal そのものの解説はいたしません。

本稿ではすべてのプログラムコードを公開しています。 Web ブラウザからマウスで選択してコードエディタに貼り付けることが出来ます。 したがって、読むだけでなく、実際に Delphi でコンパイルして実行し、動作を実感した上でコードを解析する事をおすすめします。 残念ながら、実行ファイル(*.exe)は、そのままでは当サーバ上には置けませんので、各実行コードは zip 圧縮したものをコードリストのしたのところからダウンロードできるようにしてありますので、実行ファイルだけで試すことも出来ます。

最初から通読することを前提にしていますが、章ごとに読むことも出来ます。 その場合は、 対象とする章の前の章の最後のところで、そこまでの骨格プログラムと各ユニットファイルを読むことができますので、ブラウザからエディタに貼り付けて取り出すことが出来ます。 通読する場合は、 適当に章を眺めてから、オフライン作業でブラウザをつかってキャッシュから読むようにすると、電話代が節約できます。

このページで公開しているプログラムコードの断片を、わたしに断ることなくどのように利用していただいてもかまいません。筆者としてのどのような権利も一切主張することはありません。ただ、ソースプログラムを公開・配布するときには、引用元として当ページを明記していただければありがたいです。


Windows のメモ帳( notepad.exe, 私のバージョンではサイズは 37.816キロバイト )やマインスイーパゲーム( winmine.exe, 24.224 キロバイト )はどうしてこんなにサイズの小さい実行ファイルなのか不思議に思ったことはありませんか? DelphiRAD環境での開発では、どうがんばってもこれほど小さい実行ファイルを作ることはできませんね。本稿を読めば、その理由が分かります。 それでは....

orangeba.gif先頭へ戻る

About me...

  1. ネットネーム: Halbow(ハルボウ)
  2. 生年月日: 1953年4月21日 49才のおじさん
  3. 職 業: 公的機関での研究職
  4. 趣 味: ピアノ・プログラミング
  5. 言語歴: Fortran、6800機械語、8085機械語、N88Basic、8086機械語、Visual Basic、Delphi、C++、HTML、JavaScript、Java
  6. プロフィール: 既婚、娘二人

orangeba.gif先頭へ戻る