Перейти к содержанию
Fire Monkey от А до Я
  • 0

Развернуть TListBoxItem на всю форму


Zitto

Вопрос

Приветствую. Задача, при клике на ListBoxItem развернуть его на весь ListBox с анимацией.

Решаю её через

  ListBoxItem.AnimateFloat( 'Height', ListBox.Height ) и 

  ListBoxItem.AnimateFloat( 'Height', 0 ) соответственно.

procedure TForm1.ResizeListBoxItem(Sender: TObject);
var
i: Integer;
lbi: TListBoxItem;
Ind: Integer;
begin
lbi := ( ( Sender as TFMXObject ).TagObject as TListBoxItem );
Ind := lbi.Index;
if lbi.Height = 280 then
begin
for i := 0 to ListBox1.Items.Count - 1 do
if i = Ind then
ListBox1.ListItems[ i ].AnimateFloat( 'Height', ListBox1.Height )
else
ListBox1.ListItems[ i ].AnimateFloat( 'Height', 0);
end
else
for i := 0 to ListBox1.Items.Count - 1 do
ListBox1.ListItems[ i ].AnimateFloat( 'Height', 280 );

end;

post-457-0-99295900-1413750069_thumb.jpg

В каждом LisBoxItem находится свой ListBox с элементами, который в последствии и разворачивается на весь экран.

В следствии столкнулся со следующей проблемой:

Если развернуть один ListBoxItem и выделить один элемент на дочернем ListBox, а после свернуть его обратно и развернуть следующий, то всплывает ошибка 

  EArgumentOutOfRangeException

Конкретно на приложенном примере следует:

  1. Main(1) - развернуть
  2. Slave(1,4) - выделить
  3. Main(1) - свернуть
  4. Main(0) - развернуть

Проблема, видно, в обращении к уже скрытым элементам ListBoxItem и решить её удалось сворачивая остальные ListBoxItem не до 0, а до 1 или даже 0.1 .

Выход не нравится, прошу помощи в более элегантном решении

Request.zip

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Доброй ночи!

Я не стал динамически создавать элементы "меню". Просто накидал их на форму.

Можно сильно "помудрить", чтобы привести все возможные варианты к единому коду, но что-то мне влом было писать (смотрите заремленный кусочек). А для примера использовал свойство HelpContext...

Вообщем все в приложении. Думаю, там все достаточно просто и понятно. Все раскрывается так, как Вы описали, с анимацией.

post-115-0-40563800-1413765151.jpgpost-115-0-57638200-1413765151.jpgpost-115-0-75142500-1413765151.jpg

MenuEx.zip

Ссылка на комментарий
  • 0

Доброе утро!

Ваша реализация не сильно отличается от моей, но суть проблемы в ней упущена:

Идея такова, что при раскрытии одного ListBoxItem'a остальные сворачиваются полностью, а не до исходного размера.

И, соответственно, при сворачивании развернутого ListBoxItem'a все принимают исходную величину.

Спасибо.

Ссылка на комментарий
  • 0

Добрый день!

Думаю что "суть" здесь ни при чем. Я думал, при создании примера, об ошибке, возникшей у Вас, а не о деталях того как "раскрывается"...

Однако, если я правильно Вас понял, то Вам просто нужно заменить код процедуры в примере который я приложил к предыдущему комментарию.

 

код процедуры

procedure TForm2.ListBox1ItemClick(const Sender: TCustomListBox; const Item: TListBoxItem);

заменить на

procedure TForm2.ListBox1ItemClick(const Sender: TCustomListBox; const Item: TListBoxItem);
var
  i, j : Integer;
begin
  for i := 0 to TCustomListBox(Sender).Items.Count - 1 do
    if TListBoxItem(TCustomListBox(Sender).ListItems[i]) <> Item then
    begin
      if TListBoxItem(TCustomListBox(Sender).ListItems[i]).Height <> 0 then
        TListBoxItem(TCustomListBox(Sender).ListItems[i]).AnimateFloat('Height', 0, 0.3);
    end else
    if TListBoxItem(Item).Height = 32 then
      TListBoxItem(Item).AnimateFloat('Height', TListBoxItem(Item).HelpContext, 0.3)
      else
      for j := 0 to TCustomListBox(Sender).Items.Count - 1 do
        if TListBoxItem(TCustomListBox(Sender).ListItems[j]).Height <> 32 then
          TListBoxItem(TCustomListBox(Sender).ListItems[j]).AnimateFloat('Height', 32, 0.3);
end;

И будет Вам счастье...

А уж с "высотами" - играйтесь сами, как Вам  требуется.

 

P.S. И, кстати, поймите правильно - разбираться детально в том, что Вам нужно, Вам придется самому. Я лишь показал пример как это работает (без ошибок вроде) и, практически, так как Вам надо и в двух вариантах. А условия того как что должно "сворачиваться" и "раскрываться" поставьте сами. Мне кажется все достаточно просто и прозрачно.

Изменено пользователем AlexG
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...