Как добавить выпадающее меню к элементу действия во время выполнения

Я использую следующий метод для создания ActionClient с действием во время выполнения.

procedure TMainForm.AddToProjectHistory(Path: string);
var
    NewOption: TAction;
    ActionClient: TActionClientItem;
begin
    NewOption := TAction.Create(self);
    NewOption.ActionList := ActionManager1;
    NewOption.Caption := Path;
    NewOption.OnExecute := ProjectHistoryExecute;
    ActionClient := TActionClientItem(aToolBarFile.ActionClient.Items[0].Items.Add);
    ActionClient.Action := NewOption;
    ActionClient.Caption := Path;
end;

Это прекрасно работает, если в списке уже есть элемент, но не работает вообще, если его нет

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

Но если я ничего не добавляю во время разработки, нет раскрывающегося списка для отображения списка элементов, после добавления элементов раскрывающийся список не появляется.

Этого не нужно делать с Действиями, но остальная часть системы меню использует действия, и я не думаю, что могу добавить стандартные MenuItems в выпадающий список действий.

Delphi 2005

2 ответа

Решение

VCL автоматически создает кнопки управления типа, который зависит от того, есть ли у элемента дочерние элементы. По умолчанию (и в зависимости от настройки стиля ActionManager) для ActionClientItem, который имеет дочерние элементы, TXPStyleDropDownBtn кнопка создана, и для бездетного ActionClientItem, TXPStyleButton создано.

Поэтому, когда первый дочерний элемент добавляется во время выполнения, кнопка имеет неправильный тип. Изменение типа этой кнопки потребует уничтожения текущей кнопки и полного и ручного создания новой кнопки. Это должно быть возможно, но не пытались, потому что:

Действительно самое простое решение - обмануть VCL, добавив дочерний элемент во время разработки, и удалить этот элемент при создании формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
  aToolBarFile.ActionClient.Items[0].Items[0].Free;
end;

Если вы создадите actionclient типа "context", ему не нужно будет менять тип кнопки. Меню откроется, когда вы щелкнете правой кнопкой мыши по кнопке.

Другие вопросы по тегам