コンポーネントを作っています
継承もとのプロパティの変更時に処理をしたいのですが、
再定義時にWriteを使うとうまくいきません
(この機能を使うためのライセンスを..)
どうすれば良いのでしょうか?
継承元はどういうコンポーネントでしょうか。
ライセンス管理している場合、無理なのかもしれません。
property自体はそのままで、元のwriteに書かれているメソッドをオーバーライドしてみてはどうですか?
継承元はTWinControlです
どういうことでしょうか?
継承元のWriteで指定しているメソッドのことですか?
どうやればわかるのでしょう?
TWinControlなら通常はうまくいきます。
どのプロパティを再定義したいのですか?
記述内容も書かれると、コメントしやすいです。
Widthです
property width:integer write SWidth read GWidth;
でも
property width write SWidth read GWidth;
でも無理です
SWidth、GWidthは正確に定義されています
コンポーネントの貼り付け時にエラーが出ます
すみません
あまり変わりませんがHeightもです
私の環境(Delphi7Pro)では、以下の記述でエラーなく貼り付けられます。
type
TTestCtrl = class(TWinControl)
private
{ Private 宣言 }
FOrgWidth: Integer;
procedure SWidth(Value: Integer);
function GWidth: Integer;
protected
{ Protected 宣言 }
public
{ Public 宣言 }
constructor Create(AOwner: TComponent); override;
published
{ Published 宣言 }
property Width: Integer read GWidth write SWidth;
end;
constructor TTestCtrl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FOrgWidth := 100;
end;
procedure TTestCtrl.SWidth(Value: Integer);
begin
FOrgWidth := Value;
end;
function TTestCtrl.GWidth: Integer;
begin
Result := FOrgWidth;
end;
別の場所に問題があるのだと思います。
基本クラスのメソッド名はどうすれば分かるのでしょうか?
ソースかヘルプで確認できます。
ソースが見れません
ヘルプにも載ってません
メソッド名というのは、プロパティ変更時に呼び出される分です
> ソースが見れません
なぜ?
personal でも *.int ファイルがあるはず。
これを見れないなら、コンポーネントを作るなんて無理です。
intと言う拡張子が付いたファイルはどこにあるんですか?
それから、にしのさんのソースではプロパティと大きさがバラバラです
>intと言う拡張子が付いたファイルはどこにあるんですか?
検索時に「.」をいれてませんでした
見つかりました
> intと言う拡張子が付いたファイルはどこにあるんですか?
Doc ですよ。
property Width: Integer;
とあるんですが・・・
> intと言う拡張子が付いたファイルはどこにあるんですか?
ML の記事参照
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=072937
> にしのさんのソースではプロパティと大きさがバラバラです
実際にしたいことが分からないので、コンパイルできるかどうかを示したのでは?
Width や Height プロパティーの変更時に何をしたいのか分かれば別の解決方法
もあるかもしれません。
個人的には、TWinControl のような基本クラスから派生したコンポーネントを
つくる理由の方に興味があります。簡単ではないですよ。
この種類のファイルにはreadとかwriteが書いてないですね
> property Width: Integer;
>
> とあるんですが・・・
TWinControl の Height と Width プロパティーは、派生もとの TControl から
受け継いだものです。上記の記述は可視性を変更しているのです。
うーむ、コンポーネントをつくるまえに、クラスについて勉強することを勧めます。
私はバージョン情報等のボタンに
MoneyGreenの平らなPanelに同じサイズのFlatなSpeedButtonをのせています
これをコンポにしたいのです
TWinControlから派生したのは単にPanelのParentにするだけだからです
>TWinControl の Height と Width プロパティーは、派生もとの TControl から
>受け継いだものです。上記の記述は可視性を変更しているのです。
私はTWinControlではなくTWinControlの継承元のTControlの内容を見たのですが?
> にしのさんのソースではプロパティと大きさがバラバラです
大きさって元のWidthのことですか?
もともとあるWidthを使用していないのだから、違うのは当たり前です。
Widthは元からあるので、再定義すると言うことはそういうことです。
大きさをそろえたいのであれば、SWidthでどうにかすべきでしょう。
単純なソースを載せたまでですので。
# 細かいところは、るるとん@K さんが開示していないので誰にも解らないでしょう
わたしだったら TPanel から派生しますが。
コンストラクタを override するだけのような気がします。
> MoneyGreenの平らなPanelに同じサイズのFlatなSpeedButtonをのせています
「同じサイズのFlatなSpeedButtonをのせ」るのはどうしてですか?
パネルだけでは何ができなのですか?
もしかして、Width変更時に何かしたいということですか?
そうであれば、わざわざプロパティを変更しなくても、WM_WINDOWPOSCHANGEDが飛んできたときにWidth, Heightを処理してやればよいかと。
# メッセージがあふれないように注意です。
>TWinControl の Height と Width プロパティーは、派生もとの TControl から
>受け継いだものです。上記の記述は可視性を変更しているのです。
TWinControlではWidthの可視性は変更されていません
>「同じサイズのFlatなSpeedButtonをのせ」るのはどうしてですか?
>パネルだけでは何ができなのですか?
Flatなボタンはマウスオーバー時に変化します
BevelOuterを使えば出来るんでしょうか?
>BevelOuterを使えば出来るんでしょうか?
なんか文字の位置もズレルみたいです
>わたしだったら TPanel から派生しますが。
必要なプロパティがColorとCaption、大きさ、位置のみだからです
> 必要なプロパティがColorとCaption、大きさ、位置のみだからです
それならば、選択肢としてはTCustomPanelとなるのでは?
> TWinControlではWidthの可視性は変更されていません
それは失礼しました。*.int や *.pas が見れるといろんなことがわかりま
すよね。Grep するともっといろんなことがわかりますよ。
> 上記の記述は可視性を変更しているのです。
これは、ちゃんとした宣言部は上位クラスにありますよ、という意味です。
Width や Height を変更したとき、やりたいことは上にのせた SpeedButton の
サイズを変更したいからでしょうね。
はじめから、具体的な事柄について質問すると、まわりくどいやりとりをしなくて
すみます。まぁ、今回はソースを読めるようになったし、可視性の変更について
知ったことですし、収穫はおおきいでしょう。このような掲示板形式のQ&Aでも
人間同士がやりとりしているのですから、ちゃんと途中経過を報告しながら
やりとりすることは大切だと思いますよ。ソースはどこ? ということについて
いきなり
> property Width: Integer;
>
> とあるんですが・・・
では、通りすがりさんのレスへの答えになってないと思います。
ツイート | ![]() |