2

TLabel から継承されたコンポーネントを Delphi で作成しようとしており、TLabel.Paint にいくつかのカスタム グラフィックが追加されています。グラフィックをテキストの左側に配置したいので、GetClientRect をオーバーライドしました。

function TMyComponent.GetClientRect: TRect;
begin
  result := inherited GetClientRect;
  result.Left := 20;
end;

このソリューションには、解決したい大きな問題があります。コントロールの「グラフィック領域」をクリックすることはできず、ラベル領域のみをクリックすることはできません。キャプションが空の文字列の場合、デザイナーでコンポーネントをクリックしても選択できません。何か案は?

4

2 に答える 2

4

最初の言い訳-私の悪い英語のために。
コンポーネントのClientRectを変更するのは良い考えではないと思います。このプロパティは多くの内部メソッドおよび手順で使用されるため、そのコンポーネントの機能/操作を誤って変更する可能性があります。

ポイントを変更してテキストを書き込むことができ(たとえば、DoDrawTextプロシージャでは20ピクセル)、コンポーネントはグラフィック領域のイベントに応答できると思います。

procedure TGrlabel.DoDrawText(var Rect: TRect; Flags: Integer);
begin
  Rect.Left := 20;
  inherited;
end;

procedure TGrlabel.Paint;
begin
  inherited;

  Canvas.Brush.Color := clRed;
  Canvas.Pen.Color := clRed;
  Canvas.pen.Width := 3;
  Canvas.MoveTo(5,5);
  Canvas.LineTo(15,8);

end;
于 2008-09-25T16:16:30.120 に答える
0

このコンポーネントで実行する必要があるTLabelから取得しているメソッド/機能は何ですか?

(たとえば、TImage)の子孫を作成し、そのペイントメソッドの一部としてテキストを描画する方がよいでしょうか。

それが本当にTLabelの子孫である必要がある場合(これに伴うすべてのことを含む)、キャプションが空のときにTLabelにこの問題が発生しないので、この設計時の問題に悩まされると思います。

私はあなたが得る他の答えに興味があります!:-)

于 2008-09-25T15:53:58.847 に答える