Delphi. Панель Additional. Компонент CheckListBox. Часть 1

Компонент CheckListBox расположен на вкладке «Additional» на панели инструментов.

После размещения на форме он имеет вид:

Чтобы разместить в нем значения (строки), необходимо заполнить свойство «Items»

Если ввести значения «11», «22», «33», «44» и «55» то компонент приобретёт вид:

Смысл этого компонета в том, что устанавливая флажки, мы можем получить на выходе набор строк, которые затем будем использовать в тех или иных целях.

Как всегда, можно создать не один вариант кода для решения задачи. Для примера, будем размещать значения отмеченных в чекбоксах строк в компоненте «Memo»:

procedure TForm1.CheckListBox2ClickCheck(Sender: TObject);
var s:string;
begin
if CheckListBox2.Checked[CheckListBox2.ItemIndex]=true then
begin
self.Memo1.Lines.Append(CheckListBox2.Items[CheckListBox2.ItemIndex]);
end;
end;

Событие «onClickCheck» происходит, когда устанавливается флажок в чекбоксе (но не когда он снимается!).

Свойство «CheckListBox2.Checked[index]» проверяет, установлен ли флажок, принадлежащий строке с номером «index».

Свойство «ItemIndex» указывает на строку, которая была выбрана или в которой был изменён чекбокс.

Свойство «CheckListBox2.Items[index]» выбирает значение, принадлежащее строке с номером «index».

Если установить флажки около строк со значениями «22» и «44», то будем иметь:

Стиль флажка.

Стиль флажка определяется свойством «Flat». Если оно «true», то флажок отображается как плоский («flat»), либо объёмным, если «Flat=false», как показано на рисунке.

Цвет фона компонента.

Цвет фона определяется свойством «Color». На предыдущем рисунке цвет определён как «Color=clScrollBar» (один из системных цветов).

Количество колонок.

Строки можно располагать в нескольких колонках. Количество колонок определяется свойством «Columns».

Columns=0 — один столбец. Если все элементы не входят для отображения в окне компонента, то автоматически появляется вертикальная полоса прокрутки.

Columns=1 — один столбец. Если все элементы не входят для отображения в окне компонента, то автоматически появляется горизонтальная полоса прокрутки.

Columns>=2 — два и более столбцов. Если все элементы не входят для отображения в окне компонента, то автоматически появляется горизонтальная полоса прокрутки. Например, «Columns=3»

Состояние флажка.

Свойство «Enabeled» доступно как для всего компонента, так и для отдельного флажка. Если:

self.CheckListBox1.Enabled:=true;

то компонент доступен для манипуляций с ним. Если же значение этого свойства равно «false», то весь компонент закрыт для пользователя.

Но это свойство можно устанавливать и для отдельного флажка, то есть флажок может быть активным и не активным.

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

За активность флажка отвечает свойство «ItemEnabeled».

Например, сделаем неактивным флажок в третьей строке:

self.CheckListBox1.ItemEnabled[2]:=false;

(не забываем, что индексы отсчитываются от нуля).

Если мы хотим вновь сделать флажок активным, надо присвоить свойству значение «true».

Серое состояние флажка

По умолчанию флажок может принимать два состояния — отмеченное и не отмеченное.

Но у флажка есть свойство «AllowGrayed». По умолчанию его значение равно «false». Если поменять это значение на «true», то добавляется третье возможное состояние флажка — серое.

Например:

Посмотрим на примере, как можно использовать это состояние флажка (хотя практической пользы этот пример вряд ли принесёт, но он покажет некоторые приёмы программирования). Поставим задачу: отметить часть флажков как серые и вывести в «Memo» все не серые флажки. Это можно сделать с помощью следующего кода (в компонент введено 30 значений, а его высота равна 220):

procedure TForm1.Button2Click(Sender: Tobject);
var i,ii:integer; st:TCheckBoxState;
var b:boolean;
begin
st:=cbGrayed; //два других возможных значения — cbChecked (флажок отмечен) и cbUnhecked (флажок не отмечен.).
self.Memo1.Clear;
ii:=self.CheckListBox1.Count;//количество элементов в компоненте
for i:=0 to ii-1 do
begin
//если состояние i-того флажка State[i] не равно «cbGrayed» (флажок не серый),
//то добавляем i-тую строку в «Memo1»
if not (self.CheckListBox1.State[i]=st) then
self.Memo1.Lines.Append(self.CheckListBox1.Items[i]);
end;
end;

Например:

Анализ активности флажка.

Решим аналогичную задачу, но будем выводить в «Memo» только активные флажки.

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

Например, воспользуемся обработчиком кликов мыши, в частности — будем «отлавливать» нажатие правой кнопки мыши. Для этого воспользуемся обработчиком события «onMouseDown», доступ к которому расположен на вкладке «Events»:

Двойной щелчок по пустому полю справа вызывает заготовку метода-обработчика события:

procedure TForm1.CheckListBox3MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

end;

В нём разместим следующий код:

procedure TForm1.CheckListBox1MouseDown(Sender: Tobject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var r:trect; n,nn,YY,t,b:integer; ss:string;
begin
//если нажата не правая кнопка мыши, то выходим из процедуры (оператор «exit»)
if not (Button = mbRight) then exit;

//считываем высоту строки в глобальную переменную «vHeight» (если воспользоваться локальной переменной, то она потеряет своё значение при выходе из цикла «repeat».
vHeight:=self.CheckListBox1.ItemHeight;
//YY — счётчик циклов
YY:=0;//начальное значение счётчика циклов

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

nn:=self.CheckListBox1.Height div vHeight;

//далее надо определить номер строки, по которой был произведён щелчок
// 1) если мы не осуществляли прокрутку, то индекс верхней, отображаемой в окне строки, равен нулю.
// 2) Если прокрутка была, то номер верхней строки в окне компонента равен «TopIndex»

nString:=self.CheckListBox1.TopIndex;
//таким образом, номер верхней строки в списке изменяется от «0» до «self.CheckListBox1.Count-nn»

repeat
inc(nString); inc(YY); //функция «inc» увеличивает аргумент на 1 (или на «j», если inc(nString,j)).

if (Y>=(YY-1)*vHeight) and (Y<=YY*vHeight) then break;//когда «Y» оказывается между значениями «YY-1)*vHeight» и «YY*vHeight», цикл принудительно прерывается оператором «break»

until nString=self.CheckListBox1.TopIndex+nn; //условие окончания работы цикла. Цикл продолжается до тех пор, пока «nString» не станет равно значению «self.CheckListBox1.TopIndex+nn»

//Если флажок активен «self.CheckListBox1.ItemEnabled[nString-1]=true», то переводим его в неативное состояние, и наоборот. (значение «true» в логическом выражении можно опускать, оно подставляется по умолчанию)
if self.CheckListBox1.ItemEnabled[nString-1] then
self.CheckListBox1.ItemEnabled[nString-1]:=false
else
self.CheckListBox1.ItemEnabled[nString-1]:=true;

end;//конец процедуры

Теперь осталось только вывести все строки с активными чекбоксами в компонент «Memo»:

procedure TForm1.Button2Click(Sender: TObject);
var i,ii:integer;
var b:boolean;
begin
self.Memo1.Clear;
ii:=self.CheckListBox1.Count;
for i:=0 to ii-1 do
begin
b:=self.CheckListBox1.ItemEnabled[i];
if b then//если чекбокс активен, то выводим значение строки в «Memo»
self.Memo1.Lines.Append(self.CheckListBox1.Items[i]);
end;
end;

Замечание. Если первоначально количество строк в компоненте меньше, чем может разместиться, то надо вводить дополнительное условие, чтобы не откликаться на щелчок по пустому пространству. Попробуйте дополнить код самостоятельно.

Продолжение смотри в «Часть 2»

Обновлено: 31.08.2021 — 14:37

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *