Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2015, 03:20   #1
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию Ribbon - Выпадающее меню со скроллбаром. Точнее его отсутствие.

Здрасьте. Скандалы, интриги, расследования.
Кнопка обыкновенная: csButton + btSplit с выпадающим меню.
Назначение: Undo/Redo.
Особые фичи: хранит список действий и знает их кол-во, автоматически выделяет все предыдущие пункты + пара непримечательных бонусов.

3dsmax:


Office:


Пункты выпадающего меню не имеют заглушки под картинки(та, что всегда слева во всех меню вместе с дурацкой полоской) и есть вертикальный scrollbox. Это Windows где-то заныкал контрол и никому не сказал кроме автостола или они сами эти меню сделали обходными путями?

Вот такой код добавляет лишь самые обыкновенные пункты меню. Никакого скроллбара, никакого свойства у родителя overflow/maxitems в принципе нет.
Код:
procedure TMForm.FormCreate(Sender: TObject);
var
ActionClient : TActionClient;
ChildItem    : TActionClientItem;
  i: Integer;
begin
ActionClient := RibbonQuickAccessToolbar1.ActionControls[0].ActionClient;
for i := 0 to 100 do
begin
  ChildItem := ActionClient.Items.Add;
  ChildItem.CommandStyle := csButton;
  ChildItem.Caption := 'Deleted Index '+IntToStr(i);
end;
ChildItem := ActionClient.Items.Add;
ChildItem.CommandStyle := csSeparator;
end;


Вообщем, хочу как у них. Есть идеи?

Последний раз редактировалось WhiskasTM; 12.01.2015 в 03:32.
WhiskasTM вне форума Ответить с цитированием
Старый 12.01.2015, 07:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Windows где-то заныкал контрол
Очень сомневаюсь.
Возьми Spy++ наведи его на контрол и посмотри как класс называется, и точно ли это один единый контрол а не комбинация.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.01.2015, 09:50   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Наверняка комбинация разных контролов, в основе скорее всего ComboBox
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.01.2015, 15:20   #4
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Меню динамическое и исчезает, но поймал вроде (если не промазал):

У самого риббона тоже родитель hWnd="404D6" .

В оффисе же "Net UI Tool Window" и если кликать ПКМ то будет:

____

Если будет borderless форма или combobox(что полегче) и создавать динамически, то как ловить нажатие по стрелке вон той кнопки? Именно по стрелке. DropDownMenu нету, потому как это action, у нас везде action, мы ведь action. Сабж, смахивает на отдельную форму + actionmanager как-то прикрепленный к основному риббону(чтобы цвета рендерились одинаково). Придется мучать((
WhiskasTM вне форума Ответить с цитированием
Старый 16.01.2015, 03:32   #5
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Помимо формы.
Эти action контролы оказывается можно подменить на свои, унаследованные от TCustomActionControl и возвращать тип класса в GetControlClass(этот виртуальный обычно в движке прорисовки ActionManager-а, ActionBar вроде). Правда поведение контролов придется создавать почти с нуля, там они едва работают.
Код:
uses
Vcl.Ribbon, Vcl.RibbonActnMenus,  Vcl.RibbonActnCtrls, Vcl.RibbonStyleActnCtrls, Vcl.RibbonSilverStyleActnCtrls;

type
  TRibbonSmallSplitButton = class(Vcl.RibbonActnCtrls.TRibbonSmallSplitButton)
  protected
    function GetPopupClass:TCustomPopupClass;override;
  protected
    procedure DoDropDown(const SelectFirst:Boolean);override;
  end;

  TRibbonSilverStyleActionBars = class(Vcl.RibbonSilverStyleActnCtrls.TRibbonSilverStyleActionBars)
  public
    function GetControlClass(ActionBar:TCustomActionBar;AnItem:TActionClientItem):TCustomActionControlClass;override;
  end;

  TRibbonActionPopupMenu = class(Vcl.RibbonActnMenus.TRibbonActionPopupMenu)
  public
    function GetControlClass(AnItem:TActionClientItem):TCustomActionControlClass;override;
  end;

  TMForm = class(TForm)
    Manager: TActionManager;
    Ribbon: TRibbon;
    AMB: TRibbonApplicationMenuBar;
    QAT: TRibbonQuickAccessToolbar;
    Images: TImageList;
    actUndo: TAction;
    actRedo: TAction;
    Action1: TAction;
    Action2: TAction;
    Action3: TAction;
    Action4: TAction;
    Action5: TAction;
    Action6: TAction;
    Action7: TAction;
    procedure Action1Execute(Sender: TObject);
    procedure Action2Execute(Sender: TObject);
    procedure Action3Execute(Sender: TObject);
    procedure Action4Execute(Sender: TObject);
    procedure Action6Execute(Sender: TObject);
    procedure Action7Execute(Sender: TObject);
    procedure Action5Execute(Sender: TObject);
    procedure actUndoExecute(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{ Hack Button }

function TRibbonSmallSplitButton.GetPopupClass:TCustomPopupClass;
begin
Result := TRibbonActionPopupMenu;        //FMain.TRibbonActionPopupMenu
end;

procedure TRibbonSmallSplitButton.DoDropDown(const SelectFirst:Boolean);
begin
inherited DoDropDown(SelectFirst);
//OnDropDown etc.
end;

{ Hack Style }

function TRibbonSilverStyleActionBars.GetControlClass(ActionBar:TCustomActionBar;AnItem:TActionClientItem):TCustomActionControlClass;
begin
Result := inherited;
if Result.ClassNameIs('TRibbonSmallSplitButton') and (AnItem.Action.Name='actUndo') then
  Result := TRibbonSmallSplitButton;     //FMain.TRibbonSmallSplitButton
end;

{ Hack Popup }

function TRibbonActionPopupMenu.GetControlClass(AnItem:TActionClientItem):TCustomActionControlClass;
begin
Result := inherited;
if Result.ClassNameIs('TRibbonMenuItem') then
begin
  if AnItem.Action.Name='Action1' then
    Result := TRibbonSmallSplitButton else
  if AnItem.Action.Name='Action2' then
    Result := TRibbonApplicationMenuButton else
  if AnItem.Action.Name='Action3' then
    Result := TRibbonTextControl;
  if AnItem.Action.Name='Action4' then
    Result := TRibbonMenuItem else
  if AnItem.Action.Name='Action5' then
    Result := TRibbonRadioButtonControl else
  if AnItem.Action.Name='Action6' then
    Result := TRibbonComboControl else
  if AnItem.Action.Name='Action7' then
    Result := TRibbonToolScrollButton else
end;
end;

procedure TMForm.Action1Execute(Sender: TObject);
begin { Idle }end;

procedure TMForm.Action2Execute(Sender: TObject);
begin { Idle }end;

procedure TMForm.Action3Execute(Sender: TObject);
begin { Idle }end;

procedure TMForm.Action4Execute(Sender: TObject);
begin { Idle }end;

procedure TMForm.Action5Execute(Sender: TObject);
begin { Idle }end;

procedure TMForm.Action6Execute(Sender: TObject);
begin { Idle }end;

procedure TMForm.Action7Execute(Sender: TObject);
begin { Idle }end;

procedure TMForm.actUndoExecute(Sender: TObject);
begin { Idle }end;

//Перерегистрация
//  с
//  Vcl.RibbonSilverStyleActnCtrls.TRibbonSilverStyleActionBars
//  на
//  FMain.TRibbonSilverStyleActionBars
initialization
UnregisterActnBarStyle(RibbonSilverStyle); //Vcl.RibbonSilverStyleActnCtrls.TRibbonSilverStyleActionBars
RibbonSilverStyle.Free;
RibbonSilverStyle := TRibbonSilverStyleActionBars.Create; //FMain.TRibbonSilverStyleActionBars
RegisterActnBarStyle(RibbonSilverStyle);


Ну и сразу баг с Quick Access Toolbar:


Там просто запредельная засохшая паутина зависимостей, совершенно не расширяемая фигня Я пошел.
WhiskasTM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выпадающее меню из БД Nenado PHP 5 25.03.2013 17:18
Выпадающее меню Fryg HTML и CSS 0 19.12.2011 17:16
Ribbon главное меню drak2000 Общие вопросы Delphi 1 17.06.2011 12:34
Выпадающее меню voldemen HTML и CSS 0 15.07.2010 13:39