Перейти к содержанию
  • Регистрация
  • 0
chaplin.u@gmail.com

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

Вопрос

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0

Вопрос на всякий случай. TListBoxItem уже имеет на своем борту TCheckBox. Он не подходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, Brovin Yaroslav сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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
7 часов назад, Axbor сказал:

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


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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 эмодзи.

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

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

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


  • Похожий контент

    • От Леонид Кудацкий
      Процедура  Process заполняет Listbox:
      procedure TForm1.Process;
      Const
         N=100;
      var
        I,Index:Integer;
        Item:TListBoxItem;
      begin
      for I := 1 to N do
          begin
          Item:=TListBoxItem.Create(ListBox1);
          Item.Text:=IntToStr(I);
          ListBox1.AddObject(Item);
          end;
      ListBox1.ScrollToItem(Item);
      end;
      Нужно, чтобы после заполнения Listbox скролировал в конец.
      Если процедура запускается нажатием кнопки, то всё нормально.
      А если из события формы FormCreate, то Listbox заполняется,
      а скролирование не происходит.
      Где тут собака порылась ?
    • От Sergiy_83
      Всем привет.
      Иногда, особенно когда есть прокрутка списка можно случайно выделить несколько элементов ListBox-а. Ощущение, что чем больше загрузка приложения, тем чаще проявляет себя эта проблема. Бывает редко но жутко раздражает. Работоспособность программы не нарушается.
      Что делать? Может "костыли" какие возможно придумать? 
      Android.
    • От YurMak
      Здравствуйте, уважаемые!
      Пробую писать некое подобие файлового менеджера.
      Для вывода папок и файлов использую  ListBox .
      Так вот: при обработке события ListBoxItemClick (нажатие  на строку) происходит переход по пути, казанному с этой строке, содержимое этой папки отображается, но строки в ней не нажимаютмя, не реагируют на событие нажатия.
      Если проще - строки на первой станице ListBox реагируют на нажатие, а на второй - нет.
      Что я делаю не так?
      {Клик по Item'у, вперёд} procedure TForm1.FoldersListBoxItemClick(const Sender: TCustomListBox; const Item: TListBoxItem); var ExtFile: string; begin // Сохраняем выбранный путь CurrentPath := CurrentPath+Item.ItemData.Text; //Текущая директория if Item.TagString = 'folder' then //Проверяем, если это папка begin if TDirectory.Exists(CurrentPath) then //Проверяем, если папка существует begin Label1.Text:= 'Нажата строка № '+ inttostr(Item.Index); //Контроль!!! FillFolderListBox(CurrentPath, True); //Процедура заполнения ListBox`а папками и файлами end else if Item.TagString = 'file' then //Иначе - файл begin Label1.Text:='Отправляем файл "'+Item.ItemData.Text+'" на плеер'; //Готовим на исподнение end; end; end; Вот этот код срабатывает один (первый) раз.
       
      Прошу помощи, советов, вариантов.
    • От x11
      У ListBoxItem нужно реализовать вызов контекстного меню.
      На ListBoxItem лежит ImagesViwer с картинкой и у ImagesViwer свойство HitTest отключено.
       
      почитал справку http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Gestures_in_FireMonkey
      сделал как описано:
       
      procedure TfmEditObject.AddPhoto(Image: TBitmap); Var item: TListBoxItem; imageV: TImageViewer; begin item := TListBoxItem.Create(lbPhotos); item.parent := lbPhotos; item.text := ''; item.Width := lbPhotos.Width; item.Touch.GestureManager := GestureManager1; item.Touch.InteractiveGestures := [TInteractiveGesture.LongTap, TInteractiveGesture.DoubleTap]; item.OnGesture := ListBoxItemGesture; imageV := TImageViewer.Create(lbPhotos); imageV.HitTest := False; imageV.Parent := item; imageV.Align := TAlignLayout.Client; imageV.Bitmap.Assign(image); item.SetFocus; end; procedure TfmEditObject.ListBoxItemGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); Var s: string; begin if GestureToIdent(EventInfo.GestureID, s) then ShowMessage( S ); if EventInfo.GestureID = igiLongTap then ShowMessage( Sender.ClassName ); Handled := True; end;  
      Ничего не происходит. На на андроид устройстве, ни на винде.
       
       
      И правильно ли я понял, что для LongTap, т.е. для InteractiveGestures не нужен GestureManager?
       

    • От Sashar333
      Здравствуйте!
      Есть ListBox1, на нем разное кол-во tlistboxitem'ов, на каждом tlistboxitem'е есть один tgridpanellayout состоящий из четырех колонок и одной строчи, в каждой колонке
      по одному trectangle, в каждом trectangle по одному ttext с именами по очереди типа 'w'+IntToStr(Item.index), 'l'+IntToStr(Item.index), 'k'+IntToStr(Item.index)
      такие имена для Ttext требуются для дальнейшей обработки и распознования, в каждом Ttext надпись, на примере "-","2","2","Х" :

      при нажатии на текст "Х" удаляется tlistboxitem c помощью listbox1.Items.Delete(indexclick)
      Проблема следующая, при создании нового итема пишет дубликат имени Ttext, я так понял что итем удалился а то что на нем -нет
      как можно быстро удалить и итем и то что на нем находилось? Пример создания итема:
      procedure addrazmer(zap:typezap); var item:tlistboxitem; pg:tgridpanellayout; t1,t2,t3,t4:ttext; al:talignlayout; r1,r2,r3,r4:trectangle; i:integer; begin form1.listbox1.BeginUpdate; while Form1.listbox1.Count<>1 do Form1.listbox1.Items.Delete(0); for i := 0 to length(zap.razmer)-1 do begin item:=tlistboxitem.Create(form1.listbox1); item.Height:=30; pg:=tgridpanellayout.Create(item); pg.RowCollection[1].Value:=0; pg.ColumnCollection.Add;pg.ColumnCollection[2].Value:=50; pg.ColumnCollection.Add;pg.ColumnCollection[3].Value:=10; pg.Parent:=item; pg.Align:=al.alClient; r1:=trectangle.Create(pg); r2:=trectangle.Create(pg); r3:=trectangle.Create(pg); r4:=trectangle.Create(pg); r1.Parent:=pg;r1.Align:=al.alClient; r2.Parent:=pg;r2.Align:=al.alClient; r3.Parent:=pg;r3.Align:=al.alClient; r4.Parent:=pg;r4.Align:=al.alClient; t1:=ttext.Create(r1); if zap.tip<>'Лист' then Begin t1.Enabled:=false; t1.Text:='-'; End else Begin t1.text:=floattostr(zap.razmer.witdh); end; t2:=ttext.Create(r2);t2.text:=floattostr(zap.razmer.length); t3:=ttext.Create(form1);t3.Text:=floattostr(zap.razmer.kol); t4:=ttext.Create(form1);t4.Text:='X'; t1.Parent:=r1;t1.OnClick:=form1.CliskRazmerClick; t2.Parent:=r2;t2.OnClick:=form1.CliskRazmerClick; t3.Parent:=r3;t3.OnClick:=form1.CliskRazmerClick; t4.Parent:=r4;t4.OnClick:=form1.DeleteItemClick; t1.Align:=al.alClient; t2.Align:=al.alClient; t3.Align:=al.alClient; t4.Align:=al.alClient; form1.listbox1.InsertObject(form1.listbox1.Items.Count-1,item); t1.Name:='w'+IntToStr(item.Index); t2.Name:='l'+IntToStr(item.Index); t3.Name:='k'+IntToStr(item.Index); end; form1.listbox1.EndUpdate; end; Заранее спасибо!
    • От ENERGY
      Привет.
      Я к своему стыду так и не научился толком работать с TListView. 
      TListBox это сделать просто, а вот как это сделать в TListView... Это сложный компонент.
      Подскажите как правильно реализовать.
      Нужно добавить с правой стороны каждого Item иконку избранное, которая работала бы как чекбокс - если нажать по ней то звездочка становится желтой и без заливки (Checked/unchecked) .
      Насколько я понял в GlyphButton нельзя добавить картинку.. Как же тогда это сделать?
      Спасибо.
    • От VirusZ2D
      Есть 5 итемов  у listbox свойство Allowc drag = true  итемы переносятся в нутри листа все путем 
      но как только включаю у итемов HitTest = true переносимость проподает (((.
      (Еще замечание если DragMode = dmAutomatic и HitTest = true  то итем можно поменять с итемом у которого HitTest = false)
      Как заставить их меняться ?
    • От x11
      Первая картинка - Master. Здесь всё правильно. А вот две другие картинки
      Вторая - iPhone 5,5"
      Третья - Android 5" Phone
      Четвертая - Android 7" Tablet
      У всех компонент Align := Right.
      Это зависит от каких-то свойств?
       
      Проверил на iPhone 4"  - норм. На iPhone 4.7"  - тоже криво.




    • От dim
      Создаю динамически ListBoxItem и размещаю на них кнопу
      lbi:=TListBoxItem.Create(ListBox2); lbi.Parent:=ListBox2; lbi.StyleLookup:='listboxitembottomdetail'; lbi.Height:=57; lbi.ItemData.Text:='Добавить'; lbi.ItemData.Detail:=''; SpeedButton2:=TSpeedButton.Create(lbi); SpeedButton2.Action:=del_adres; SpeedButton2.Align:=TAlignLayout.Right; SpeedButton2.StyleLookup:='trashtoolbutton'; SpeedButton2.Width:=48; SpeedButton2.Parent:=lbi; SpeedButton2.Tag:=ListBox2.Count-2; как при нажатии на кнопку получить ее ListBoxItem чтобы удалить
    • От gresaggr
      Добрый день.
      IDE: Delphi 10.1 Berlin Update2
      OS: Windows 7/64 ->Android (тестировал на 4.4.4)
      Вопрос 1:
       
      Пытаюсь загрузить в Listbox файл с русскими словами: ListBox1.Items.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'test1.txt'));
      При запуске на устройстве выдает ошибку: No mapping for the Unicode character exists in the target multi-byte code page
      Файл пытался сохранить и в UTF-8, и в ANSI, и в Unicode - без разницы (после смены кодировки делал Deployment)
      Как можно это победить?
      Вопрос 2:
      Вставил напрямую в дизайн-моде список этих же слов (из файла вопрос1) в Listbox - при старте программа очень долго думает. Слов порядка 10000. Как-то можно это ускорить?


       


       


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

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

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