掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
親コンポーネント上にある子コンポーネント間の変化を相互に反映させ合うには? (ID:33017)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>これをもとに、コンポーネントのサイズを変えたときに、トラックバーとエディット もちろんこの方法でいいのですが,また別の方法も書いておきますね. 内部で使用するコンポーネントのクラスを定義して使用する方法です. この方法は,内部のコンポーネントに対して細かい制御が必要となった場合に有効です. 詳しい説明は省略しますが,テストするのであれば以下の手順がいいでしょう. 1. コンポーネントのコードをバスの通った(とりあえずテスト用のプロジェクト等)に置く 2. テスト用のプロジェクトを作成.コンポはこのテスト用プログラムで生成する. usesにplPanelTrackBarEditを追加します ビジュアルなコンポのテストは,実行時に生成するといいです. コンポーネントの再インストールが必要ありません.もちろん,設計時のデザイン テストの場合は再インストールが必要です. ----- コンポのコード plPanelTrackBarEdit.pasで保存する -------- unit plPanelTrackBarEdit; interface uses SysUtils, Classes, Controls, ExtCtrls, StdCtrls, ComCtrls, Graphics; type //前方参照 //TplTracBarとTplEditSPはコードでは後方で定義しているため,そのままでは参照 //できない TplTrackBar = class; TplEditSP = class; TplPanelTrackBarEdit = class(TPanel) private { Private 宣言 } FTrackBar : TplTrackBar; FEdit : TplEditSP; protected { Protected 宣言 } procedure SetParent(AParent: TWinControl); override; public { Public 宣言 } constructor Create( AOwner: TComponent); override; destructor Destroy; override; property TrackBar : TplTrackBar read FTrackBar write FTrackBar; property Edit : TplEditSP read FEdit write FEdit; published { Published 宣言 } end; //内部コントロールのTTrackBar //TplPanelTrackBarEditのプロパティ等を利用可能にするためにプロパティを定義 TplTrackBar = class(TTrackBar) private FPanelTrackBarEdit : TplPanelTrackBarEdit; protected procedure Changed; override; public property PanelTrackBarEdit : TplPanelTrackBarEdit read FPanelTrackBarEdit; end; //内部コントロールのTEdit //TplPanelTrackBarEditのプロパティ等を利用可能にするためにプロパティを定義 TplEditSP = class(TCustomEdit) private FPanelTrackBarEdit : TplPanelTrackBarEdit; protected procedure Change; override; procedure DoEnter; override; procedure KeyPress(var Key: Char); override; public property PanelTrackBarEdit : TplPanelTrackBarEdit read FPanelTrackBarEdit; end; procedure Register; implementation uses DebugWndUnit; procedure Register; begin RegisterComponents('plXRAY', [TplPanelTrackBarEdit]); end; { TplTrackBarEdit } //============================================================================= // コンポのCreate処理 // ビジュアルな内部コンポーネントはSetParentで生成する // 非ビジュアルな内部コンポーネントはCreateで生成してよい //============================================================================= constructor TplPanelTrackBarEdit.Create(AOwner: TComponent); begin inherited; Caption := ''; Width := 250; Height := 85; Color := $00AFBBA6; //Delphi6以降でXPManを使用する場合はこれがないとTPanelのColorプロパティ //の設定が反映されない Self.ParentBackground := False; end; //============================================================================= // コンポのDestroy処理 // 内部コンポーネントを解放する //============================================================================= destructor TplPanelTrackBarEdit.Destroy; begin if Assigned(FTrackBar) then FreeAndNil(FTrackBar); if Assigned(FEdit) then FreeAndNil(FEdit); inherited; end; //============================================================================= // コンポのSetParent処理 // ビジュアルな内部コンポーネントはSetParentで生成する // SetParentメソッドは何回も呼出されるので注意 //============================================================================= procedure TplPanelTrackBarEdit.SetParent(AParent: TWinControl); begin inherited; //コンポ破棄の時もSetParentは呼ばれるため,Parentが無い場合は処理をしない if AParent = nil then exit; Caption := ''; if not Assigned(FTrackBar) then begin FTrackBar := TplTrackBar.Create(Self); FTrackBar.Parent := Self; FTrackBar.Left := 10; FTrackBar.Top := 10; FTrackBar.Height := 35; FTrackBar.Width := Self.Width-FTrackBar.Left-10; FTrackBar.Min := 0; FTrackBar.Max := 100; FTrackBar.Frequency := 10; FTrackBar.TickStyle := tsNone; FTrackBar.FPanelTrackBarEdit := Self; end; if not Assigned(FEdit) then begin FEdit := TplEditSP.Create(Self); FEdit.Parent := Self; FEdit.Left := FTrackBar.Left+5; FEdit.Top := FTrackBar.Top+FTrackBar.Height+3; FEdit.Width := 45; FEdit.FPanelTrackBarEdit := Self; end; FEdit.SetFocus; end; { TplTrackBar } //============================================================================= // TTrackBarコンポ内部でのOnChageイベント処理 // ChangedメソッドをOverrideして作成しておくと自動的にこのメソッドが呼ばれる //============================================================================= procedure TplTrackBar.Changed; begin inherited; FPanelTrackBarEdit.FEdit.Text:= IntTostr(Self.Position); end; { TplEditSP } //============================================================================= // TEditコンポ内部でのOnChageイベント処理 // ChangeメソッドをOverrideして作成しておくと自動的にこのメソッドが呼ばれる //============================================================================= procedure TplEditSP.Change; begin inherited; FPanelTrackBarEdit.FTrackBar.Position := StrToIntDef(FPanelTrackBarEdit.FEdit.Text,0); end; //============================================================================= // TEditコンポ内部でのOnEnterイベント処理 // DoEnterメソッドをOverrideして作成しておくと自動的にこのメソッドが呼ばれる //============================================================================= procedure TplEditSP.DoEnter; begin inherited; //かな漢字入力を不可にしてしまう SetImeMode(Handle,imDisable); end; //============================================================================= // TEditコンポ内部でのOnKeyPressイベント処理 // KeyPressメソッドをOverrideして作成しておくと自動的にこのメソッドが呼ばれる // KeyPressは継承元のTWindControl.pasで定義されている //============================================================================= procedure TplEditSP.KeyPress(var Key: Char); begin //数値以外は入力させない //英字は入力できない. #8は[BackSpace]. #27は[Escape] if ((Key>='0') and (Key<='9')) or (Key=#8) or (Key=#27) then begin inherited KeyPress(Key); end else begin Key:=#0; end; end; end. ------ テストプログラムのコード //============================================================================= // 開発中のコンポーネントをフォーム表示開始で生成 // ビジュアルなコンポーネントは,概観を変更すると再インストールが必要になる // 実行時のテストであれば,実行時に生成してテストすると再インストールが不要 // ただし,設計時の外観変更は再インストールが必要 //============================================================================= procedure TForm1.FormShow(Sender: TObject); var APanelTrackBarEdit : TplPanelTrackBarEdit; begin APanelTrackBarEdit := TplPanelTrackBarEdit.Create(Self); APanelTrackBarEdit.Parent := Self; APanelTrackBarEdit.Top := 20; APanelTrackBarEdit.Left := 20; end; >コンポーネント開発について学習を始めました。 ということですので,ついでに. コンポーネント本体の名前,また内部で生成するコントロールやクラス名には 極力ユニークな名前をつけるといいです. これは他のユニットを使用した時に名前の衝突を避けるためです. 私はプリフィックスとして先頭にplを付けています.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.