Да, это ошибка.По какой-то причине свойство Ctl3D
для TButtonEdit
не передается правильно из файла .dfm, когда редактирование находится во фрейме.Потоковая передача приводит к Ctl3D
, равному False
вместо True
.
Затем в 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
правильно, у меня нет ответа на это.Возможно, кто-то более знающий, чем я, в области потоковой передачи форм мог бы нас просветить!