Delphi コンポーネントおよびプロパティ エディター
(1) はじめに
この記事では、例を使用してコンポーネントの開発とプロパティ エディタについて説明します。
例 (TdsWaitDialogEx) は、show メソッドを呼び出した後にダイアログを表示するビジュアル コンポーネントです。
これには、TAnimate、2 つのプロンプト メッセージ (TLabel)、および進行状況バー (TGauge) が含まれています。
列挙型プロパティ: DialogStyle、AViposition
レコードのプロパティ: オプション
プロパティ コレクション オブジェクトは TPersistent から継承します。この例では、AVISource プロパティ コレクションに TAnimate が含まれています。
アニメーション プロパティ CommonAVI、FileName
プロパティ エディターは AVISource の FileName プロパティを使用して適用されます。つまり、編集時に文字列の FileName がポップアップします。
TOpenDialog、そのフィルタリング フィルタは *.avi
(2) コンポーネントパッケージ dsDlgPack.dpk
発行やインストールなどを容易にするために、コンポーネント パッケージ .dpk を使用する必要があります。
Delphi6 以降のバージョン (D5 より前のバージョンは知りません) には、PROxies など、Delphi がリリースしていないファイルがいくつかあります。
コンポーネントのインストール時にこれらのファイルが使用される場合は、これらのファイルをバイパスして、それらが含まれるパッケージを使用できます。
この例では、プロパティ エディターは DesignEditors ファイルを使用し、Proxies ファイルは DesignEditors に必要であるため、このコンポーネントは公開されます。
パッケージ (.dpk) には、プロキシが存在しないという問題を解決する designide が含まれており、コンポーネントのインストールが成功します。
パッケージ dsDlgPack;
...
必要
rtl、
vcl、
VclSmp、
設計する。
含まれています
dsDlgWaitEx 'dsDlgWaitEx.pas' {DlgWaitEx}、
'dsDlgWaitExReg.pas' の dsDlgWaitExReg;
終わり。
(3) コンポーネント登録ファイル dsDlgWaitExReg.pas
質問: なぜこのようなファイルをより頻繁に使用する必要があるのでしょうか?
designide が dsDlgPack.dpk に含まれているにもかかわらず、dsDlgWaitExReg.pas のコードが dsDlgWaitEx.pas にマージされる場合
コンポーネントのインストール時にプロキシが存在しない問題は解決されましたが、アプリケーションがこのコンポーネントを呼び出すときにプロキシが存在しない問題は引き続き発生します。
DesignEditor ではプロキシ ファイルが必要であるため、次のコードは別のファイルに形成され、アプリケーションはこのグループを呼び出します。
このファイルは dsDlgWaitExReg.pas を使用する必要がなく、問題なくプロキシをバイパスできます。
ユニット dsDlgWaitExReg;
インタフェース
クラス、ダイアログ、フォーム、dsDlgWaitEx、DesignIntf、DesignEditors を使用します。
タイプ
TdsAVIFileNameProperty = class(TStringProperty) //プロパティ エディタは DesignEditors ファイルを使用します
公共
function GetAttributes:TPropertyAttributes;override; //メソッドのオーバーライド;
プロシージャ Edit;override; //メソッドのオーバーライド
終わり;
手順 登録;
実装
手順 登録;
始める
//このコンポーネントをDelisoftコンポーネントページに登録します
RegisterComponents('Delisoft', [TdsWaitDialogEx]);
//このプロパティエディタを登録します
RegisterPropertyEditor(TypeInfo(string), TdsAVISource, 'FileName', TdsAVIFileNameProperty);
終わり;
{TdsAVIファイル名プロパティ}
関数 TdsAVIFileNameProperty.GetAttributes:TPropertyAttributes;
始める
結果:=[paDialog];
終わり;
プロシージャ TdsAVIFileNameProperty.Edit;
始める
TOpenDialog.Create(application) を使用して行う
試す
フィルター:='AVI ファイル(*.avi)|*.avi|すべてのファイル(*.*)|*.*';
実行の場合は SetStrValue(FileName);
ついに
無料;
終わり;
終わり;
終わり。
(4) コンポーネントファイル dsDlgWaitEx.pas
ユニット dsDlgWaitEx;
{このコンポーネントのすべてのプロパティとメソッドを定義します。そのうち、TDlgWaitEx 形式のプロパティ BorderStyle は bsDialog です。この例では、コンポーネント TdsDlgWaitEx は TDlgWaitEx 形式を使用し、プロパティ オブジェクト AVISource は TPersistent から直接継承されます。列挙プロパティ (DialogStyle、AVIPosition) やレコード プロパティ (Options) などが使用されます。
}
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、StdCtrls、ゲージ、ComCtrls;
タイプ
TDialogStyle = (dlgNormal, dlgStayOnTop);
TAVIPosition = (aviLeft, aviTop, aviBottom);
TDlgOptions = (showAVI,showCaption,showMessage1,showMessage2,showProgress,ShowProgressText) のセット;
TDlgWaitEx = クラス(TForm)
アニメイト 1: Tアニメイト;
ゲージ1: Tゲージ;
ラベル 1: T ラベル;
ラベル 2: T ラベル;
プロシージャ FormClose(Sender: TObject; var Action: TCloseAction);
プライベート
FCloseAfter: DWord;
FUserFormClose: TCloseEvent;
公共
プロパティ UserFormClose: TCloseEvent 読み取り FUserFormClose 書き込み FUserFormClose;
property CloseAfter: DWORD 読み取り FCloseAfter 書き込み FCloseAfter;
終わり;
TdsAVISource = クラス(TPersistent)
プライベート
FCommonAVI: TCommonAVI;
FFileName: 文字列;
プロシージャ SetCommonAVI(const 値: TCommonAVI);
プロシージャ SetFileName(const 値: string);
保護された
公共
出版された
プロパティ CommonAVI: TCommonAVI 読み取り FCommonAVI 書き込み SetCommonAVI デフォルト aviNone;
property FileName: 文字列読み取り FfileName 書き込み SetFileName;
終わり;
TdsWaitDialogEx=クラス(TComponent)
プライベート
//形状
FDlgForm:TDlgWaitEx;
FMessage1: 文字列;
FMessage2: 文字列;
FMessage1Font:TFont;
FMessage2Font:TFont;
Fキャプション: 文字列;
FDislogStyle:TDialogStyle;
FwordWrap:ブール値;
FOptions:TDlgOptions;
FShowMessage1,FShowMessage2:ブール値;
//AVI
FaviPosition: TAVIPosition;
FAviActive:ブール値;
FshowAVI:ブール値;
FAVISource : TdsAVISource;
//進捗
FProgressMax:整数;
FProgressMin:整数;
FProgressPos:整数;
FProgressStep:整数;
FShowProgress: ブール値;
FShowProgressText: ブール値;
//イベント
FOnPosChange: TNotifyEvent;
FOnShow: TNotifyEvent;
FOnFormHide: TCloseEvent;
プロシージャ SetProgressMax(const 値: 整数);
プロシージャ SetProgressMin(const 値: 整数);
プロシージャ SetProgressPos(const 値: 整数);
プロシージャ SetProgressStep(const 値: 整数);
プロシージャ DrawForm;
関数 setLableHeight(sCaption:string):integer;
プロシージャ setOptions(const value:TDlgOptions);
プロシージャ setMessage1(const 値:文字列);
プロシージャ setMessage2(const 値:文字列);
プロシージャ setCaption(const 値:文字列);
プロシージャ SetMessage1Font(const 値:TFont);
プロシージャ SetMessage2Font(const 値:TFont);
関数 IsMessage1FontStored: ブール値;
関数 IsMessage2FontStored: ブール値;
プロシージャ setAVIPosition(const 値: TAVIPosition);
プロシージャ SetAVISource(const 値: TdsAVISource);
プロシージャ SetOnFormHide(const 値: TCloseEvent);
保護された
プロシージャ DoPosChange ;
プロシージャ DoShow ;
公共
コンストラクター Create(AOwner: TComponent);
デストラクタ オーバーライド;
プロシージャ FormShow;
プロシージャ FormHide;
プロシージャ FormUpdate;
プロシージャ ProgressStepIt;
出版された
//形状
property Message1: 文字列読み取り FMessage1 書き込み setMessage1;
property Message2: 文字列読み取り FMessage2 書き込み setMessage2;
プロパティ Message1Font: TFont 読み取り FMessage1Font 書き込み SetMessage1Font 格納 IsMessage1FontStored;
プロパティ Message2Font: TFont 読み取り FMessage2Font 書き込み SetMessage2Font 格納 IsMessage2FontStored;
property Caption: 文字列 FCaption の読み取り setCaption の書き込み;
プロパティ DislogStyle:TDialogStyle 読み取り FDislogStyle 書き込み FDislogStyle;
プロパティ wordWrap :boolean FwordWrap 読み取り FwordWrap 書き込み;
プロパティ オプション:TDlgOptions 読み取り FOptions 書き込み setOptions;
//AVI
プロパティ AviActive: ブール値読み取り FAviActive 書き込み FAviActive;
property AviPosition: TAVIPosition 読み取り FaviPosition 書き込み setAVIPosition;
プロパティ AviSource: TdsAVISource 読み取り FAVISource 書き込み SetAVISource;
//進捗
property ProgressMax: 整数 読み取り FProgressMax 書き込み SetProgressMax;
property ProgressMin: 整数 読み取り FProgressMin 書き込み SetProgressMin;
プロパティ ProgressPos: 整数 読み取り FProgressPos 書き込み SetProgressPos;
property ProgressStep:integer 読み取り FProgressStep 書き込み SetProgressStep;
//イベント
プロパティ OnPosChange: TNotifyEvent 読み取り FOnPosChange 書き込み FOnPosChange;
プロパティ OnShow: TNotifyEvent 読み取り FOnShow 書き込み FOnShow;
property OnHide: TCloseEvent 読み取り FOnFormHide 書き込み SetOnFormHide;
終わり;
実装
{$R *.DFM}
{TdsAVISソース}
プロシージャ TdsAVISource.SetCommonAVI(const 値: TCommonAVI);
始める
値 = FCommonAVI の場合は終了します。
FCommonAVI := 値;
FfileName:='';
終わり;
プロシージャ TdsAVISource.SetFileName(const 値: string);
始める
値 = FfileName の場合は終了します。
FfileName:=値;
FCommonAVI:=aviNone;
終わり;
{TdsWaitDialogEx}
プロシージャ TdsWaitDialogEx.DoShow;
始める
割り当て済み(FOnShow)の場合はFOnShow(Self);
終わり;
プロシージャ TdsWaitDialogEx.DoPosChange;
始める
Assigned(FOnPosChange) の場合、FOnPosChange(Self);
終わり;
プロシージャ TdsWaitDialogEx.SetAVISource(const 値: TdsAVISource);
始める
FAVISource=value の場合は終了します。
FAVISource.Assign(値);
if (FAVISource.FFileName='')and(FAVISource.FCommonAVI=aviNone) then FshowAVI:=false;
割り当てられている場合(FDlgForm)、
始める
FDlgForm.Animate1.Active:=false;
FDlgForm.Animate1.FileName := '';
FDlgForm.Animate1.CommonAVI := aviNone;
FshowAVI の場合
始める
if FAVISource.FfileName='' then
FDlgForm.Animate1.CommonAVI := FAVISource.FCommonAVI
それ以外
FDlgForm.Animate1.FileName := FAVISource.FfileName;
FDlgForm.Animate1.Active:=true;
終わり;
DrawForm; //Animate1->AVI が変更されると、Animate1 のサイズが変更される可能性があります ==> DrawForm
FDlgForm.Update;
終わり;
終わり;
関数 TdsWaitDialogEx.IsMessage1FontStored: ブール値;
始める
FMessage1Font を使用して行う
結果:=
(名前 <> 'MS Sans Serif') または
(スタイル <> []) または
(サイズ <> 8) または
(カラー <> clWindowText) または
(文字セット <> DEFAULT_CHARSET) または
(ピッチ <> fpDefault);
終わり;
関数 TdsWaitDialogEx.IsMessage2FontStored: ブール値;
始める
FMessage2Font を使用して行う
結果:=
(名前 <> 'MS Sans Serif') または
(スタイル <> []) または
(サイズ <> 8) または
(カラー <> clWindowText) または
(文字セット <> DEFAULT_CHARSET) または
(ピッチ <> fpDefault);
終わり;
プロシージャ TdsWaitDialogEx.SetMessage1Font(const 値: TFont);
始める
FMessage1Font.Assign(値);
割り当てられている場合(FDlgForm)、
始める
FDlgForm.Label1.Font.Assign(値);
FDlgForm.Update;
終わり;
終わり;
プロシージャ TdsWaitDialogEx.SetMessage2Font(const 値: TFont);
始める
FMessage2Font.Assign(値);
割り当てられている場合(FDlgForm)、
始める
FDlgForm.Label2.Font.Assign(値);
FDlgForm.Update;
終わり;
終わり;
プロシージャ TdsWaitDialogEx.setCaption(const 値:文字列);
始める
value=FCaption の場合は終了します。
FCaption:=値;
そうでない場合 (FOOptions の showCaption)
始める
Fキャプション:='';
出口;
終わり;
割り当てられている場合(FDlgForm)、
始める
FDlgForm.Caption := 値;
FDlgForm.update;
終わり;
終わり;
プロシージャ TdsWaitDialogEx.setMessage1(const 値:文字列);
変数 i: 整数;
始める
値が FMessage1 の場合は終了します。
FMessage1:=値;
割り当てられている場合(FDlgForm)、
始める
そうでない場合 (FOptions の showMessage1)、終了します。
FDlgForm.Label1.Caption := 値;
i:=setLableHeight(FMessage1)+13;
i<>FDlgForm.Label1.Height の場合は DrawForm;
FDlgForm.update;
終わり;
終わり;
プロシージャ TdsWaitDialogEx.setMessage2(const 値:文字列);
変数 i: 整数;
始める
値が FMessage2 の場合は終了します。
FMessage2:=値;
割り当てられている場合(FDlgForm)、
始める
そうでない場合 (FOptions の showMessage2)、終了します。
FDlgForm.Label2.Caption := 値;
i:=setLableHeight(FMessage2)+13;
i<>FDlgForm.Label2.Height の場合は DrawForm;
FDlgForm.update;
終わり;
終わり;