1

DelphiXE。

ボタン付き編集(左ボタン付き)、ボタンの画像を含む画像リストがあります。すべてがフレーム上にあります(フォーム上であれば問題ありません)。

デザイン時にボタンのインデントはありませんが、実行時にあります。

バグですか?

ここに画像の説明を入力してください ここに画像の説明を入力してください

ありがとう!

4

1 に答える 1

7

はい、バグです。何らかの理由で、編集がフレーム内にある場合、 のCtl3DプロパティがTButtonEdit.dfm ファイルから正しくストリーミングされません。ストリーミングの結果、代わりCtl3Dに. FalseTrue

次に、TEditButton.UpdateBounds次のコードが実行されます。

if (not FEditControl.Ctl3D) and (FEditControl.BorderStyle <> bsNone) then
begin
  FGlyph.Top := 2;
  Inc(NewLeft, 2);
end;

これは、ボタンの位置を 2 ピクセル右と下にシフトしているものです。

コードで Ctl3D を手動で設定し、強制的に再度呼び出すことで、バグを回避できますUpdateBounds。私はこれをインターポーザーで行いました:

type
  TButtonedEdit = class(ExtCtrls.TButtonedEdit)
  protected
    procedure Loaded; override;
  end;

procedure TButtonedEdit.Loaded;
begin
  inherited;
  Ctl3D := True;
  LeftButton.Visible := not LeftButton.Visible;
  LeftButton.Visible := not LeftButton.Visible;
  RightButton.Visible := not RightButton.Visible;
  RightButton.Visible := not RightButton.Visible;
end;

これをフレームに含めることができますが、介在の宣言がTButtonedEditフレームの宣言の前にあることを確認してください。または、バグが多くのフレームに影響する場合は、共通のユニットで宣言し、使用にフレームでそのユニットを使用しますExtCtrls

さて、なぜストリーミングがCtl3D正しく設定されないのかという明らかな疑問については、私には答えがありません。フォーム ストリーミングについて私よりも詳しい人が教えてくれるかもしれません。

于 2011-08-11T07:12:58.687 に答える