コンピュータ言語は、コンピュータ科学技術の発展を反映して、機械語から高級言語、複雑なものから単純なもの(実際には単純ではありません)へと発展してきました。コンピューター言語が高度になればなるほど、より抽象的かつ人間的となり、低レベルのハードウェアとの関係が少なくなり、より使いやすくなります。しかし、コンピュータ言語がどれほど高度であっても、それはオペレーティング システム層の抽象化であるため、高級言語を理解するための背後にある規則を常に見つけることができます。つまり、高級言語で書かれたコードは単なるコードです。人々のニーズを記述するには、これらのコードは「トランスレータ」を通過し、コンピュータが認識して実行できるように機械語形式に変換する必要があります。いわゆる翻訳方法には 2 つあります。1 つはコンパイル方法です。この方法では、事前にコンパイラによってコードが機械語で生成され、Delphi 言語や C++ 言語などのオペレーティング システムによってスケジュールされて実行されます。 ; もう 1 つは解釈方法であり、解釈と実行は Basic 言語やスクリプト言語などのターゲット プログラムに影響を与えません。解釈方法の特徴は、実行速度が遅く、コンピュータ ハードウェアの要件が比較的高いことです。
コンピューター言語は、人々のニーズを記述するルールを定義します。言語の背後にはコンパイラーまたはインタープリターがあります。コンパイラーまたはインタープリターの主な仕事は、コードを変換し、人間とコンピューター間の通信の主要なチャネルとなることです。このように、オペレーティング システムが変更されていない場合、さまざまな開発ツールは独自の能力を発揮しますが、最終的にはコンピュータで実行可能なコードを生成する必要があります。したがって、プログラムがどのコンピュータ言語で書かれていても、その良し悪しはその言語のコンパイラやインタプリタに大きく依存します。 Delphi のコンパイラは、依然として世界で最も先進的で、最高かつ最も効率的なコンパイラです。
高級言語の特性から判断すると、基本的にはオペレーティング システムが提供するサービス インターフェイスをカプセル化し、これに基づいて OOP、ポインタ、メモリ管理モードなどの独自の言語機能を追加します。
Delphi 言語のアーキテクチャ全体から見ると、プログラムを作成するときは、VCL を直接使用するか、オペレーティング システムが提供する API を呼び出すか、Com サービスを使用するか、アセンブリ言語を直接使用して作業を完了します。
Delphi の中核で最も優れている点は、ビジュアル コンポーネント ライブラリ (VCL - ビジュアル コンポーネント ライブラリ) とクロスプラットフォーム コンポーネント ライブラリ (CLX - クロスプラットフォーム用コンポーネント ライブラリ) です。これらは Microsoft MFC に似ていますが、そのアーキテクチャは少なくともMFC の 3 世代よりも 2 ~ 3 年進んでいます。 Delphi でプログラミングする場合は、VCL を選択するか、最初から開始しないかを選択できます。ウィンドウを作成して「Hello world」を表示するプログラムを作成するとします。VCL を使用しない場合は、API の CreateWindow を呼び出すことから始めなければなりません。これは要件によって異なります。これは、コンソール プログラムなど、VCL なしで Delphi プログラミングを使用することが不可能ではないことを示しています。
VCL は、Delphi 言語のオブジェクト指向機能の本質および結晶である強力なクラス ライブラリです。クラス図の構造は次のとおりです。
これは簡略化されたクラス図の構造ですが、非常に代表的なものであることがわかります。このクラス図から、VCL にはルートが TObjct しかなく、その派生クラスのそれぞれに祖先が 1 つだけあることがわかります。これは Delphi 言語のオブジェクト指向の機能であり、すべてのクラスの最もオリジナルな祖先は TObjcet であり、継承方法は単一継承です。説明する必要があるのは次のとおりです。
l VCL のデザインはクラシックで巨大ですが、だからといって怖がる必要はありません。率直に言うと、これは、特定の機能を実行するために多数の関連クラスがまとめられたクラス ライブラリです。これらのクラスは、Windows API をカプセル化したり、Windows COM サービスを呼び出したり、アセンブリを使用して直接操作したりします。前述したように、VCL の有無にかかわらずプログラムを作成できます。つまり、VCL は必要ありません。必要に応じて、任意のクラスを継承および拡張して、独自の要件を満たすクラスにすることができます。たとえば、TPanal クラスを拡張する場合、QQ パネルの機能など、マウスの出入り時に対応するイベント (OnMouseEnter/OnMouseLeave) をトリガーできます。
u [ファイル]→[新規作成]→[ユニット]から新しいユニットを作成します。
u 次のようにコードを記述し、ユニットを MyPanelUnit として保存します。
ユニットMyPanelUnit;
インタフェース
クラス、ExtCtrls、メッセージ、コントロールを使用します。
タイプ
TMouseActionEvent = オブジェクトの PRocedure(Sender: TObject);
TMyPanel = クラス(TPanel)
プライベート
FOnMouseEnter、FOnMouseLeave:
FouseActionEvent;
//マウス入力メッセージをインターセプトする
プロシージャ WMMouseEnter (var メッセージ:
TMessage); メッセージ CM_MOUSEENTER;
//マウス移動メッセージをインターセプトする
プロシージャ WMMouseLeave (var メッセージ:
TMessage); メッセージ CM_MOUSELEAVE;
出版された
プロパティ OnMouseEnter: TMouseActionEvent 読み取り
FOnMouseEnter 書き込み FOnMouseEnter;
プロパティ OnMouseLeave: TMouseActionEvent 読み取り
FOnMouseLeave FOnMouseLeave を書き込みます。
終わり;
//「Register」の「R」は大文字にする必要があることに注意してください。これは、Delphi 言語でサイズに注意する必要がある唯一の場所です。
手順 登録;
実装
{TMyPanel}
手順 登録;
始める
//DelphiのIDEにコンポーネントを登録し、「MyControl」パネルに表示します
RegisterComponents('MyControl', [TMyPanel]);
終わり;
プロシージャ TMyPanel.WMMouseEnter(var メッセージ: TMessage);
始める
//マウスが入ったときにコードがあるかどうか、そしてそれが実行されるかどうかを判断します
割り当て済み(FOnMouseEnter)の場合
FOnMouseEnter(Self);
終わり;
プロシージャ TMyPanel.WMMouseLeave(var Message: TMessage);
始める
//マウスが入ったときにコードがあるかどうか、そしてそれが実行されるかどうかを判断します
割り当て済み(FOnMouseLeave)の場合
FOnMouseLeave(Self);
終わり;
終わり。
u 次に、以下に示すように、[コンポーネント]->[コンポーネントのインストール…]をクリックします。
「ユニットファイル名」で先ほど作成したユニットMyPanelUnit.pasを選択し、他のオプションはデフォルトのままにします。次に、「OK」をクリックし、「Package dclusr.bpk will be build then install, Continue?」で「はい」を選択し、コンパイルとインストール後に保存します。このようにして、TmyPanel コントロールが Delphi にインストールされます。 Delphi コントロール パネルを最後までスクロールすると、以下に示すように、コントロール ページ MyControl が表示されます。
u 次に、新しいプロジェクトを作成し、[ファイル]->[新規]->[アプリケーション]をクリックし、MyControl ページから MyPanel をフォームにドラッグし、F11 キーを押して、次のようにイベント ページに切り替えます。
TPanel と比較して、さらに OnMouseEnter および OnMouseLeave イベントがあるかどうかを確認します。 OnMouseEnter をダブルクリックし、次のようにコードを記述します。
プロシージャ TForm1.MyPanel1MouseEnter(送信者: TObject);
始める
ShowMessage('マウスが MyPanel1 に入ります');
終わり;
次に、F9 を押して実行し、マウスを MyPanel1 に移動して、結果を確認します。
それはとても簡単です。私たちは TPanel を拡張してマウスの入力と削除のイベントを処理できるようにしました。そのため、VCL は誰でも内部のコンポーネント (クラス) を書き換えて望むものにすることができます。
l Delphi はインターフェイスの継承をサポートしています。これは、ある意味、多重継承を実装します。たとえば、TComponent は次のように定義されます。
TComponent = class(TPersistent, IInterface,
IInterfaceComponentリファレンス)
l 抽象クラスのインスタンスを作成しないでください。クラス内の 1 つのメソッドが抽象メソッドである限り、そのクラスは抽象クラスです。たとえば、TStrings は次のように定義されます。
TStream = クラス(TObject)
プライベート
…
保護された
…
公共
関数 Read(var Buffer; カウント:倍長整数): 仮想;
関数 Write(const バッファ; カウント:倍長整数): 仮想;
…
終わり;
メソッドの定義に抽象キーワードがある限り、それは抽象メソッドです。 Read と Write は実装されておらず、呼び出されるとサンプルが表示されるため、抽象クラスを使用してインスタンスを作成することには意味がありません。
(未完成、Delphi の舞台裏---初心者向けリファレンス パート 2 (2) を参照してください)
(転載する必要がある場合は、出典と著者を明記してください http://haitian.myrice.com)