視覚コンポーネントは実際にクラスを書くには、 *.pasファイルに直接書き込むことができます。ただし、コントロールを作成するには、パッケージを使用する必要があります。ファイルメニューから新しいパッケージを作成します。これは、コントロールを保存およびインストールするために使用されます。次に、パッケージウィンドウの[追加]ボタンをクリックして、コンポーネント(ユニット)を追加します。
[ポップアップ]ダイアログボックスの上部にある新しいコンポーネントを選択します。コントロールのすべての属性、方法、およびイベントを単独で構成することはできないため、祖先クラス(または「親クラス」または「ベースクラス」)を選択してから、独自の属性、メソッド、イベントを追加する必要があります。 。祖先タイプの後、ドロップダウンボックスで目的の祖先クラスを選択します。視覚的なコントロールを書くことで絵を描く必要があるため、TgraphicControlは祖先クラスとして選択されます。次に、通常は「T」で始まるクラス名ボックスに新しいコントロール(クラス)の名前を入力します。パレットページは、「標準」など、Delphiウィンドウの新しいコントロールのコントロールページ名を選択するために使用されます。ユニットファイル名に新しいコントロールファイルのパスとファイル名を追加し、[OK]ボタンをクリックします。新しいコントロールが追加されています。これで、このコントロールのコードを作成できます。
以下は、画像をカスタマイズして視覚的なコントロールの書き方を説明できるスクロールバーを書く例です。
上記の方法に従って、祖先クラスとしてtgraphicControlを選択し、新しいコントロールの名前はtpighorizontalscroller(Pig Horizontal Scrollbar)です。ファイルパスとファイル名を選択したら、[OK]ボタンをクリックしてコードの書き込みを開始します。
各コントロールが作成および削除されるため、最初にこれら2つのプロセスを記述する必要があります。コントロール内の各プロセスについて、最初に定義し、次に後で記述する必要があります。定義されているプロセスまたは属性には3種類があります。
1.プライベート後に定義されたものは、コントロールに内部的に使用され、コントロールを使用する人はそれを見ることができません。
2。保護された後に定義されるものは一般的に見えず、他の人が他のコントロールを書くために祖先クラスとしてコントロールを使用している場合にのみ見ることができます。
3.他の人だけが公開された後、プログラムで呼び出されることができます。
4.公開後に定義されたものは、プロパティウィンドウ(Object Inspector)で見ることができます。作成と削除プロセスは、プログラミングプロセス中にコントロールが作成されたときに自動的に実行されるだけでなく、プログラムの実行中にコントロールが動的に作成されたときに呼び出される可能性があるため、public -public -fisted offeredが定義されます。 (このシーケンス番号は、添付のソースプログラムのコードの位置を示しています。以下と同じです)今、これら2つのプロセスで何を書くべきか、どのように編集するかわからないかもしれません。以下で説明します。
まず、このコントロールにいくつかのプロパティを追加しましょう。 Maxプロパティを定義して、Scrollbarの最大値を設定または読み取ります。属性はプログラムで直接使用されていないため、その値を変更または読み取りしながら、属性に対応する変数を定義する必要があります。コントロール内でのみ使用されるため、プライベートの後に定義します。 (一般に、属性に関連付けられた変数は、fmaxなどの「f」から始まります)変数を定義した後、属性を定義します。このプロパティは、Object Inspectorウィンドウに表示できるようにする必要があるため、定義して⑶の後に公開します。定義された構文は次のとおりです。
プロパティ<プロパティ名>:<Type>このプロパティを読むときに<レスポンシブ変数を読む>このプロパティを作成するときのレスポンシブ変数またはプロセス>
他の変数と属性も同様に定義されます(最小値、値の現在の値など)。以下に、Scrollbar画像を設定するためのいくつかの属性と変数を定義します(画像変数が特別なため、それらについて個別に説明します)。 leftbuttonuppicture(左ボタン画像)、leftbuttonownpicture(左ボタンを押す写真)などをtbitmapタイプとして定義します(対応する変数を定義する必要があります)。
添付のソースプログラムでは、これらのプロパティを定義する際に、読み取り後に指定されたプロパティを読み取るときに対応する変数がf ...、および執筆後に指定されたプロパティを書き込むときの対応する変数は変数ではなく、ようなものであることに気付いた必要があります。セット…、それはカスタムプロセスです。この関数としてのプロセスは、次のように定義されます。
手順<プロセス名>(値:<セットプロパティの値のタイプ>)
このクラスの属性を書くときに他のことを行う必要があるため、1つの変数だけで処理することはできませんが、プロセスで処理する必要があります。このプロセスは、一般に保護された後に定義されます。このクラスプロセスでは、このタイプの変数を直接割り当てることができないために採用されるタイプtbitmapの変数に値を割り当てるために、このようなステートメントを⑷で使用します。
これらのTBITMAPタイプ変数のプロパティを定義した後、コードは作成プロセスの作成に記述し、上記のプロセスを破壊する必要があります。 Tbitmapはクラスでもあるため、作成プロセス⑸で作成する必要があり、Destroyプロセス中に無料をリリースする必要があります。ここで言及されている継承された声明は、プロセスが祖先クラスから継承されていることを示すために使用されます。 (これはドロップしてはいけません)。
視覚的なコントロールを書くため、コントロールに写真を描く必要があります。私たちのコントロールの祖先クラスであるtgraphicControlは、キャンバスオブジェクトをカプセル化します。これは、写真を描くために直接使用できます。キャンバスの使用に慣れていない場合は、それを読むために本を見つけるのが最善です。
次の仕事は写真を描くことです。コントロールに写真を描く方法は?先祖クラスのtgraphicControlには、塗装イベントがあります。これは、コントロールを塗り直す必要があるときに自動的にトリガーされます。私たちが今しなければならないことは、このイベントのプログラムを書くことです。まず、保護された後にキャンバスオブジェクトを定義します。すでに祖先クラスにあるため、説明を追加する必要はありません⑻。このオブジェクトを使用して描画します。次に、ペイントプロセスを定義し、コントロールを描画するコードを作成する必要があります。まず、公共の場でペイントプロセスを定義します。祖先クラスによってトリガーされているため、ユーザーによってではなくトリガーされるため、その後オーバーライドを追加する必要があります。そうしないと、ペイント手順が呼び出されないため、コントロールは視覚的なコントロールになりません。ペイントプロセスのコードを書きましょう。
この記事に添付されたソースプログラムのペイントプロセスのT_Heightなどの変数は、ボタン、スライダーなどのサイズを保存するために使用されます。 、そのほとんどは正しいです私は誰もが一目でキャンバスの操作を理解すると信じています。容器化変数に関する次の判断があることは注目に値します⑾
Fautosizeは、コントロールの自動化に関連するブール変数です。制御コードでは、属性は直接呼び出されませんが、対応する変数が使用されることに注意してください。
ここにプログラムが編集された後、最終的に新しいコントロールを探していたとしても、スクロールできません。それでは、マウスイベントを操作できるようにしましょう。マウスイベントプロセスの定義は、パラメーターの説明を後で追加することを除いて、ペイントプロセスと非常に似ています。
マウスのイベントは、ムーズダウン、マウスムーブ、マウスアップに分割され、定義の後にオーバーライドを追加する必要があります。次に、後でコードを書きます。注:ここのマウスイベントはマウスです…通常のオンマウスではありません…。しかし、⒀の定義は何ですか?ここでのイベント定義はすべてユーザーが使用できる、つまり、このコントロールを使用する場合、オブジェクトインスペクターのイベントページに表示されます。
これらのマウスイベントのコードも非常に簡単です。マウスの座標を判断し、対応する絵をキャンバスなどに描画し、同時に対応するイベントをトリガーできます。カスタムイベントを呼び出すとき、最初にそのようなステートメントを使用して、ユーザーがイベントのコードを作成しているかどうかを判断する必要があることに注意してください。これは非常に重要です。そうしないと、コールでエラーが発生します。
誰もが現在呼ばれるイベントがすべてカスタマイズされており、定義方法は非常に単純であり、定義属性に似ていますが、入力するとtnotifyeventです。
tnotifyeventはデフォルトのイベントであり、次のように定義されています。
tnotifyevent = procedure(sender:tobject)
別の形式のイベントを定義したい場合は、これを行う必要があります。
<イベントタイプ名> =手順(<パラメーター>:<タイプ>)
例えば:
tcustomevent = procedure(a:integer; b:string);
次に、公開定義の後:
<イベント名>:<イベントタイプ名>
例えば:
jevent:tcustomevent;
これらを読んだ後、プログラム全体を理解する必要があります。編集または操作にエラーがある場合は、次のポイントを確認してください。
1.作成および破壊プロセスに継承されたステートメントがあるかどうか。
2。tbitmapタイプの作成と無料の変数が作成されるか無料であるか。
3。プロセスの前にコントロール名はありますか?たとえば:tpighorizontalscroller.mosemove
マウスがコントロールに入るのか離れるかを判断する方法:
次のプロセスを定義します。
手順Mouseenter(var msg:tmessage);
手順mouseleave(var msg:tmessage);
以下にコードを書くだけです!
この方法は、3つの状態のボタンを作成するのに非常に役立ちます!