子コンポーネントが本来持っていないプロパティを付け加えるには?

解決


ing  2009-01-19 16:00:10  No: 33163

コンポーネントについて学習を始めたところです。

まず、親子関係なしで、トラックバーだけでやってみました。
トラックバーのスライダーが動くところにある選択領域の表示/非表示をさせるためのプロパティを付け加えたところ、できました。
次に、TPanelの上にTTrackBarを置き、同様に選択領域の表示/非表示ができるか、やってみました。
できませんでした。

自身のときの方法を、親子で用いてもだめなのでしょうか。
どのようにすれば実現できるのでしょうか。

教えてください。

以下がそのソースです。
-------------------------------------
unit PanelTrackBarEx02;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls,ComCtrls,StdCtrls,
  CommCtrl;

type
  TPanelTrackBarEx02 = class(TPanel)
  private
    { Private 宣言 }
    FTrackBar: TTrackBar;
    FTrackBarSelectRange: Boolean;
    procedure SetTrackBarSelectRange(const Value: Boolean);
  protected
    { Protected 宣言 }
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { Public 宣言 }
    constructor Create( AOwner: TComponent); override;
  published
    { Published 宣言 }
    property TrackBarSelectRange: Boolean read FTrackBarSelectRange write SetTrackBarSelectRange;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TPanelTrackBarEx02]);
end;

constructor TPanelTrackBarEx02.Create( AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTrackBar:= TTrackBar.Create(self);
  FTrackBar.Parent:= self;
end;

procedure TPanelTrackBarEx02.SetTrackBarSelectRange(const Value: Boolean);
begin
  FTrackBarSelectRange:= Value;
  ReCreateWnd;
end;

procedure TPanelTrackBarEx02.CreateParams(var Params: TCreateParams);
begin
  inherited;
  if not TrackBarSelectRange=true then
    Params.Style:= Params.Style and not TBS_ENABLESELRANGE;
end;

end.
---------------------


KHE00221  2009-01-19 17:27:53  No: 33164

procedure TPanelTrackBarEx02.CreateParams(var Params: TCreateParams);
begin
  inherited;
  if not TrackBarSelectRange=true then
    Params.Style:= Params.Style and not TBS_ENABLESELRANGE;
end;

だと TPanelTrackBarEx02 の Params.Style を変更させているから
当然 TTrackBar の Param.Style は変更されないから

>次に、TPanelの上にTTrackBarを置き、同様に選択領域の表示/非表示ができるか、やってみました。
>できませんでした。

になる

>まず、親子関係なしで、トラックバーだけでやってみました。
>トラックバーのスライダーが動くところにある選択領域の表示/非表示をさ>せるためのプロパティを付け加えたところ、できました。

でできたやつを TPanelTrackBarEx02  の上に乗せれば できる。


ing  2009-01-20 06:06:45  No: 33165

KHE00221 さん
お答え、感謝します。

つまり、KHE00221 さんの言われるのは、
子コンポーネントに、本来持っていないプロパティを付け加え、
そのプロパティによって、子コンポーネントに影響を与えることはできない。
そのため、
あらかじめコンポーネントにプロパティを付け加え、影響が与えられるコンポーネントを作っておいてから、親コンポーネントの上に、子コンポーネントとして乗せる方法を取らざるを得ない、ということなのですね。

そうですか。
想像以上にコンポーネント開発は難しいようです。

KHE00221 さんの言われるとおり、やってみます。
ありがとうございました。


そう?  2009-01-20 08:19:31  No: 33166

>想像以上にコンポーネント開発は難しいようです。
そんなことないよ。
クラスとコンポーネントを混同してるみたいだね。
CreateParamsは、TTrackBarクラスのメソッドであって、
TPanelTrackBarEx02クラスのメソッドではないということだよ。


ing  2009-01-20 14:30:27  No: 33167

そう?  さん
お答え、感謝します。

当方、初心者のため、クラスやコンポーネントなどの理解がよくできておりません。
お手数、おかけします。
お世話になります。

つまり、
CreateParamsを、TPanelTrackBarEx02クラスのメソッドにすればいい、
ということでしょうか。
具体的に、コードを書いていただけないでしょうか。
よろしくお願いします。


笑顔が命  2009-01-20 21:39:56  No: 33168

>CreateParamsを、TPanelTrackBarEx02クラスのメソッドにすればいい、
>ということでしょうか。

≪民宿ダイヤモンド・ヘッド≫
真琴:「この人ホントに分かってないよ、それに、コードを書いてナンて甘えて…」
春子:「確かに分かってないね^^; このコンポのコードはこんなカンジに書かなくちゃネ」

type
  TTrackBar = class(ComCtrls.TTrackBar)
  protected
    // CreateParamsは、TTrackBarのメソッド
    procedure CreateParams(var Params: TCreateParams); override;
  end;

  TPanelTrackBar02 = class(TPanel)
  private
    FTrackBar: TTrackBar;  // このTTrackBarは、上で宣言したクラス
    ..............
  end;

procedure Register;

implementation

// CreateParamsは、TTrackBarのメソッド
procedure TTrackBar.CreateParams(var Params: TCreateParams);
begin
  inherited;
  if not TPanelTrackBar02(Parent).TrackBarSelectRange = True then
    Params.Style:= Params.Style and not TBS_ENABLESELRANGE;
end;

constructor TPanelTrackBar02.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTrackBar := TTrackBar.Create(Self);
  with FTrackBar do begin
   Parent := Self;
   Top := Self.Top + 1;
   Left := Self.Left + 1;
   Height := Self.Height - 2;
  end;
end;
.........

真琴:「ふ〜ん、コードも書いてあげるなんて、いつも優しいのね? ハルコさんって」
春子:「ん? どうした? マコト、今日は珍しくご機嫌ナナメだね、マコトらしくないよ」
真琴:「だぁって、ユウコったらヒドイんだもの、アタマきちゃう」
春子:「学校でユウコちゃんとケンカしたの? それが不機嫌の原因かぁ…、ねぇ、今日もお客様来てるンでしょ?」
真琴:「そう、サーファーのお客様が三人…」
春子:「だったら、ほら、スマイル、スマイル^^ 民宿の看板娘は"笑顔が命"だヨ」
真琴:「うん、じゃスマイル…こう?^へ^;」
春子:「ダメダメ、それじゃ笑顔がヒキツッテルって^^;」
真琴:「じゃぁ…、こう?^v^」
春子:「まだワザとらしいけどね^^; いつものカワイイ笑顔を…、そうそう、それよ」

≪富士子のアパート≫
富士子:「え? お金が欲しい? 毎月お小遣いあげてるでしょ?」
広海  :「あれだけじゃ、毎日の食材買うだけで消えちゃうよ、新しい靴を買いたいの、ボロだから」
富士子:「ねぇ、ヒロミ、ナンで"ヒモ"なわけ? もうチョット人生考えた方がイイんじゃない?」
広海  :「フジコがそう言ったンじゃん、"ヒモ"になれって…、忘れちゃった?」
富士子:「そう、確かにアタシがそう言った…」
広海  :「だよね?」
富士子:「だけどね、それは水泳の五輪候補のカッコいいヒロミを口説くための口からデマカセよ、まさかホントの"ヒモ"になるなんて…」
広海  :「でも"イイ買い物"だったンじゃないの? 自分専用の"優秀なシェフ"をこんな安く雇えて」
富士子:「ま、そういう考え方もあるけど…、じゃ、今夜はトビッきり美味しいモノ作ってよ?」
広海  :「だったら、モットお金…、美味しいもの作るには、それなりのイイ食材買わなきゃ」
富士子:「分かったわよ、ハイこれだけあればイイでしょ?」
広海  :「どうも^^…、じゃ、仕事ガンバッテ、行ってらっしゃ〜い^^」
富士子:「もし夕食がマズかったら、ホントに追い出すから(--;」
広海  :「そんなブス顔しないで、タレントだけじゃなく、スタイリストも"笑顔が命"、ハイ、笑顔、笑顔^^」


ing  2009-01-21 06:05:39  No: 33169

笑顔が命  さん
初心者のトンチンカンな質問にもかかわらず、丁寧に説明していただき、感謝しております。

書き換えなくてはならないところが何十行もあるのだろうと想像していました。
それが、わずか数行ですむなんて。
Delphi  は奥が深いです。

コンポーネントをコンパイルしてみて、予想以上の動作をしています。
すばらしいです。
感動しています。

本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加