|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
CheckListBox не на каждую строчку
Добрый день!
Подскажите плиз, можно ли в TChecklist выводить некоторые строки без признака выбора (просто текст)? |
#2
|
|||
|
|||
Нет, со стандартным компонентом так не получится.
Но если нужно именно так, то можно написать код, который динамически создаст набор нужных компонентов (tlabel и tcheckbox). |
#3
|
|||
|
|||
Вот набросал пример:
Код:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Contnrs, Vcl.StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; btCreate: TButton; ScrollBox1: TScrollBox; btGetChecked: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btCreateClick(Sender: TObject); procedure btGetCheckedClick(Sender: TObject); private { Private declarations } FCheckListBoxControls : TObjectList; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btCreateClick(Sender: TObject); var I : Integer; S : String; iTop : Integer; cCheckBox : TCheckBox; cLabel : TLabel; begin FCheckListBoxControls.Clear; iTop := 4; // Top position of first compenent in ScrollBox for I := 0 to Memo1.Lines.Count-1 do begin S := Memo1.Lines[i]; if S[1] = '-' then begin Delete(S,1,1); cLabel := TLabel.Create(Nil); cLabel.Parent := ScrollBox1; cLabel.Left := 4; cLabel.Top := iTop; cLabel.AutoSize := True; cLabel.Caption := S; FCheckListBoxControls.Add(cLabel); end else begin cCheckBox := TCheckBox.Create(Nil); cCheckBox.Parent := ScrollBox1; cCheckBox.Left := 12; cCheckBox.Top := iTop; cCheckBox.Caption := S; FCheckListBoxControls.Add(cCheckBox); end; iTop := iTop + 12; // 8 for component + 4 for spacing end; end; procedure TForm1.btGetCheckedClick(Sender: TObject); var I : Integer; S : String; begin S := 'The following items are checked:'#13#10; for I := 0 to FCheckListBoxControls.Count-1 do if FCheckListBoxControls.Items[i] Is TCheckBox then if (FCheckListBoxControls.Items[i] As TCheckBox).Checked then S := S + ' ' + (FCheckListBoxControls.Items[i] As TCheckBox).Caption + #13#10; ShowMessage(S); end; procedure TForm1.FormCreate(Sender: TObject); begin FCheckListBoxControls := TObjectList.Create; FCheckListBoxControls.OwnsObjects := True; end; procedure TForm1.FormDestroy(Sender: TObject); begin FCheckListBoxControls.Clear; FCheckListBoxControls.Free; end; end. В Memo1 находится список того, что надо создавать. Заголовок помечен символом '-' на первом месте. Код убирает этот символ и остальное использует как заголовок. Почему в ScrollBox - на случай, если кол-во элементов больше, чем размеры родительского компонента. Зачем TObjectList - что бы потом 1) иметь доступ к компонентам и 2) их корректно удалять (FCheckListBoxControls.OwnsObjects := True делаем список владельцем его итемов, т.е. при удалении итема из списка будет вызван деструктор этого итема). Дальше, надеюсь, сам разберешься. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
zillius (27.12.2024)
|
#4
|
||||
|
||||
Приветствую всех! Сто лет не появлялся на форуме. lmikle, персональный привет
На самом деле все можно стандартными средствами. У TCheckListBox есть свойство property Header[Index: Integer]: Boolean, которое как раз и "убирает" галочку. Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
zillius (27.12.2024)
|
#5
|
|||
|
|||
О! Не знал. Ща проверить надо
Ага, работает. Только перерисовать компонент надо после установки. Но у меня все равно получилось красивее |
#6
|
||||
|
||||
Учитывая, что TCheckListBox прямой наследник от TListBox, То первым делом я глянул его код и хотел просто перекрыть DrawItem и использовать свойство Enabled[] как Visible[] для каждого элемента в зависимости от Enabled = True/False вызывать метод ListBox-а или CheckListBox-а.
А потом заметил этот Header и решил посмотреть что это такое....Так что, я тоже не знал Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |