Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2013, 12:29   #1
furstenberg
Форумчанин
 
Регистрация: 08.10.2007
Сообщений: 125
По умолчанию Динамическое заполнение Combobox+CheckBox в FireMonkey

Здравствуйте. Пытаюсь динамически заполнить Combobox с CheckBox-ами внутри. Делаю так:
Код:

for I := 1 to 10 do
begin
ComboBox1.ListBox.Items.Add('text'+inttostr(i));
end;

for I :=1 to 10 do
begin
ComboBox1.ListItems[i].AddObject(TcheckBox.Create(ComboBox1));
end;
Combobox заполняется. Возникает два вопроса:
1)Если отщелкнуть checkBox-ы, то я никак не могу отследить это:
Код:

for I := 2 to 9 do
begin
if ComboBox1.ListItems[i].IsChecked=true then showmessage('Выбран');
end;
ComboBox1.ListItems[i].IsChecked всегда false. Хотя если вручную добавить элементы, то все нормально. В ComboBox1Click что ли надо копать?

2)При заполнении checkBox закрывает начало строки, у ComboBox1.ListItems есть свойства alignText, но почему то им никак не удается воспользоватся?
furstenberg вне форума Ответить с цитированием
Старый 13.09.2013, 16:37   #2
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Код:
  for I := 1 to 10 do
  begin
    ComboBox1.ListBox.Items.Add('text'+inttostr(i));
    ComboBox1.ListItems[i-1].AddObject(TCheckBox.Create(ComboBox1));
    ComboBox1.ListItems[i-1].TextAlign := TTextAlign.taCenter;
  end;
, обращаться к чекбоксу - вот так:

Код:
  for I := 2 to 9 do
  begin
    // нулевой чайлд - это TLayout, первый - TCheckBox
    if (ComboBox1.ListItems[i].Children[1] as TCheckBox).IsChecked then
      ShowMessage('Выбран');
  end;
volvo877 вне форума Ответить с цитированием
Старый 13.09.2013, 21:04   #3
furstenberg
Форумчанин
 
Регистрация: 08.10.2007
Сообщений: 125
По умолчанию

В коде
Код:
for I := 2 to 9 do
  begin
     if (ComboBox1.ListItems[i].Children[1] as TCheckBox).IsChecked then
      ShowMessage('Выбран');
  end;
почему то на 9-ом элементе
Код:
 showmessage(ComboBox1.ListItems[9].Text);
выводит 'text9', а
Код:
 if (ComboBox1.ListItems[9].Children[1] as TCheckBox).IsChecked=true then showmessage('Выбран'+inttostr(9))
выводит ошибку First chance exception at $7508B760. Exception class EArgumentOutOfRangeException with message 'Argument out of range'. Process Project2.exe (3116). Ничего не понимаю.
furstenberg вне форума Ответить с цитированием
Старый 14.09.2013, 00:11   #4
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Очень странно... Вообще-то, если ComboBox заполнялся так, как я показывал, то ComboBox1.ListItems[9].Text должен быть 'text10', проверил - так и есть, именно 10... И никакого исключения не возникает. Попробуй еще проверить, чему равен ComboBox1.ListItems[9].ChildCount...

Если что, у меня XE2, соответственно, первый FM. Они там крутят не пойми что от версии к версии, у меня нет желания постоянно разбираться с их "нововведениями", поэтому версию Дельфи обновлять не собираюсь. Но то, что в некоторых случаях были уже проблемы при нумерации Child-ов при переносе с FMX1 на FMX2 - это факт...
volvo877 вне форума Ответить с цитированием
Старый 14.09.2013, 22:13   #5
furstenberg
Форумчанин
 
Регистрация: 08.10.2007
Сообщений: 125
По умолчанию

С твоим кодом все нормально, работает как говоришь (я в индексе ошибся при заполнении). А как быть вот с такой удивительной штукой:
Заполняю так:
Код:
for I := 0 to 10 do
begin
ComboBox1.ListBox.Items.Add('text'+inttostr(i));
ComboBox1.ListItems[i].AddObject(TcheckBox.Create(ComboBox1));
ComboBox1.ListItems[i].TextAlign:=TTextAlign.taCenter;
Memo1.Lines.Add('text'+inttostr(i)+' TcheckBox-'+inttostr(i)+' элементов-'+inttostr(CombohtpekmnfnBox1.ListItems[i].ChildrenCount));
end;
,
результат:
text0 TcheckBox-0 элементов-1
text1 TcheckBox-1 элементов-1
text2 TcheckBox-2 элементов-1
text3 TcheckBox-3 элементов-1
text4 TcheckBox-4 элементов-1
text5 TcheckBox-5 элементов-1
text6 TcheckBox-6 элементов-1
text7 TcheckBox-7 элементов-1
text8 TcheckBox-8 элементов-1
text9 TcheckBox-9 элементов-1
text10 TcheckBox-10 элементов-1
Дальше нажимаю без отщелкивания ComboBox1 и checkbox соотв :
Код:
for i := 0 to 10 {ComboBox1.ListBox.Count-1} do
begin
//showmessage();
try
Memo1.Lines.Add(ComboBox1.ListItems[i].Text+' элементов-'+inttostr(ComboBox1.ListItems[i].ChildrenCount));
if (ComboBox1.ListItems[i].Children[1] as TCheckBox).IsChecked=true then
begin
showmessage('Выбран-'+ComboBox1.ListItems[i].Text);
end;

except
Memo1.Lines.Add('-error');
end;
результат:
text0 элементов-1
-error
text1 элементов-1
-error
text2 элементов-1
-error
text3 элементов-1
-error
text4 элементов-1
-error
text5 элементов-1
-error
text6 элементов-1
-error
text7 элементов-1
-error
text8 элементов-1
-error
text9 элементов-1
-error
text10 элементов-1
-error
Теперь просто отщелкиваем ComboBox1 (не выбираем checkbox )
результат:
text0 элементов-2
text1 элементов-2
text2 элементов-2
text3 элементов-2
text4 элементов-2
text5 элементов-2
text6 элементов-2
text7 элементов-2
text8 элементов-1
-error
text9 элементов-1
-error
text10 элементов-1
-error
Что же не так в 8-ом элементе? Непонятно.
Если выбрать какие -нибудь checkbox-сы все работает.и 8-ой и 10-ый и 0-ой. Что то здесь неправильно работает.
furstenberg вне форума Ответить с цитированием
Старый 15.09.2013, 21:45   #6
furstenberg
Форумчанин
 
Регистрация: 08.10.2007
Сообщений: 125
По умолчанию

Volvo, спасибо за информацию.
furstenberg вне форума Ответить с цитированием
Старый 18.09.2013, 18:33   #7
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
Теперь просто отщелкиваем ComboBox1 (не выбираем checkbox )
Это не приводит к показу 8-го элемента, DropDownCount у комбобокса по умолчанию = 8, то есть, показаны будут элементы с 0-го до седьмого, восьмой не будет показан. А пока он не будет показан, FMX не пересчитает его дочерние элементы... Можно обойти вот так:

Код:
  for I := 0 to 10 do
  begin
    ComboBox1.ListBox.Items.Add('text'+inttostr(i));
    ComboBox1.ListItems[i].AddObject(TcheckBox.Create(ComboBox1));
    ComboBox1.ListItems[i].TextAlign:=TTextAlign.taCenter;
    ComboBox1.ItemIndex := i; // В процессе добавления показываем
    Memo1.Lines.Add(Format('text%d TCheckBox%d элементов-%d',
      [i, i, ComboBox1.ListItems[i].ChildrenCount]));
  end;
  ComboBox1.ItemIndex := -1; // а потом - скрываем
, тогда без распахивания комбобокса будет корректно отображаться информация о дочерних элементах.
volvo877 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TGrid в FireMonkey. Заполнение данными. Leximus Общие вопросы Delphi 5 15.07.2013 11:11
Динамическое заполнение Базы, EF squaDe C# (си шарп) 0 26.11.2012 10:53
CheckBox и ComboBox в StringGrid ZeitGeist7 Общие вопросы Delphi 16 22.04.2012 20:22
Возможно ли использовать CheckBox + ComboBox вместе? NoirSpirit Microsoft Office Excel 6 02.11.2011 16:17