Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TCheckListBox

3.0K
08 сентября 2006 года
Inga
79 / / 27.12.2005
Подскажите, как сделать так, чтобы в TCheckListBox можно в любой момент времени выбирать только одно значение т.е. запретить множественный выбор.
3.0K
08 сентября 2006 года
Мerlin
267 / / 25.07.2006
Присвоить свойству Tag CheckListBox-a -1.
Переопределить событие OnClickCheck
 
Код:
void __fastcall TForm1::clbClickCheck(TObject *Sender)
{
  if(clb->State[clb->ItemIndex]==cbChecked)
  {
    if(clb->Tag!=-1)clb->State[clb->Tag] = cbUnchecked;
    clb->Tag = clb->ItemIndex;
  }
  else
    clb->Tag = -1;
}
3.0K
08 сентября 2006 года
Inga
79 / / 27.12.2005
[COLOR=black][FONT=Verdana]Спасибо.[/FONT][/COLOR][COLOR=black][FONT=Verdana][/FONT][/COLOR]
[COLOR=black][FONT=Verdana]Что-то с этим компонентом у меня тупик... в голове :) [/FONT][/COLOR][COLOR=black][FONT=Verdana][/FONT][/COLOR]
[COLOR=black][FONT=Verdana]Не могу среди методов найти тот, который удаляет строку из него с нужным индексом. Например, как удалить строку, если она пустая?[/FONT][/COLOR][COLOR=black][FONT=Verdana][/FONT][/COLOR]
 
Код:
for (int i = 0; i<CheckListBox1->Count; i++)
 {
  if(CheckListBox1->Items->Strings=="")
    {
      //удалить
    }
 }
3.0K
08 сентября 2006 года
Мerlin
267 / / 25.07.2006
Строки записываются в TStrings. Удаление для TStrings: Delete(index), и удаление всегда нужно начинать с конца.
 
Код:
for (int i = clb->Count-1; i>=0; i--)
  {
    if(clb->Items->Strings=="")
    {
      clb->Items->Delete(i);
    }
 }
3.0K
08 сентября 2006 года
Inga
79 / / 27.12.2005
Большое спасибо за помощь!
Что-то я сегодня совсем плохая .:rolleyes:
Видимо сказывается что уже пятница и думаю о выходных. :)
10
08 сентября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=Inga]Подскажите, как сделать так, чтобы в TCheckListBox можно в любой момент времени выбирать только одно значение т.е. запретить множественный выбор.[/QUOTE]
А не проще использовать TRadioGroup?
3.0K
08 сентября 2006 года
Inga
79 / / 27.12.2005
[quote=Freeman]А не проще использовать TRadioGroup?[/quote]

Просто раньше не приходилось сталкиваться с TCheckListBox. Вот решила ознакомиться с компонентом, его возможности и т.п.
С помощью Мerlin, вроде разобралась. :)

P.S. Реализация запрета множественного выбора у Мerlin весьма своеобразная. Я бы так не догадалась. Как еще можно запретить множественный выбор. Просто интересно в плане развития :)
3.0K
18 сентября 2006 года
Inga
79 / / 27.12.2005
Предложенный код, все же не до конца рабочий:
 
Код:
[LEFT]void __fastcall TForm1::clbClickCheck(TObject *Sender)
{
 if(clb->State[clb->ItemIndex]==cbChecked)
 {
   if(clb->Tag!=-1)clb->State[clb->Tag] = cbUnchecked;
   clb->Tag = clb->ItemIndex;
 }
 else
   clb->Tag = -1;
}[/LEFT]

Если начать щелкать на последней видимой надписи в TCheckListBox в момент скролла, то снова начинается множественный выбор. :mad:
10
18 сентября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=Inga]Если начать щелкать на последней видимой надписи в TCheckListBox в момент скролла, то снова начинается множественный выбор. :mad:[/QUOTE]
Так может, не стоит все-таки иметь лишний геморрой на свою задницу, а воспользоваться специально предназначенным для выбора одиночного элемента компонентом - TListBox или TRadioGroup?

Я понимаю, конечно, что учиться приемам программирования тоже когда-то надо, но если это становится препятствием на пути реализации проекта - опыты стоит перенести на более подходящее время.
3.0K
18 сентября 2006 года
Inga
79 / / 27.12.2005
TRadioGroup мне не подходить. Пользователь, согласно интерфейса приложения, должен ставить именно галочки (всегда одну).
TListBox это просто набор строк без возможности ставить галочки.
1.9K
18 сентября 2006 года
SABROG
242 / / 26.01.2006
Может и не очень изящно, но работает :)

 
Код:
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        void __fastcall MyClickCheck(TObject *);
};

 
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
CheckListBox1->OnClickCheck = MyClickCheck;
}

Код:
void __fastcall TForm1::MyClickCheck(TObject *Sender)
{
int ind;
bool state;
        if (CheckListBox1->ItemIndex != -1){
        ind = CheckListBox1->ItemIndex;
        state = CheckListBox1->Checked[ind];
                for(int i=0; i < CheckListBox1->Count; i++){
                CheckListBox1->Checked = false;
                }
        CheckListBox1->Checked[ind] = state;
        }
}
3.0K
18 сентября 2006 года
Inga
79 / / 27.12.2005
Cпасибо. Этот код работает без сбоев. Я его просто поместила в обработчик щелчка. Без назначения [COLOR=#0000bb]OnClickCheck.[/COLOR]
3.0K
18 сентября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=Inga]Предложенный код, все же не до конца рабочий:
 
Код:
[LEFT]void __fastcall TForm1::clbClickCheck(TObject *Sender)
{
 if(clb->State[clb->ItemIndex]==cbChecked)
 {
   if(clb->Tag!=-1)clb->State[clb->Tag] = cbUnchecked;
   clb->Tag = clb->ItemIndex;
 }
 else
   clb->Tag = -1;
}[/LEFT]

Если начать щелкать на последней видимой надписи в TCheckListBox в момент скролла, то снова начинается множественный выбор. :mad:[/QUOTE]Такое может быть, только если сбоит комп или компилятор. :)

Или пред пост относился к моему коду? Если его поместить вместо onClickCheck в OnClick, тогда может такое быть.
3.0K
18 сентября 2006 года
Inga
79 / / 27.12.2005
Этот момент надо поймать. :)
Ставим галочку.
Теперь надо поместить курсор на последней видимой в этот момент записи в СheckBox-e. Двигаем мышь слегка вниз и щелкаем на этой надписи. В результате появляется вторая галочка.
Код от SABROG не приводит к появлению второй галочки. ;)
3.0K
18 сентября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=Inga]Этот момент надо поймать. :)
Ставим галочку.
Теперь надо поместить курсор на последней видимой в этот момент записи в СheckBox-e. Двигаем мышь слегка вниз и щелкаем на этой надписи. В результате появляется вторая галочка.
Код от SABROG не приводит к появлению второй галочки. ;)[/QUOTE]Споймал момент. :). Imho аномальное явление, точнее баг, ведь согласно help событие OnClickCheck имеет место, когда
... the user selects or deselects an item’s check box.
В этом случае, ни то, ни другое не происходит, но событие вызывается.
Это можно исправить, но в TCheckListBox есть еще один баг. Чтоб его заметить, нужно отключить обработчик OnClickCheck, и предварительно ничего не выделяя щелкнуть ниже последнего видимого item, под квадратиком. Будет выделена совсем не та запись. Код SABROG-a исправляет этот баг.
3.0K
18 сентября 2006 года
Inga
79 / / 27.12.2005
[FONT=Arial]Досталось TCheckListBox-у, разобрали его сегодня по косточкам. :) [/FONT]
[FONT=Arial] [/FONT]
[FONT=Arial]P.S.[/FONT]
[FONT=Arial]Как добавить горизонтальный скролл в CheckListBox если надпись большая?[/FONT]
3.0K
18 сентября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=Inga][FONT=Arial]Досталось TCheckListBox-у, разобрали его сегодня по косточкам. :) [/FONT]
[FONT=Arial] [/FONT]
[FONT=Arial]P.S.[/FONT]
[FONT=Arial]Как добавить горизонтальный скролл в CheckListBox если надпись большая?[/FONT][/QUOTE]Напр. CheckListBox1->ScrollWidth = CheckListBox1->Width + 200;

Хотя наверно лучше, посредтвом GetTextExtentPoint32() сперва определить длину в пикселах, наибольшей строки.
1.9K
18 сентября 2006 года
SABROG
242 / / 26.01.2006
После добавления всех элементов добавь этот код, тут вычисляется длинна максимальной строки в пикселях плюс погрешность на длинну "х", после чего посылается сообщение CheckListBox'у, в конечном итоге они ведь все являются сабклассингом стандартного виндового ListBox'a:

 
Код:
int Width, MaxWidth=0;
                        for (int i=0;i < CheckListBox1->Items->Count;i++)
                        {
                        Width = CheckListBox1->Canvas->TextWidth(CheckListBox1->Items->Strings+"x");
                                if (MaxWidth < Width)
                                {
                                MaxWidth = Width;
                                }
                        }
SendMessage(CheckListBox1->Handle, LB_SETHORIZONTALEXTENT, MaxWidth, 0);
3.0K
18 сентября 2006 года
Inga
79 / / 27.12.2005
Cпасибо, [COLOR=#0000bb]SendMessage[/COLOR] работает!
3.0K
18 сентября 2006 года
Inga
79 / / 27.12.2005
Если программно очистить список, то скролл остается. Как его убрать если список уже пуст?
Спасибо.
3.0K
18 сентября 2006 года
Мerlin
267 / / 25.07.2006
clb->ScrollWidth = 0;
или
SendMessage(clb->Handle, LB_SETHORIZONTALEXTENT, 0, 0);
3.0K
19 сентября 2006 года
Inga
79 / / 27.12.2005
[quote=Мerlin]clb->ScrollWidth = 0;
или
SendMessage(clb->Handle, LB_SETHORIZONTALEXTENT, 0, 0);[/quote]

Спасибо! Все ОК!
465
25 марта 2012 года
QWERYTY
595 / / 25.03.2012
Увидел много интересных вариантов, и хочу поделиться своим. Ответ наверняка уже не нужен автору, но может понадобиться комуто ещё.

В обработчик onClickCheck пишем: CheckListBox1->CheckAll(0, false, false);

Ну и дальше боремся с ненужными эфектами(у кого какие).
Зачем писать функции если они уже для нас написаны? Думаете напишете оптимаьнее? Сомневаюсь
465
25 марта 2012 года
QWERYTY
595 / / 25.03.2012
Наверняка следуущий вопрос который возникает: "Как сделать чтоб выделялся итем по нажатию на компонент, и без множественного выбора?"

В обработчик onClick пишем:
CheckListBox1->CheckAll(0, false, false);
for (int i = 0; i < CheckListBox1->Count; i++) {
if (CheckListBox1->Selected) {CheckListBox1->Checked = true;
}
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог