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

Кнопки у ListVew ItemAppearance


x11

Вопрос

С кнопками вижу 2 проблемы. Вот в чем неудобство.

Кнопка TGlyphButtonObjectAppearance. Нельзя в дизайне задать картинку и/или текст. Какой бы ButtonType я не указал, кнопка всегда пустая. Да и три типа кнопки - это маловато, т.к. операций обычно больше. Например нет типа для операции Edit.

И непонятно зачем этой кнопке тип Add. Хотелось бы указать свою картинку или даже текст с картинкой.

 

Кнопка TTextButtonObjectAppearance. Нельзя указать высоту :(

 

Когда удаляешь  TTextButtonObjectAppearance, происходит разрушительный сбой и среду приходится перезапускать.

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

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

  • 0

Ребят, подскажите как менять высоту у TTextButtonObjectAppearance.

Я взял пример у Равиля - ModernLIstView. Взял форму с Colorize, поменял ListView Item на Dynamic, добавил TextButton. В Design Time  кнопка изменять размер, а в RunTime она здоровенная на всю высоту Itema. Неужели нельзя в DynamicAppearance работать с этой кнопкой? Мне просто нужно 2 кнопки, почему так все запутанно в FMX...

Неужели придется ListBox использовать?

 

Вот кстати в одной из тем Равиль показывал скриншот одной программы, там 2 кнопки, маленького размера. Равиль как вы их сделали? Это просто 2 картинки или Text Button?

Screenshot_2015-07-30-19-12-07.png

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0
  • Модераторы
12 часа назад, ENRGY сказал:

Я взял пример у Равиля - ModernLIstView. Взял форму с Colorize, поменял ListView Item на Dynamic, добавил TextButton. В Design Time  кнопка изменять размер, а в RunTime она здоровенная на всю высоту Itema. Неужели нельзя в DynamicAppearance работать с этой кнопкой? Мне просто нужно 2 кнопки, почему так все запутанно в FMX...

все что связано с размерами высчитывается вручную в событии OnUpdateObjects

12 часа назад, ENRGY сказал:

Вот кстати в одной из тем Равиль показывал скриншот одной программы, там 2 кнопки, маленького размера. Равиль как вы их сделали? Это просто 2 картинки или Text Button?

две текстовые кнопки

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

@Равиль Зарипов (ZuBy)

А можно пару строчек как это делается, ведь у кнопки нет свойства Height, как же это сделать? Просто на тему этих кнопок в ListView вообще нигде нет информации. Вы многим поможете. 

Спасибо.

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

Понял как это делать.

Устанавливаем высоту кнопки

procedure TfrmMain.lvFavoritesUpdateObjects(const Sender: TObject; const AItem: TListViewItem);
var
  TextObject: TListItemDrawable;
begin
  TextObject := AItem.Objects.FindDrawable('TextButton16');
  if TextObject <> nil then
  begin
    TextObject.Height := 30;

  end;

end;

 

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

Ребята, если вам нужна кнопка с картинкой на ListView, то это можно сделать скомбинировав  картинку  с кнопкой :) . 

Сначала добавляете TTextButtonObjectAppearance, затем TImageObjectAppearance и устанавливаете картинку поверх кнопки.

 

Чтобы определить по какому элементу Item'a кликнул юзер: 

 

procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
begin
  if ItemObject = nil then exit;

  ShowMessage('Name: ' + ItemObject.Name + sLineBreak + 'Text: ' + (ItemObject as TListItemText).Text);
end;


 

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

Есть еще один альтернативный способ доступа к объектам.

Вместо AItem.Objects.FindDrawable('TextButton16')  можно обращаться по индексам. Это гораздо быстрее. Т.к. не нужно перебирать все объекты и сравнивать их строковые имена. К примеру в моем случае их аж 16, и у каждого есть имя. Каждое строковое имя нужно перебрать и сравнить с искомым. При этом в OnUpdateObjects это может делаться несколько раз на каждый List item.

Сделать это можно так:

 

aItem.View.ViewList[x]

Напр:

aItem.View.ViewList[10].Height := 30;

Список можно посмотреть так: 

В инспекторе объектов, найдите ListView, в нем Item. Выберите его, и в списке свойств нажмите Objects- это и будет полные список объектов. Начинается он с нуля. Отсчитаете нужный, и можно работать с ним.

Upd:

Также можно  изменять объекты TListItem'a по индексу вместо Data['name']. Там тоже используется FindDrawable.

Для этого сначала нужно добавить один раз значение через Data для любого из объектов чтобы создать нужны структуры (обычно для первого Object'a ), а затем уже заполнять по индексу остальные Objects в любой последовательности (не обязательно подряд).

 vItem.Data['T']  := 'Text'  // Data['T'] - это текст ListItem, так он стандартно обозначен

Дальше уже добавляем текст в объекты через индекс: 

(vItem.View.Drawables[5] as TListItemText).Text := 'Text 5';  

(vItem.View.Drawables[1] as TListItemText).Text := 'Text 2';  

 

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

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

изменил порядок - и поплыло все. 

а вот несколько раз вызывать FindDrawable в процедуре - это неправильно. сохраняйте ссылку и пользуйтесь ей

Ссылка на комментарий
  • 0
изменил порядок - и поплыло все. 

@krapotkin

Понятное дело что придется это учитывать. Но в моем случае это очень даже оправдано.

 

а вот несколько раз вызывать FindDrawable в процедуре - это неправильно. сохраняйте ссылку и пользуйтесь ей

У меня 15 элементов на один Item.  По другому никак, нужно вызвать 15 раз FindDrawable (+ OnUpdate срабатывает не один раз), а также этот метод будет вызываться при заполнении данных еще 15 раз. И в каждом FindDrawable прямым перебором перебираются 15 элементов и сравниваются строки каждого объекта, и это для каждого Item'a в ListView. Если использовать индексы это в несколько раз повысит скорость работы с ListView. 

Если я буду еще и кэшировать объекты в отдельных списках, то я просто запутаю код программы. Гораздо проще и прозрачнее использовать индексы.

Ведь для удобства можно ввести именованные константы индексы - и если измениться порядок следования - то это нужно изменить всего в одном месте (в константах).

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...