ビジュアル コンポーネントは実際にはクラスです。クラスを作成するには、*.pas ファイルに直接記述します。ただし、コントロールを作成するには、パッケージを使用する必要があります。 [ファイル] メニューから [新規] を選択して、新しいパッケージを作成します。これは、コントロールの保存とインストールに使用されるパッケージです。次に、「パッケージ」ウィンドウの「追加」ボタンをクリックしてコンポーネント(ユニット)を追加します。
ポップアップ ダイアログ ボックスの上部にある [新しいコンポーネント] を選択します。コントロールのすべてのプロパティ、メソッド、イベントを自分でプログラムすることは不可能であるため、祖先クラス (または「親クラス」または「基本クラス」) を選択し、独自のプロパティ、メソッド、およびイベントを追加する必要があります。それに対するイベント。 [祖先タイプ] の後のドロップダウン ボックスで、必要な祖先クラスを選択します。ビジュアル コントロールを記述するには描画が必要なため、TGraphicControl が祖先クラスとして選択されます。次に、[クラス名] ボックスに新しいコントロール (クラス) の名前を入力します。通常は「T」で始まります。パレット ページは、Delphi ウィンドウで新しいコントロールのコントロール ページ名を選択するために使用されます (「標準」など)。これは自分で選択できます。 「ユニットファイル名」に新しい制御ファイルのパスとファイル名を追加し、「OK」ボタンをクリックします。新しいコントロールが追加されます。次に、コントロールのコードを記述します。
以下では、ビジュアル コントロールの記述方法を説明するための例として、画像をカスタマイズできるスクロール バーの記述を取り上げます。
上記の方法に従い、祖先クラスとして TGraphicControl を選択します。新しいコントロールの名前は TPighorizontalScroller です。ファイルパスとファイル名を選択したら、「OK」ボタンをクリックしてコードの記述を開始します。
各コントロールは作成 (Create) と削除 (Destroy) されるため、これら 2 つの処理を最初に記述する必要があります。コントロール内のすべてのプロシージャについて、最初にプロシージャを定義し、後で記述する必要があります。定義されたプロセスまたはプロパティには 3 つのタイプがあります。 1. PRivate の後に定義されたものは、コントロールによって内部的に使用され、コントロールを使用するユーザーには表示されません。 2. protected の後に定義されたものは、通常は表示されず、他のユーザーが使用できるのは次のとおりです。他のコントロールはそのコントロールを使用します。このコントロールは、他のコントロールを祖先クラスとして作成する場合にのみ表示されます。3. public の後に定義されたコントロールは、プログラム内でのみ呼び出すことができます。4. public の後に定義されたコントロールは、プロパティ ウィンドウに表示されます。検査官)。作成・削除処理は、プログラミング処理中にコントロールが作成されたときに自動的に実行されるだけでなく、プログラム実行中に動的にコントロールが作成されたときに呼び出される場合もあるため、public(1)の後に定義します。 (シリアル番号は、添付ソースプログラム内でのサブステップのコードの位置を示します。以下同様) この2つのプロセスで何をコンパイルすればよいのか、どのようにコンパイルすればよいのかまだ分からないかもしれません。それについては以下で説明します。
まず、このコントロールにいくつかのプロパティを追加しましょう。スクロール バーの最大値を設定または読み取るために Max プロパティを定義します。通常、属性はプログラム内で直接使用されないため、属性に対応する変数を定義し、その値を変更または読み取りできるようにする必要があります。コントロール内でのみ使用されるため、private(2)の後に定義します。 (一般に、属性に関連付けられている変数は、FMax など、「F」で始まります) 変数を定義した後、属性を定義します。このプロパティはオブジェクト インスペクター ウィンドウに表示される必要があるため、定義して公開します (3)。定義された構文は次のとおりです。
property <プロパティ名>:<タイプ> read <このプロパティを読み取るときに対応する変数> write <このプロパティを書き込むときに対応する変数またはプロシージャ>
他の変数と属性も同様に定義されます (Min 最小値、Value 現在値など)。次に、スクロール バーのピクチャを設定するためのいくつかのプロパティと変数を定義します (ピクチャ変数は特殊であるため、これについては別途説明します)。 LeftButtonUpPicture (左ボタン画像)、LeftButtonDownPicture (左ボタン押し画像) などを TBitmap タイプとして定義します (対応する変数を定義する必要があります)。
添付のソースプログラムでは、これらの属性を定義するときに、読み取り後に読み取られる属性に対応する変数は F... ですが、書き込み後に指定される属性に対応する変数は Variable ではなく Set のようなものであることに気づいたと思います。 ... これはカスタマイズされたプロセスです。関数としてのプロセスは次のように定義されます。
プロシージャ <プロシージャ名>(値: <設定される属性の値の種類>)
このタイプの属性を記述するときは他の作業を行う必要があるため、変数を使用して処理するだけではなく、プロセスを使用して処理する必要があります。このプロセスは通常、保護された後に定義されます。この種の手続きでは、TBitmap 型の変数には直接値を代入できないため、⑷のようなステートメントを使用します。
これらの TBitmap 型変数のプロパティを定義した後、前述の作成プロセスと破棄プロセスでコードを記述する必要があります。 TBitmap もクラスであるため、作成プロセス (5) で作成し、破棄プロセス (6) で解放 (解放) する必要があります。ここで⑺の継承文は、祖先クラスから処理を継承することを示すために使用します。 (これは落としてはいけません)。
ビジュアル コントロールを作成しているため、コントロール上に絵を描く必要があります。コントロールの祖先クラスである TGraphicControl は Canvas (キャンバス) オブジェクトをカプセル化しており、それを直接使用して画像を描画できます。 Canvas の使用にまだ慣れていない場合は、本を見つけて読むことをお勧めします。
次にやるべきことは絵を描くことです。コントロールに絵を描くにはどうすればよいですか?祖先クラス TGraphicControl には Paint イベントがあり、コントロールを再描画する必要があるときに自動的にトリガーされます。私たちが今しなければならないことは、このイベント用のプログラムを書くことです。まず、保護された後に Canvas オブジェクトを定義します。祖先クラスに既に存在するので、特に説明する必要はありません⑻。このオブジェクトを使用して画像を描画します。次に、ペイント プロセスを定義し、コントロールを描画するコードを記述する必要があります。 public の後に最初に Paint プロセスを定義します。ユーザーによって呼び出されるのではなく、祖先クラスによってトリガーされるため、後でオーバーライドを追加する必要があります。そうしないと、ペイント プロセスが呼び出されないため、コントロールはビジュアル コントロールになりません。次にペイント処理⑽のコードを書いていきます。
この記事に添付されているソース プログラムのペイント プロセス内の T_Height およびその他の変数は、スクロール バーのボタンやスライダーなどのサイズを保存するために使用されます。この部分のプログラムは、通常のアプリケーションのプログラムと大きな違いはありません。ほとんどがキャンバス上で操作するためのもので、誰でも一目で理解できると思います。 FAutoSize 変数の次の判断に注目してください。FAutoSize は、コントロールの AutoSize 属性に関連付けられたブール変数であり、コントロールのサイズが画像のサイズに応じて変更されるかどうかを設定するために使用されます。コントロールのコードでは、通常、プロパティは直接呼び出されず、対応する変数が使用されることに注意してください。
プログラムのこの時点で、ようやく新しいコントロールが表示されましたが、まだスクロールできません。次に、マウスを操作できるようにするマウス イベントを作成しましょう。マウス イベント プロセスの定義は、最後にパラメーターの説明を追加する必要があることを除いて、ペイント プロセスと非常に似ています。マウス イベントは、定義の後に MouseDown、MouseMove、MouseUp の 3 種類に分けられます。次に、そのコードを後ろに書きます。注: ここでのマウス イベントは Mouse... であり、通常の OnMouse... ではありません。しかし、⒀の定義は何に使われるのでしょうか?ここでのイベント定義はすべてユーザー向けです。つまり、コントロールが使用されると、コントロールはオブジェクト インスペクターのイベント ページに表示されます。
これらのマウス イベントのコードも非常に単純で、マウスの座標を決定し、対応する画像をキャンバス上に描画し、同時に対応するイベントをトリガーします。カスタム イベントを呼び出すときは、まず ⒁ などのステートメントを使用して、ユーザーがイベントのコードを作成したかどうかを判断する必要があることに注意してください。これは非常に重要です。そうしないとエラーが発生します。
呼び出されたイベントはすべてカスタマイズされており、定義されたメソッドも非常に単純であることに誰もが気づいていますが、タイプが TNotifyEvent である点が異なります。
TNotifyEvent はデフォルトのイベントで、次のように定義されます。
TNotifyEvent = プロシージャ(送信者: TObject)
別の形式のイベントを定義したい場合は、これを行う必要があります。最初にイベントを記述してから、次のように入力します。
<イベントタイプ名> = プロシージャ(<パラメータ>:<タイプ>)
例えば:
TCustomEvent = プロシージャ(a: 整数; b: 文字列);
次に、public の後に定義します。
<イベント名>:<イベントタイプ名>
例えば:
イベント: TCustomEvent;
これを読んだ後は、手順全体を理解できるはずです。コンパイルエラーや実行エラーが発生した場合は、以下の点を確認してください。
1. 作成プロセスと破棄プロセスに継承されたステートメントはありますか?
2. TBitmap 型の変数が作成され、解放されましたか?
3. プロセスの前にコントロール名がありますか (例: TPighorizontalScroller.MoseMove)
マウスがコントロールに入るのか、コントロールから出るのかを判断する方法:
次のプロセスを定義します。
プロシージャ MouseEnter(var Msg: TMessage); メッセージ CM_MOUSEENTER;
プロシージャ MouseLeave(var Msg: TMessage); メッセージ CM_MOUSELEAVE;