1999 年に Delphi を学んで以来、その開発の速さに魅了されてきました。当時、私はプログラミングに触れたばかりで、特にビジュアル開発に興味を持っていました。その理由は、C よりも高速に実装できるためです。ここ数年、delphi C/S から 3 層 B/S まで、大小さまざまなソフトウェアをいくつか書きました。 , このDelphiにはこれだけの機能があると思うのですが、最近「Com Essence」という本を手に入れてVCLのソースコードを勉強したところ、本当に強力であることがわかりました(何て表現すればいいのかわかりません)。 、いくつかのブレークスルーがここでみんなと共有されています。間違いがあれば教えてください。
率直に言えば、コンポーネントにはプロパティとメソッドの 2 種類のメンバーのみが含まれます (ここで話しているメソッドにはイベントが含まれます)。
これは 4 つの部分に分かれています。
プライベート
保護された
公共
出版された
上記の 4 つの部分の意味は、一般的なビジュアル開発書籍で紹介されます。ここでは、Delphi に関連した概要のみを説明します。
プライベート: すべてのプライベート メンバーはここに配置され、サブクラスではなくクラス独自のメソッドによってのみアクセスでき、サブクラスに対して透過的です。ユニット自体のメソッドでのみアクセスできるとも言えます。
protected: サブクラスに継承できることを除いて、残りは private と同じです。部外者はアクセスできません。
public: パブリック。ここで宣言されたプロパティとメソッドはユーザーが呼び出すことができます。
公開済み: Delphi 開発環境のプロパティ バーに表示されます。
まず、最も単純なコントロールを作成してみましょう。5 分以内に、Delphi のコンポーネント パネルのコンポーネントがどのように作成されるかを理解できます。
「新規」->「新規」->「コンポーネント」を選択して Enter キーを押します。
次に、Ancestor type: で継承したい親クラスを選択します。ここでは TComponent を選択します。これは、TComponent のすべてのプロパティとメソッドを継承することを意味します。
クラス名:作成するコンポーネントのクラス名を入力します。 (TShowTextと入力します)
パレット ページ: コンポーネントがインストールされる Delphi のパネル。 (ここでは「サンプル」を選択しますが、新しい名前を入力することもできます)
以下のことは言う必要はありません。
[OK] ボタンをクリックすると、Delphi が TComponent から継承した基本的なコントロールを自動的に生成します。これで、TComponent と同じくらい強力なコントロールが開発されたこともわかりますが、これは私たちが必要とするものではありません。
以下に、コンポーネント自体のプライベート変数の読み取りおよび書き込みメソッドについて説明します。
たとえば、次のような短い段落を書きました。
プライベート
FText: 文字列;
....
/*プライベート変数は外部からの使用が許可されていないため、この FText 文字列変数をどのように操作すればよいでしょうか? */
Published の後に次の段落も追加する必要があります。
property Text: 文字列読み取り FText 書き込み FText;
これが意味するのは、この Text プロパティが delphiSDK のプロパティ バーに表示されるということです。プロパティ バーの Text を変更するユーザーは、実際には FText 文字列変数を変更していることになります。 read は、ユーザーが Text 属性を読み取り、実際に FText を読み取ることを意味します。 Write は、ユーザーが Text に値を割り当て、それを FText 文字列変数に格納することを意味します。
この時点で保存して Delphi にインストールすると、最も基本的なコンポーネントが完成します。 (コンポーネントのインストール方法は最後に紹介します)
ハハ、それは非常に単純ではありませんか?ただ、このコンポーネントには特別な用途がないというだけです。
ここでは属性を紹介しただけですが、メソッドの使用を導入するために関数を追加していきます。
Public の後に以下を追加します。
プロシージャ ShowText();
次に、Ctrl + Alt + C を押すと、システムがいくつかのメソッドの実装コードを自動的に追加します。
次に次のように書いています。
プロシージャ TShowText.ShowText();
始める
ShowMessage(FText);
終わり;
ご覧のとおり、上記の ShowMessage にはクラスのプライベート変数の値が表示されていますが、プライベート変数にはクラス自体のメソッドでのみアクセスできることが理解できたはずです。ここでは、ShowMessage が Dialogs ユニットに含まれているため、使用後に Dialogs ユニットを追加する必要があります。そうしないと通過しません。
もちろん、上記のイベントはコントロール内でのみ使用でき、プロパティ ボックスのイベント バーには表示されません。なぜなら、ここで宣言されたメソッドは純粋なメソッドである Public だけであり、イベントとして宣言されていないからです。
上記の学習を通じて、コントロールのプロパティとメソッドの記述方法と調整方法をすでに理解しましたか?
ただし、実際のコントロールはイベントと切り離すことができず、イベントの呼び出しはメッセージによって駆動される必要があります。これについては次の記事で紹介します。
強力なコントロールのプロパティとメソッドはそれほど簡単ではありません。より多くの練習と応用が必要です。
以下に私が作成した DBGridToExcel コントロールを添付します。このコントロールの機能は、DBGrid 内のデータを Excel にエクスポートすることです。そこから学び、参考にすることができます。このコントロールには、次の記事で説明するプロパティ、メソッド、および「イベント」の使用が含まれます。
付録 1: 自作コントロールのインストール方法:
(1) 「コンポーネント」メニューで「コンポーネントのインストール...」を選択します。
(2) ユニットファイル名の後ろにある「...」をクリックし、「*.pas」コントロールのユニットファイルを選択し、「OK」をクリックします。表示された画面で「インストール」をクリックするとインストールは完了です。
新しくインストールされたコントロールがパネルに表示されます。
添付ファイル 2: TDBGridToExcel コントロールのソース コード全体をメモ帳にコピーし、.pas ファイルとして保存します。
ユニット DBGridToExcel;
{************************************************ * ************************}
{* *}
{* D5 および D6 用の Word VCL コントロールへのグリッドのエクスポート *}
{* Copyright(C) xiangding 2003.10.1 無断複写・転載を禁じます *}
{* バグレポート:[email protected] *}
{* 作者: リトルベア*}
{* *}
{************************************************ * ************************}
{* *}
{* これは簡易バージョンです *}
{* *}
{************************************************ * ************************}
{* *}
{* インストール: *}
{* ファイル GridToExcel.pas として保存してから、ファイルを開いてください *}
{* メニュー項目 [コンポーネント] --> [コンポーネントのインストール] をクリックします *}
{* コンポーネントのインストールダイアログの[インストール]ボタンをクリック*}
{* インストール後、コントロールはコンポーネントにあります *}
{* ページ [サンプル] *}
{* *}
{************************************************ * ************************}
{* *}
{* インストール: *}
{* 添付ファイルを保存し、Delphi で GridToExcel.Pas ファイルを開きます。*}
{* Delphi メニュー --> コンポーネント --> コンポーネントのインストールを選択します。 *}
{* 次に、「インストール」を選択します。インストール後、コントロール パネルの [サンプル] ページで、*}
{* 慣れてきたら、いくつかの複雑な属性を設定して、他の属性を自分で調べてみることができます。 *}
{************************************************ * ************************}
インタフェース
用途
Windows、StdCtrls、ComCtrls、メッセージ、DBGrids、グラフィックス、ExtCtrls、
フォーム、DB、ComObj、コントロール、SysUtils、クラス。
リソース文字列
SPromptExport = 'お待ちください。データはエクスポート中です...';
SConnectExcel = 'Excel を起動しています。しばらくお待ちください...';
SConnectExcelError= 'Excel に接続できませんでした。Excel がインストールされていない可能性があるため、エクスポートできません。';
Sキャンセル = '&キャンセル';
SError = 'エラー';
Sconfirm = 'データのエクスポートを本当に終了しますか? ';
SCaption = '確認';
SGridError = 'データ セットが指定されていません。データ セット コントロールを指定してください。 ';
タイプ
TDBGridToExcel = クラス(TComponent)
プライベート
ProgressForm: TForm;
FShowProgress: ブール値;
ExcelApp : バリアント;
Fタイトル: 文字列;
終了: ブール値;
FOnProgress: TNotifyEvent;
FGrid: TDBGrid {ソース グリッド}
プログレスバー: TProgressBar;
プロンプト: TLabel;
FAutoExit: ブール値;
FAutoSize: ブール値;
FDBGrid: TDBGrid;
プロシージャ SetShowProgress(const 値: ブール値);
プロシージャCreateProgressForm;
プロシージャ ButtonClick(Sender: TObject);
関数 ConnectToExcel: ブール値;
プロシージャExportDBGrid;
{プライベート宣言}
保護された
{ 保護された宣言 }
公共
コンストラクター Create(AOwner: TComponent);
デストラクター Destroy();
プロシージャ ExportToExcel {Excel にグリッドをエクスポート}
{公的宣言}
出版された
{ 公開された宣言 }
プロパティ DBGrid: TDBGrid 読み取り FDBGrid 書き込み FDBGrid;
property Title: 文字列 読み取り FTitle 書き込み FTitle;
property ShowProgress: ブール値読み取り FShowProgress 書き込み SetShowProgress;
プロパティ OnProgress: TNotifyEvent 読み取り FOnProgress 書き込み FOnProgress;
終わり;
手順 登録;
実装
手順 登録;
始める
RegisterComponents('サンプル', [TDBGridToExcel]);
終わり;
{TDBGridToExcel}
プロシージャ TDBGridToExcel.ButtonClick(送信者: TObject);
始める
終了 := MessageBox(ProgressForm.Handle, pchar(Sconfirm), pchar(SCaption),
MB_OKCANCEL + MB_ICONINFORMATION) = IDOK;
終わり;
関数TDBGridToExcel.ConnectToExcel: ブール値;
始める
結果 := true;
試す
ExcelApp := CreateOleObject('Excel.application');
ExcelApp.Visible := False;
if Title<>'' then ExcelApp.Caption := タイトル;
ExcelApp.WorkBooks.Add;
を除外する
MessageBox(GetActiveWindow,PChar(SConnectExcelError),PChar(SError),Mb_OK+MB_IconError);
結果:= false;
終わり;
終わり;
コンストラクター TDBGridToExcel.Create(AOwner: TComponent);
始める
継承された。
FShowProgress := True; {デフォルト値は進行状況を表示}
FAutoExit := False;
FAutoSize := True;
終わり;
プロシージャ TDBGridToExcel.CreateProgressForm;
変数
パネル: TPanel;
ボタン: Tボタン;
始める
Assigned(ProgressForm) の場合は、{Aready Create?} を終了します。
ProgressForm := TForm.Create(Owner);
ProgressForm を使用すると、
始める
Font.Name := '宋体';
フォントサイズ := 10;
BorderStyle := bsNone;
幅:= 280;
高さ:= 120;
境界幅 := 1;
色 := clBackground;
位置 := poOwnerFormCenter;
終わり;
パネル := TPanel.Create(ProgressForm);
with パネル do { パネルの作成 }
始める
親 := ProgressForm;
整列:= alClient;
BevelInner := bvNone;
BevelOuter := bvRaized;
キャプション := '';
終わり;
プロンプト := TLabel.Create(パネル);
プロンプト付きで {ラベルの作成} を実行します
始める
親 := パネル;
左:= 20;
トップ := 25;
キャプション := SConnectExcel;
終わり;
ProgressBar := TProgressBar.Create(パネル);
ProgressBar を使用して {ProgressBar を作成する }
始める
ステップ := 1;
親 := パネル;
スムーズ := true;
左:= 20;
トップ := 50;
高さ:= 18;
幅:= 260;
終わり;
ボタン := TButton.Create(パネル);
with Button do { キャンセルボタンの作成 }
始める
親 := パネル;
左:= 115;
トップ:= 80;
キャプション := Sキャンセル;
OnClick := ButtonClick;
終わり;
ProgressForm.Show;
ProgressForm.Update;
終わり;
デストラクター TDBGridToExcel.Destroy;
始める
継承された。
終わり;
プロシージャ TDBGridToExcel.ExportDBGrid;
変数
データ: TDataSet;
ADBGrid: TDBGrid;
i、j : 整数。
CurrentPoint : ポインタ。
OldBeforeScroll、OldAfterScroll: TDataSetNotifyEvent;
始める
Screen.Cursor := crHourGlass;
試す
試す
TForm(所有者).Enabled := False;
ExcelApp.DisplayAlerts := false;
ExcelApp.ScreenUpdating := false;
終了 := false;
ShowProgress の場合 Prompt.Caption := SPromptExport;
ADBGrid := DBGrid;
データ := ADBGrid.DataSource.DataSet;
ADBGrid を使用して {テーブルヘッダーを挿入}
for i := 1 から Columns.Count do
if Columns[i - 1].Visible then
ExcelApp.Cells[1,i].Value :=Columns[i - 1].Title.Caption;
CurrentPoint := Data.GetBookmark {現在の位置を保存}
OldBeforeScroll := Data.BeforeScroll { 古いスクロール前イベント ハンドルを保存 }
OldAfterScroll := Data.AfterScroll { 古い AfterScroll イベント ハンドルを保存 }
Data.DisableControls { コントロールを無効にする }
Data.BeforeScroll := nil;
Data.AfterScroll := nil;
ShowProgress の場合、ProgressBar.Max := Data.RecordCount;
i := 2;
データファースト;
Data.Eof ではないが、{すべてのレコードを処理}
始める
ADBGrid で do { 1 つのレコードを処理する }
for j := 1 から Columns.Count do
if Columns[j - 1].Visible then
ExcelApp.Cells[i,j].Value := Columns[j - 1].Field.DisplayText;
Inc(i);
データ.次へ;
Assigned(FOnProgress) の場合は FOnProgress(Self);
if ShowProgress then {更新の進行状況 UI }
始める
ProgressBar.StepIt;
Application.ProcessMessages;
Quit の場合は終了します。
終わり;
終わり;
を除外する
MessageBox(GetActiveWindow,PChar(SConnectExcelError),Pchar(SError),MB_OK+MB_ICONERROR);
終わり;
ExcelApp.Visible := False;
TForm(所有者).Enabled := True;
Screen.Cursor := crDefault;
if ShowProgress then FreeAndNil(ProgressForm) { 無料の進行状況フォーム }
ExcelApp.DisplayAlerts := True;
ExcelApp.ScreenUpdating := True;
ついに
Data.BeforeScroll := OldBeforeScroll { 古いイベント ハンドルを復元 }
Data.AfterScroll := OldAfterScroll;
Data.GotoBookmark(CurrentPoint);
Data.FreeBookmark(CurrentPoint);
Data.EnableControls;
Screen.Cursor := crDefault;
終わり;
終わり;
プロシージャ TDBGridToExcel.ExportToExcel;
始める
DBGrid= nil の場合、Exception.Create(SGridError) {データソースがない場合、エラー} が発生します。
if ShowProgress then CreateProgressForm {ProgressForm を表示するかどうか}
ConnectToExcel でない場合は { エラーが発生したら終了 }
始める
if ShowProgress then FreeAndNil(ProgressForm);
出口;
終わり;
ExportDBGrid {データのエクスポートを開始}
終わり;
プロシージャ TDBGridToExcel.SetShowProgress(const 値: Boolean);
始める
FShowProgress := 値;
終わり;
終わり。