2010-11-22 11 views
3

私はカスタムのDelphiコンポーネントをTGraphicControlから降順に持っています。次のようにそのクラスが宣言されています:カスタムDelphiコンポーネントの再宣言幅プロパティ

TMyLabel = class(TGraphicControl) 
private 
    ... 
protected 
    ... 
public 
    ... 
published 
    property Height; 
    property Width write SetWidth; 
    ... 
end; 

にsetWidthの実装がさらにある:

procedure TMyLabel.SetWidth(const Value: Integer); 
begin 
    if (Value >= 0) and (Value <> Width) 
    then begin 
    inherited Width := Value; 
    // Do some other stuff 
    ... 
    end; 
    MessageDlg('Test', mtInformation, [mbOK], 0); 
end; 

コンポーネントの幅を入力することにより、実行時または設計時にプログラムで変更されたとき、私は現在にsetWidthが呼び出されますオブジェクトインスペクタの対応するフィールドの値。しかし、マウスを使用してデザイン時にコンポーネントのサイズを変更すると、オブジェクトインスペクタの「幅」フィールドは更新されますが、メッセージボックスは表示されないので、SetWidthプロシージャは呼び出されません。

コンポーネントをマウスでサイズ変更しているときにSetWidthを呼び出す必要があるため、Paintプロシージャが(コンポーネントを再描画するだけで)何か他の処理が必要なときを知るためのフラグを設定できます。これを達成する方法はありますか?

+0

+1それは3つの良い補完的な答えをもたらしたので+1。もちろん、それを避けるための間違いのためだけに、それ自身のメリットがあります;-) –

答えて

6

Mason Wheeler's answerはあなたの質問に対する回答ですが、私はあなたに警告したいと思います。

プロパティをオーバーライドすると、「仮想」プロパティを持つことができず、SetWidthも仮想でないため、奇妙な結果が得られます。誰かがクラスの子孫を使ってWidthプロパティを設定している場合、コードは呼び出されません。したがって、私はこの方法でプロパティをオーバーライドすることについて助言します。

var Control: TControl; 
begin 
Control := MyLabel; 
Control.Width := 5000; // TMyLabel.SetWidth is not called!! 

はさらに:Widthプロパティを設定するDeltics explainsような制御の幅を変更する唯一の方法ではありません。 TControl.SetBoundsをオーバーライドする必要があります。

var MyLabel: TMyLabel; 
begin 
MyLabel.SetBounds(0, 0, 100, 100); // TMyLabel.SetWidth nor TControl.SetWidth is called!! 

しかし、コントロールの幅を制限したいようです。次に、その目的のために作成されたTControl.CanResizeを上書きする方がよいでしょう。または、任意の種類のサイズに反応したい場合は、TControl.Resizeを上書きすることをお勧めします。

+0

アドバイスをいただき、ありがとうございます。TControl.Resizeで問題を解決できるはずです。 –

+0

こんにちはラス、私たちの普通の人々がこのサイトに質問を投稿する唯一の理由は、私たちが質問に答える何かを見つけるためにvclソースを掘り下げる時間も技術もないからです。その目的のために、私たちはあなた、賢い人々の専門知識に頼っています。そうでなければ、このサイトは役に立たないでしょう。言って、あなたの尊敬をもって、答えの最後の文を見つけました。ちょっと傲慢で無駄なことはしません。宜しくお願いします。 – user2383818

+0

@ user2383818、あなたは正しいです。私はその文を削除した –

4

あなたが幅を再宣言すると、あなたはを読んで、それのため書き込みか、オブジェクトインスペクタでそれを変更することはできません両方を指定する必要があります。 )(

procedure TMyLabel.GetWidth: Integer; 
begin 
    result := inherited Width; 
end; 
+0

ありがとうございます。しかし、オブジェクトインスペクタでコンポーネントの幅を変更することができます。プロパティ宣言。 –

6

は、私が今確認することはできませんが、IIRC、私はデザイナーがSetBoundsを使用してコントロールのサイズを変更することを疑う:あなたが作品を読ん方法を変更するつもりはない場合は、単にそれをダミー関数を与えますleft、top、width、heightの各プロパティを個別に設定するのではなく、

幸いSetBounds()は仮想ですので、カスタムコントロールクラスでこれを単にオーバーライドすることができます。

関連する問題