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

Подскажите какой выбрать компонент


Volodja

Вопрос

Здравствуйте. 

Пишу на Delphi 7. В принципе нет сложностей с Delphi 10 для Win32.

Необходимо написать небольшую программку для Android (через Delphi 10 и FierMonkey). Функциональность совсем простенькая: запрос к БД, отображение на экране 3-4 полей, нажатие на запись - обновлений записи в БД (установка снятие bit). 

Подключение к БД сделал через DataSnap. С запросами к БД проблем нет, все работает без ошибок. С интерфейсом беда. Использую TGrid (описан как мультиплатформный). Долго боролся с заполнением грида - поборол. Но работает очень медленно, подлагивает, в общем работать, совсем некомфортно. 

Вопрос. Подскажите, какой выбрать компонент(ы) для реализации указанной функциональности. Такое ощущение, что TGrid на Androide вообще не используют. С пулом компонентов FireMonkey практически не знаком. Одноименные с Delphi 7 компоненты ведут себя не предсказуемо. Списки параметров, свойств и методов по-большому не совпадают. Просто теряюсь. Прошу помощи.

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

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

  • 0

Сейчас посмотрел. Но там что-то другое. У меня данные заполняются быстро. Просто при тапе на экран то ли притормаживает, то ли еще что. Галочка (одно поле Check) то ставится, то нет. Думаю надо смотреть в сторону TListBox. Но как с ним работать совсем не ясно. От VCL отличается как небо и земля. Может есть варианты попроще?

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

Что же делать? Такую программу могу на VCL за 10 -15 минут накидать. Что здесь-то не так? Помогите хотя бы определиться с подходящим компонентом. Чтобы не распыляться и копать в каком-то определенном направлении, а не изучать подноготную всего зоопарка...

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

Ну почти никто не пользуется этим гридом. Хотя у меня есть проект на windows. данные берет из http-запроса. все в принципе работает, но не айс, конечно, не VCL. Зато красиво

если на андроиде, то тем более там и смысла нет использовать грид.

Здесь есть ListView - наше всё. А еще ModernLV от ZuBy, который еще более наше всё

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

Спасибо. Что-то где-то проскакивало (по мере возможности изучаю материал, правда не систематично), что на TListBox или на TListView можно как-то наложить какой-то TGridPanelLayout. Я посмотрел. Даже добавил в этом Layoutе колонки, но при запуске ничего не вижу. У колонки всего два свойства SizeStyle и Value. Но к содержимому колонки это, видимо, не относится. Больше похоже на размеры колонки. Где можно посмотреть внятное описание работы с этими компонентами? 

Для работы с TGrid я данные из БД занес в массив, а в TGrid .GetValue и SetValue обновлял TGrid и массив.

Ссылка на комментарий
  • 0
2 часа назад, Volodja сказал:

на TListBox или на TListView можно как-то наложить какой-то TGridPanelLayout.

для начала можно использовать TListBox. он попроще в понимании и подходит для небольших объемов информации. На объемах от двух экранов и более начинает тормозить, там уже нужен ListView, у которого совсем другой подход.

Вкратце: у TListBox есть элементы, которые (если проводить аналогию с vcl) - просто панельки. На эти "панельки" можно накидать любые компоненты и, выставляя их свойства (начиная от текста и заканчивая выравниванием и стилем), уже регулировать отображение.

Ссылка на комментарий
  • 0
2 часа назад, Volodja сказал:

какой-то TGridPanelLayout

Этот компонент - контейнер из сетки "панелек", Опять-таки, на каждую из этих панелек можно накидать чего-нибудь.

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

Спасибо за ответы. Появилось какое-то понимание. Поправьте меня если я не прав.

У большинства компонентов FM нет свойств отображающих информацию (надписей и пр.). Но все компоненты являются контейнерами для других компонентов. Соответственно отображателями информации на компонентах (так сказать "высокого" уровня) являются прикрепленные к ним компоненты "низкого" уровня, имеющими такие свойства отображения информации (н-р, TLabel, TEdit, TCheckBox и т.д.). В общем что-то вроде бутерброда, у которого на самой верху TLabel. Я правильно понял?

Спасибо, kami.

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

Т.е. алгоритм примерно вырисовывается такой (в приложении к моей задаче, см. выше):

1. Получение данных из БД

2. Очистка TListBox. (от предыдущих данных)

3. Вставка в нужном кол-ве TListBoxItem (в цикле). На каждый TListBoxItem кладем сколько надо TText, которые заполняем чем надо. Можно сюда же положить TChecBox или TSwitch для наглядности. 

Здесь навскидку  вопрос.

При очистке достаточно удалить TListBoxItem с TListBox, или надо удалять все, что там лежит (я имею ввиду Free). Не будет ли утечки памяти?

Ссылка на комментарий
  • 0
12 минуты назад, Volodja сказал:

При очистке достаточно удалить TListBoxItem с TListBox, или надо удалять все, что там лежит (я имею ввиду Free). Не будет ли утечки памяти?

Под Андройдом имеется ARC. Объект удаляется из памяти только в случае, когда на него ничего не ссылается (счетчик ссылок равен 0). И вызов Free этот счетчик не обнулит. Чтобы точно ничего не осталось, лучше под Android делать для визуальных контроллов:
 

ListBoxItem.DisposeOf;

ListBoxItem := nil;

 

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

Вот код. При исполнении ошибок нет. (Правда отлаживаю на win32). Объект Cells.CellList не пустой. На форме лежит lbCells : TListBox;

lbCells.BeginUpdate;

for i := Low(Cells.CellList) to High(Cells.CellList) do
  begin
   lbi := TListBoxItem.Create(lbCells);
   lbl := TText.Create(lbi);
   lbl.Align := TAlignLayout.Left;
   lbl.Text := Cells.CellList.PackID.ToString + '  ' +
               Cells.CellList.Cell.ToString + '  ' +
               Cells.CellList.Quant.ToString;
   lbl.Tag := Cells.CellList.ID;
   chb := TCheckBox.Create(lbi);
   chb.Align := TAlignLayout.Right;
   chb.IsChecked := Cells.CellList.IsSet;
  end;

lbCells.EndUpdate;

После выполнения на форме ничего не появилось. Что я делаю не так?

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

я бы переформулировал

1. Загрузка данных извне в модель данных (МД)

2. Очистка ListView

3. Загрузка ListView из МД

все равно вы откажетесь от ListBox, просто поверьте )

Ссылка на комментарий
  • 0
34 минуты назад, krapotkin сказал:

все равно вы откажетесь от ListBox, просто поверьте )

В пользу чего?

У меня я так понимаю объект Cells.CellList - это и есть МД. Заполнять более-менее получилось.

Сейчас бьюсь с очисткой. Чего-то опять недопонимаю. 

ListBoxItem.DisposeOf;

ListBoxItem := nil;

Нужно оба оператора или достаточно любого. И еще. Как получить список ListBoxItem на ListBox. Навскидку не вижу. 

Ссылка на комментарий
  • 0
1 час назад, Volodja сказал:

Вот код.

Не забываем выставлять Parent у объектов.

3 минуты назад, Volodja сказал:

Вот такая очистка корректна?

Не уверен, а копаться лень.
Вариантов "правильной" очистки в FMX несколько, например:
 

for i:=lbCells.Count-1 downto 0 do

  lbCells.ItemByIndex(i).Release;

 

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

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

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

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

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

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

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

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

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

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