Delphi: ButtonedEdit + Frame = Ошибка - PullRequest
       23

Delphi: ButtonedEdit + Frame = Ошибка

1 голос
/ 11 августа 2011

Delphi XE.

Существует Buttoned Edit (с левой кнопкой), список изображений с изображением для кнопки. Все в фрейме (это нормально, если на форме).

Нет отступа для кнопки во время разработки, но это время выполнения.

Это ошибка?

enter image description here enter image description here

Спасибо!

1 Ответ

7 голосов
/ 11 августа 2011

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

...