Когда я добавляю TPanel в TToolBar, я получаю TPanel или TToolButton? - PullRequest
1 голос
/ 21 июня 2010

Когда Delphi (2006) становится квантовым: у меня есть «нечто», которое выглядит как TToolBar и TPanel, в зависимости от того, как вы это наблюдаете. Я хотел бы понять, что происходит.

Вот как это сделать и что происходит:

  1. в DFM

    • добавить именованный бар TToolBar;
    • в этом TToolBar, поместите TPanel.
  2. в коде и во время выполнения:

    • панель появляется в списке кнопок панели. Кнопки [], скажем, по индексу i
    • bar.Buttons [i], с точки зрения компилятора, является TToolButton
    • bar.Buttons [i] .ClassName = 'TPanel'
    • (bar.Buttons [i] - TToolButton) = true, но это компилятор, оптимизирующий вызов 'is' out;
    • действительно IsBarButton (bar.Buttons [i]) имеет значение false для функции IsBarButton (определено ниже);
    • bar. Кнопки [i]. Name - это имя, которое я дал TPanel в DFM
    • проверка значения bar.Buttons [i] в ​​отладке:
      • у него есть свойство 'Caption', которого у реального TToolButton нет
      • странно, у него есть все свойства, которые есть у TToolButton, например TToolButton.Indeterminate (= true).

IsToolButton:

function IsToolButton(X : TObject) : boolean;
begin
    Result := X is TToolButton;
end;

Итак, bar.Buttons [i] и есть, и не TToolButton ... что случилось?

(В нижней части я хотел бы отличить свой TPanel от подлинного TToolButton. Это я могу сделать более или менее хакерскими способами. Моя цель, задавая этот вопрос здесь, состоит в том, чтобы получить более полное понимание того, что на самом деле здесь происходит .)

Вопрос: что происходит? Подвопрос: законно ли добавить TPanel в TToolBar?

Ответы [ 3 ]

2 голосов
/ 21 июня 2010

Единственное, что ОС позволяет добавить на панель инструментов, это кнопка инструмента. Чтобы добавить что-либо еще, вам технически необходимо создать кнопку, а затем поместить поверх нее другие вещи. Добавленная кнопка является буквально заполнителем. Он там, чтобы занять место, поэтому следующая вещь, которую вы добавите, будет правильно размещена.

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

Когда вы добавляете не-инструментальный элемент управления на панель инструментов, свойство Buttons действительно зависит от типа элемента управления. В ComCtrls.pas вы заметите, что сама TToolBar всегда переводит кнопки в TControl и затем проверяет, действительно ли они опускаются с TToolButton. Вполне допустимо добавлять не-кнопки на панель инструментов; вот почему конструктор форм это позволяет в первую очередь.

Я предлагаю вам использовать конструктор форм для создания панели инструментов. Таким образом, IDE будет поддерживать для вас идентификатор в вашей форме, поэтому вы всегда будете иметь прямую ссылку на вашу панель. Вам не придется охотиться за ним на панели инструментов. Даже если вы создаете панель инструментов вручную, рекомендуется создать дополнительное поле для ссылки на панель. Даже если вы переместите панель внутри панели инструментов, она все равно будет одним и тем же объектом, поэтому вам не нужно беспокоиться о свисающих ссылках.

0 голосов
/ 21 июня 2010

'это законно?'- ну, вы определенно используете панель инструментов таким образом, чтобы создатель панели инструментов не задумывал ее использовать.Это взорвется на вашем лице?Кто знает.Я думаю, вы могли бы пройтись по исходному коду для панели инструментов и проверить, безопасен ли он или нет, но как насчет возможных сторонних инструментов или компонентов, ожидающих найти кнопки на панели инструментов?

Я бы посмотрел, смогу ли янайти другой способ решения моей проблемы.Умные взломы имеют тенденцию оказываться не такими уж умными, и это, несомненно, увеличит wtf-rate вашего кода.

Вам нужно использовать панель инструментов?А как насчет поточной панели с кнопками и панелями?Или панель с панелью инструментов и панелью?

0 голосов
/ 21 июня 2010

Когда вы поместите пару кнопок и панель на панель инструментов и где-нибудь заметку, затем запустите этот код в форме onCreate:

procedure TForm1.FormCreate(Sender: TObject);
  function _IsToolButton(const aObject: TObject): Boolean;
  begin
    Result := aObject is TToolButton;
  end;

  function _IsPanel(const aObject: TObject): Boolean;
  begin
    Result := aObject is TPanel;
  end;
var
  i: Integer;
begin
  for i := 0 to bar.ButtonCount - 1 do begin
    Memo.Lines.Add(Format('bar.Buttons[%d].Name: %s', [i, bar.Buttons[i].Name]));
    Memo.Lines.Add(Format('bar.Buttons[%d].ClassName: %s', [i, bar.Buttons[i].ClassName]));
    Memo.Lines.Add(Format('bar.Buttons[%d] is TToolButton: %s', [i, BoolToStr(_IsToolButton(bar.Buttons[i]), True)]));
    Memo.Lines.Add(Format('bar.Buttons[%d] is TPanel: %s', [i, BoolToStr(_IsPanel(bar.Buttons[i]), True)]));
//    Memo.Lines.Add(Format('bar.Buttons[%d] has Caption property: %s', [i, 'dunno yet']));
    Memo.Lines.Add('');
  end;
end;

, вы увидите, что панель имеет значение not a TooButton и, определенно, TPanel.

Отладчик, показывающий свойства ToolButton для панели, - это просто отладчик, приводящий каждый бар.Когда вы щелкнете правой кнопкой мыши на вкладке «Данные» Инспектора отладки, вы можете набрать Cast на TPanel, и вы получите правильную информацию.

...