![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Добрый день!
Подскажите плиз, можно ли в 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, которое как раз и "убирает" галочку. Цитата:
|
| Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
zillius (27.12.2024)
| ||
|
#5
|
|||
|
|||
|
О! Не знал. Ща проверить надо
![]() Ага, работает. Только перерисовать компонент надо после установки. Но у меня все равно получилось красивее ![]() |
|
#6
|
||||
|
||||
|
Учитывая, что TCheckListBox прямой наследник от TListBox, То первым делом я глянул его код и хотел просто перекрыть DrawItem и использовать свойство Enabled[] как Visible[] для каждого элемента в зависимости от Enabled = True/False вызывать метод ListBox-а или CheckListBox-а.
А потом заметил этот Header и решил посмотреть что это такое....Так что, я тоже не знал ![]() |