9

フォントが Arial Regular 16 に設定されたデフォルトの TLabel の簡単なデモを以下に示します。 ここに画像の説明を入力

ボタンがクリックされたときのコードは次のとおりです。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Font.Style := Label1.Font.Style + [fsItalic];
end;

ボタンをクリックすると、最後の文字が切り捨てられます。つまり:

ここに画像の説明を入力

デフォルトでは、TLAbel.AutoSize は true なので、これで問題ないはずです。これは XE であり、Delphi 7 も同じです。これはバグですか?

4

2 に答える 2

10

最後に余分なスペースを入れると、これを簡単に回避できます。

于 2011-05-26T15:51:39.710 に答える
7

はい、そのように見えます (かなりマイナーなバグですが)。考えられる回避策は次のとおりです。

  • Windows API 関数TextOut(またはDrawText) を使用して自分でテキストを描画し、
  • TStaticText( の代わりに)を使用します。これは、Windows静的コントロール(テキスト モード)TLabelの単なるラッパーです。もちろん、Windows はテキストを正しく描画します。

使用するTextOut

procedure TForm4.FormPaint(Sender: TObject);
const
  S = 'This is a test';
begin
  TextOut(Canvas.Handle,
    10,
    10,
    PChar(S),
    length(S));
end;

TextOut サンプル

静的コントロールの使用 ( TStaticText)

静的対照サンプル

これは Microsoft Windows オペレーティング システムの問題ではなく、VCLTLabelコントロールの問題だと思います。

アップデート

私は試した

procedure TForm4.FormPaint(Sender: TObject);
const
  S = 'This is a test';
var
  r: TRect;
begin
  r.Left := 10;
  r.Top := 10;
  r.Bottom := r.Top + DrawText(Canvas.Handle,
    PChar(S),
    length(S),
    r,
    DT_SINGLELINE or DT_LEFT or DT_CALCRECT);
  DrawText(Canvas.Handle,
    PChar(S),
    length(S),
    r,
    DT_SINGLELINE or DT_LEFT);
end;

結果は次のとおりです。

DrawText サンプル

結局のところ、これは Microsoft Windows オペレーティング システム (または Arial フォント) の問題です。

DT_NOCLIP回避策は、次のフラグを追加することです。

procedure TForm4.FormPaint(Sender: TObject);
const
  S = 'This is a test';
var
  r: TRect;
begin
  r.Left := 10;
  r.Top := 10;
  r.Bottom := r.Top + DrawText(Canvas.Handle,
    PChar(S),
    length(S),
    r,
    DT_SINGLELINE or DT_LEFT or DT_CALCRECT);
  DrawText(Canvas.Handle,
    PChar(S),
    length(S),
    r,
    DT_SINGLELINE or DT_LEFT or DT_NOCLIP);
end;

DT_NOCLIP サンプルを使用した DrawText

更新 2

軽量の修正は

type
  TLabel = class(StdCtrls.TLabel)
  protected
    procedure DoDrawText(var Rect: TRect; Flags: Integer); override;
  end;

...

{ TLabel }

procedure TLabel.DoDrawText(var Rect: TRect; Flags: Integer);
begin
  inherited;
  if (Flags and DT_CALCRECT) <> 0 then
    Rect.Right := Rect.Right + 2;
end;

結果を出す

少し変更したTLabel

(しかし、マジック値(2)をハードコーディングするのは厄介なようです...)

于 2011-05-26T15:51:19.913 に答える