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

TComboBox c чекбоксами


haword

Вопрос

Или я что то не то сделал или косяк. RAD 10 без апдейта.

CategoryList - TComboBox

 while not q.Eof do
 begin
    Item := TListBoxItem.Create(nil);
    Item.Parent := CategoryList.ListBox;
    Item.Text:=q.FieldByName('name').AsString;
    Item.Data:=TObject(q.FieldByName('categoryId').AsInteger);
    Item.IsChecked:=True;
    q.Next;
 end;
 TListBox(CategoryList.ListBox).ShowCheckboxes:=True;

Вроде при выпадении списка все красиво. Стоят чек боксы а далее идет текст. Как только скролю текст то надписи убегают под чекбоксы. 

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

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

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

У вас стоит же режим TComboBox.DropDownKind = Custom?

У меня при повторном открытии списка все норм:

post-1-0-04134000-1450737302.png

  1. Возможно есть еще какие-нибудь дополнительные условия?
  2. На какой платформе запускаете?

 

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

Похоже я понял. Речь идет, когда итемы не помещаются в выпадающем окне и появляются скроллбары

 

Хотя нет, так же все влезает

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

Коллеги, мой кунг-фу не достаточно силен, а заинтересовала возможность делать checkbox рядом с  items в combobox! А  можно полный код, как это сделать?

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

Коллеги, мой кунг-фу не достаточно силен, а заинтересовала возможность делать checkbox рядом с  items в combobox! А  можно полный код, как это сделать?

это и есть полный код

q - явно набор данных из запроса, проход в цикле по набору с созданием TListBoxItem.

из нестандартного в конце присвоение TListBox(CategoryList.ListBox).ShowCheckboxes:=True;

разве что еще в начале очистить CategoryList что-то типа CategoryList.Controls.Free

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

Пример реального кода, пожалуйста. То что есть, знаний не хватает, я же написал. Общее понимание есть, но не получается реально сделать!

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

твое кунгфу расстраивает... положи на форму ComboBox1 и кнопку, на нажатие кнопки:

procedure TForm.Button1Click(Sender: TObject);
var
Item : TListBoxItem;

begin

ComboBox1.Controls.Free();
Item := TListBoxItem.Create(nil);
Item.Parent := ComboBox1.ListBox;
Item.Text := 'что-то 0';

Item := TListBoxItem.Create(nil);
Item.Parent := ComboBox1.ListBox;
Item.Text := 'что-то 1';

TListBox(ComboBox1.ListBox).ShowCheckboxes:=True;

end;
Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0

У вас стоит же режим TComboBox.DropDownKind = Custom?

У меня при повторном открытии списка все норм:

  • Возможно есть еще какие-нибудь дополнительные условия?
  • На какой платформе запускаете?

Тоже попробовал на Windows 8.1 Первые 8 строк видны нормально (так как DropDownCount=8), а вот все что ниже отображается неправильно. Если поскролировать вниз вверх , то и первые 8 отобразятся неправильно.

 

Вот что выходит 

test.png

 

 

 

Vitaldj, положи на форму ComboBox (Name=CategoryList, DropDownKind=Custom)

procedure TForm1.FormCreate(Sender: TObject);
var
  i,k:integer;
  Item: TListBoxItem;
begin
 Randomize();
 for i := 0 to 20 do
 begin
    k:=Random(100);
    Item := TListBoxItem.Create(nil);
    Item.Parent:=CategoryList.ListBox;
    Item.Text:=k.ToString; 
    Item.Data:=TObject(k);
    Item.IsChecked:=True;
 end;
 TListBox(CategoryList.ListBox).ShowCheckboxes:=True;
end;

PS. Под Android вообще не запускается, висит черный экран  :mellow:

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

 

твое кунгфу расстраивает... положи на форму ComboBox1 и кнопку, на нажатие кнопки:

procedure TForm.Button1Click(Sender: TObject);
var
Item : TListBoxItem;

begin

ComboBox1.Controls.Free();
Item := TListBoxItem.Create(nil);
Item.Parent := ComboBox1.ListBox;
Item.Text := 'что-то 0';

Item := TListBoxItem.Create(nil);
Item.Parent := ComboBox1.ListBox;
Item.Text := 'что-то 1';

TListBox(ComboBox1.ListBox).ShowCheckboxes:=True;

end;

 К сожалению, в твоем примере ошибка, так и не смог понять почему. А вот  Ruslandа пример помог, спасибо!

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

Все как у Rusland, первые строки показываются нормально, начинаешь список скролировать в низ и все, надписи убежали под чекбоксы. 

 

У вас стоит же режим TComboBox.DropDownKind = Custom?

 

 

да. без него чекбоксы совсем не показываются. 

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

 

Камышев Александр, В твоем примере отсутствует Item.Data:=TObject(k);

 

Item.Data:=TObject(k); - ссылка на локальную переменную процедуры k - это скорее ошибка, по выходу из процедуры память занимаемая переменной k будет освобождена,

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

 

а ошибка возможно ComboBox1.Controls.Free();, на VCL это не работает, код для FMX

очищать надо перед повторным заполнением ComboBox.

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

насчет ссылки не правда. в поле Data итемов занесется значение в виде объекта. и при выходе из процедуры оно не потеряется. за то потом при закрытии комбобокса можно будет прочитать на каких полях стоят галки и понять по каким ключам потом дальше менять данные в базе.

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

насчет ссылки не правда. в поле Data итемов занесется значение в виде объекта. и при выходе из процедуры оно не потеряется. за то потом при закрытии комбобокса можно будет прочитать на каких полях стоят галки и понять по каким ключам потом дальше менять данные в базе.

Поподробнее про это. Или по другому: как понять (что бы внести изменения в БД) какие checkbox были выделены, а какие нет.

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

ну блин это основы же :) например, у тебя есть список категорий, у каждой категории есть уникальный ключ. ты хочешь присвоить что то, например товар, к нескольким категориям. в выпадающем списке пользователь выбирает нужные категории куда включить товар и закрывает комбобокс. ты бежишь по списку   for i := 0 to CategoryList.Count - 1 do , проверяешь стоит ли чек на поле CategoryList.ItemByIndex(i).IsChecked и если да то через преобразование объекта в число, Integer(CategoryList.ItemByIndex(i).Data) где i  это номер поля по порядку, получаешь ключ категории которую выбрал пользователь. и дальше уже делаешь с ним что тебе надо. 

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

 

 

PS. Под Android вообще не запускается, висит черный экран   :mellow:

 

Item.Data := TObject(k); под андроид на присвоении улетает в  AccessViolation, с памятью беда. Так как ошибка в FormCreate то и черный экран. Как это на винде работает...

 

Я как то на си пишу, там Item.Data это TObject* (именованный указатель на TObject), некорректно в него копировать ссылку на локальную переменную, можно ссылку на копию, но тогда ее удалять потом надо.

А в примере получается в сам указатель как в целое число идет присвоение и на винде работает?

Все равно некорректно,  платформозависимо.

Может все не так, корифеи есть? что происходит здесь: Item.Data := TObject(k) и почему на андроид ошибка?

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

Коллеги, я не прошу обсуждать мой уровень знаний. Я не профессиональный программист (я врач, редкой специальности), но это мне не мешает писать давольно функциональные и давольно используемые программы. Обычного самоучного уровня знаний хватает в 99% случаях. Более серьезны проблемы нехватки знаний, я легко обхожу другими способами. Пусть получается не всегда красиво, зато функционально. Опыт начиная с Delphi 3, а это более 15 лет. Поэтому, когда я вижу более элегантный код и интерфейс, я его пытаюсь воспроизвести. Что и получилось в этом случае. Да, работа с чекбоксами у меня реализована не через комбобокс, и я пытаюсь, использую этот пример, дополнить программу более изящным решением. Тем более писал всю жизнь на VCL, а не FMX. Многие не знают даже отличия торгового наименования лекарственного средства от международного, и путают понятия лекарственные препарат и лекарственное средство, но это не останавливает их самостоятельно пойти в аптеку и покупать лек препарат и ЛЕЧИТЬСЯ! Что для меня тоже "основы основ".

 

PS на днях узнал, что моя программа до сих пор работает в одной из лабораторий (10 лет назад писал). Писал я ее на delphi5. И если бы полная не работоспособность под win8 или 10, то программа бы еще работала и работала. (комп сгорел и купили новый).

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

Vitaldj бу бу бу бу  :D

 

Александр, этот кусок кода у меня под виндой работает так что пока проблем не было. 

 

А в примере получается в сам указатель как в целое число идет присвоение и на винде работает?

 

 

по моему мнению работает это так - TObject(k) число преобразовывается в тип TObject и помещается в это поле. Далее уже при обратном преобразовании данные с него вытаскиваются назад. Под андроидом это не прокатывает из за другого типа компилятора. Он так не может. Под виндой это работает.

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

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

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

я ж про то и толкую, TObject - это тоже класс, верхний в иерархии, и если класс TObject создается и заносится в поле (как и другие классы) то его тоже нужно удалять иначе это лик памяти? не исключено правда что есть механизм очистки...

 

мы отвлеклись, у меня тоже на винде после сдвига скролом надписи под чекбоксы уползают:

post-1634-0-48894800-1450783801.png

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

Или по другому: как понять (что бы внести изменения в БД) какие checkbox были выделены, а какие нет.

procedure TForm1.ComboBox1ClosePopup(Sender: TObject);
var
  i: Integer;
begin
   Memo1.Lines.Clear;
   for i := 0 to ComboBox1.Items.Count-1 do
      if ComboBox1.ListItems[i].IsChecked then
         Memo1.Lines.Add( ComboBox1.Items[i] );
end;
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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