Создать плавающий TToolbar во время выполнения без мерцания - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь создать пользовательский TToolbar во время выполнения, который перемещается по форме (ниже элемента управления, с которым он связан).

Моя проблема заключается в том, что процесс перемещения и позиционирования панели инструментов в создание создает отвратительное мерцание, где он первоначально рисуется в верхнем левом углу монитора, прежде чем переместится в желаемое положение в форме.

Я не могу найти способ избежать этого. Есть ли способ?

procedure TMainForm.Button3Click(Sender: TObject);
var
  newToolbar : TToolbar;
  newButton : TToolButton;
begin
  newToolbar := TToolbar.Create(Self);

  newToolbar.Visible := False;

  newToolbar.ManualFloat( Rect( 0, 0, newToolbar.Width, newToolbar.Height ));

  newToolbar.Parent := Self;

  newToolbar.left := 100;
  newToolbar.Top  := 100;

  newToolbar.ShowCaptions := True;

  newButton := TToolButton.Create(Self);
  newButton.Parent := newToolbar;
  newButton.Caption := 'Test';

  newToolbar.Visible := True;
end;

Ссылки: - Создать TToolbutton runtime - кнопка с действием, созданным во время выполнения - Delphi - Создать пользовательский Компонент TToolBar

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Я немного озадачен вашим решением, поэтому я привожу два моих взгляда на эту тему. В частности, я не понимаю, почему вы используете ManualFloat(), и несколько строк спустя установите родительский элемент панели инструментов, что делает его не плавающим.

Вот решение для плавающей панели инструментов, использующее ManualFloat() , Панель инструментов находится над формой в своем собственном временном TCustomDockForm в указанном месте.

Запись, необходимая для ManualFloat(), настроена для конечного местоположения, поэтому мерцание в неправильном месте отсутствует, и элемент управления сразу же правильно позиционируется.

procedure TForm1.Button3Click(Sender: TObject);
var
  newToolbar : TToolbar;
  newButton : TToolButton;
  p: TPoint;
begin
  newToolbar := TToolbar.Create(Self);

  // calculate position in screen coordinates for the floating toolbar
  p := ClientOrigin;
  p.Offset(100, 100);
  // and make it floating in final position
  newToolbar.ManualFloat( Rect(p.X, p.Y, p.X+NewToolbar.Width, p.Y+newToolbar.Height) );

  newToolbar.Visible := False; // really needed ?

  // Then create the toolbar buttons
  newToolbar.ShowCaptions := True;

  newButton := TToolButton.Create(self);
  newButton.Parent := newToolbar;
  newButton.Caption := 'Test';

  newToolbar.Visible := True;
end;

Однако, поскольку вам действительно требуется не плавающая панель инструментов, она просто расположена в любом месте формы (а не в верхней части формы по умолчанию) Лучшее решение - вообще пропустить ManualFloat() и просто установить для свойства Align панели инструментов значение alNone. Это позволяет перемещать его в любое место в родительской форме.

procedure TForm1.Button4Click(Sender: TObject);
var
  newToolbar : TToolbar;
  newButton : TToolButton;
begin
  newToolbar := TToolbar.Create(Self);
  newToolbar.Align := alNone; // constructor sets it to alTop

  newToolbar.Visible := False; // really needed ?

  newToolbar.Parent := Self;
  newToolbar.Left := 100;
  newToolbar.Top := 200;

  newToolbar.ShowCaptions := True;

  newButton := TToolButton.Create(self);
  newButton.Parent := newToolbar;
  newButton.Caption := 'Test';

  newToolbar.Visible := True; //
end;

Это дает вам тот же внешний вид, что и ваш собственный код, но пропускает ManualFloat().

Наконец, изображение для показать внешний вид:

enter image description here

Нижняя панель инструментов создана с Button4Click()

0 голосов
/ 27 февраля 2020

Спасибо @TomBrunberg за ваше предложение.

Что нужно для того, чтобы разместить его над формой без предварительного рисования:

  1. Позиционируйте его вне экрана при вызове ManualFloat
  2. Установите Visible в false после вызова ManualFloat (потому что ManualFloat устанавливает его в true)

Исправленный код:

procedure TMainForm.Button3Click(Sender: TObject);
var
  newToolbar : TToolbar;
  newButton : TToolButton;
begin
  newToolbar := TToolbar.Create(Self);

  // Float with off-screen position
  newToolbar.ManualFloat( Rect( 0, -200, newToolbar.Width, newToolbar.Height - 200 ));

  // Must hide after ManualFloat call, as it resets Visible to true
  newToolbar.Visible := False;

  // Set parent so we can add buttons, sets props, etc.
  newToolbar.Parent := Self;

  // Move to desired position over form
  newToolbar.left := 100;
  newToolbar.Top  := 100;

  // Add our button content...
  newToolbar.ShowCaptions := True;

  newButton := TToolButton.Create(Self);
  newButton.Parent := newToolbar;
  newButton.Caption := 'Test';

  // Now we can show it
  newToolbar.Visible := True;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...