DelphiXE。
ボタン付き編集(左ボタン付き)、ボタンの画像を含む画像リストがあります。すべてがフレーム上にあります(フォーム上であれば問題ありません)。
デザイン時にボタンのインデントはありませんが、実行時にあります。
バグですか?

ありがとう!
DelphiXE。
ボタン付き編集(左ボタン付き)、ボタンの画像を含む画像リストがあります。すべてがフレーム上にあります(フォーム上であれば問題ありません)。
デザイン時にボタンのインデントはありませんが、実行時にあります。
バグですか?

ありがとう!
はい、バグです。何らかの理由で、編集がフレーム内にある場合、 の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正しく設定されないのかという明らかな疑問については、私には答えがありません。フォーム ストリーミングについて私よりも詳しい人が教えてくれるかもしれません。