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

Обработка большого количества CheckBox-ов.


chaplin.u@gmail.com

Вопрос

У меня есть ListBox с 7 ListBoxItem , на каждом ListBoxItem есть 7 CheckBox-ов.

Получается как-бы двухмерный массив CheckBox-ов. 

Какой самый простой способ обращаться к каждому конкретному CheckBox-у ?

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

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

  • 0
  • Администраторы

Все понял, не заметил, что в каждом 7 чек боксов.

Можно сделать по разному:

  1. Используя свойство Tag задать идентификаторы для этих чекбоксов, а потом просто бегать по чилдам и искать их по тегу
  2. Можно просто хранить, для каждого итема отдельно список чекбоксов (маппирование) и обращаться к ним напрямую.
  3. Можно перенести их в стиль, задать им названия и обращаться через FindStyleResource или StylesData.
Ссылка на комментарий
  • 0

Сузим количество версий по параметру - мультиплатформенная апликация (iOS/Android) . Во всех ли платформах будут работать все опции ?

По идеи пользователь может выбрать 7 значений ( либо 7 разных значений времени в один день недели. либо одно время в 7 разных днях).

И тогда нужно использовать 7   ListBoxItem. Так что лучше создать  их заранее и показывать их или создавать динамически ?

 

 

Ссылка на комментарий
  • 0
  • Администраторы
1 минуту назад, chaplin.u@gmail.com сказал:

Сузим количество версий по параметру - мультиплатформенная апликация (iOS/Android) . Во всех ли платформах будут работать все опции ?

По идеи пользователь может выбрать 7 значений ( либо 7 разных значений времени в один день недели. либо одно время в 7 разных днях).

И тогда нужно использовать 7   ListBoxItem. Так что лучше создать  их заранее и показывать их или создавать динамически ?

Как это связано с тем, что я написал вам? :-)

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

Я имею ввиду - будут ли работать все 3 опции  при вышеописанных обстоятельствах ?

Нет ли каких-то ограничений ( по ресурсам , по совместимости...) ?

Ну и в конце концов - чтобы Вы посоветовали не искушЁнному программисту. 

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

Пошёл по Tag-ам. Создал динамически   ListBoxItem-ы и проставил им Tag. Только вот когда сканирую по чилдам "(for (int i = 1; i < ListBox1->ChildrenCount; i++) " то по обращению  CurListBoxItem = ListBox1->Children->Items; ругается :

[bcc32 Error] Unit3.cpp(255): E2034 Cannot convert 'TFmxObject *' to 'TListBoxItem *'

Почему он возвращает тип TFmxObject  хотя обьект был создан как TListBoxItem ?
  

Ссылка на комментарий
  • 0
18 часов назад, chaplin.u@gmail.com сказал:

Пошёл по Tag-ам. Создал динамически   ListBoxItem-ы и проставил им Tag. Только вот когда сканирую по чилдам "(for (int i = 1; i < ListBox1->ChildrenCount; i++) " то по обращению  CurListBoxItem = ListBox1->Children->Items; ругается :

[bcc32 Error] Unit3.cpp(255): E2034 Cannot convert 'TFmxObject *' to 'TListBoxItem *'

Почему он возвращает тип TFmxObject  хотя обьект был создан как TListBoxItem ?
  

Попробуйте так:

CurListBoxItem = dynamic_cast<TListBoxItem*>(ListBox1->Children->Items[i]);

 

Изменено пользователем Axbor
Ссылка на комментарий
  • 0
  • Администраторы
50 минут назад, chaplin.u@gmail.com сказал:

Скажите как его зовут.

 

2 часа назад, Brovin Yaroslav сказал:

для доступа к элементами Items и Count

 

Ссылка на комментарий
  • 0
  • Администраторы
1 минуту назад, chaplin.u@gmail.com сказал:

дык я ведь выше написал что перебираю по  ChildrenCount и обращаюсь к  Children->Items.

А я вам ниже написал:

3 часа назад, Brovin Yaroslav сказал:

В лист боксе есть специальное свойство для доступа к элементами Items и Count

При чем здесь Children?

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

П

11 минут назад, Brovin Yaroslav сказал:

А я вам ниже написал:

При чем здесь Children?

При том что мне нужны не  ListBoxItem  а элементы на них расположеные. А к ним доступ как вы выше сказали  " бегать по чилдам" .

 

Ссылка на комментарий
  • 0
  • Администраторы
1 минуту назад, chaplin.u@gmail.com сказал:

Спасибо Axbor, приведение к типу сработало.

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

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

Я бы отделил логику от интерфейса. Проще создать двумерный массив (или сразу класс) для доступа к чекбоксам и остальному. Вот пример кода:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.DateTimeCtrls, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts,
  FMX.ListBox;

type
  TWeekCheckBox = array[1..7] of TCheckBox;

  TMyItem = record
    TimeStart : TTimeEdit;
    TimeEnd : TTimeEdit;
    WeekCheckBoxArray : TWeekCheckBox;
  end;

  TForm1 = class(TForm)
    ListBox: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    MyItems : TArray<TMyItem>;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
Var I, J : Integer;
    ListBoxItem : TListBoxItem;
begin
  SetLength(MyItems,7);
  for I := 0 to Length(MyItems)-1 do
  begin
    ListBoxItem:=TListBoxItem.Create(ListBox);
    MyItems[I].TimeStart:=TTimeEdit.Create(ListBoxItem);
    ListBoxItem.AddObject(MyItems[I].TimeStart);
    MyItems[I].TimeEnd:=TTimeEdit.Create(ListBoxItem);
    ListBoxItem.AddObject(MyItems[I].TimeEnd);
    for J := 1 to 7 do
    begin
      MyItems[I].WeekCheckBoxArray[J]:=TCheckBox.Create(ListBoxItem);
      MyItems[I].WeekCheckBoxArray[J].Align:=TAlignLayout.Left;
      ListBoxItem.AddObject(MyItems[I].WeekCheckBoxArray[J]);
    end;
    ListBox.AddObject(ListBoxItem);
  end;

end;

end.

Естественно нужно еще все контролы расставить как вам нужно. В итоге вы имеете двумерный массив, с помощью которого можете с легкостью обращаться к нужным элементам. Для наглядности туда же добавил и TTimeEdit подсмотренные на вашем скриншоте.

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

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

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

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

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

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

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

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

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

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