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

Я использую следующий метод для создания 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;

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

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

введите здесь описание изображениявведите здесь описание изображения

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

введите здесь описание изображения

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

Делфи 2005


person James Barrass    schedule 09.11.2011    source источник
comment
Небольшое замечание: параметр ActionClient.Caption является излишним, если для него задано то же значение, что и для действия.   -  person NGLN    schedule 09.11.2011


Ответы (2)


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

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

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  aToolBarFile.ActionClient.Items[0].Items[0].Free;
end;
person NGLN    schedule 09.11.2011
comment
Неплохая идея. Я бы добавил комментарий в производственный код и назвал элемент времени разработки Placeholder 001 или что-то в этом роде. - person Warren P; 10.11.2011
comment
@Warren Да, это действительно нуждается в каком-то разъяснении. - person NGLN; 10.11.2011

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

person Dave    schedule 29.10.2016
comment
Это звучит как хорошее решение. Пожалуйста, уточните, как именно это сделать. И с какой версии Delphi это возможно с VCL? - person NGLN; 29.10.2016