Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.12.2024, 13:16
zillius zillius вне форума
Прохожий
 
Регистрация: 08.10.2023
Сообщения: 3
Версия Delphi: Delphi 11
Репутация: 10
Вопрос CheckListBox не на каждую строчку

Добрый день!
Подскажите плиз, можно ли в TChecklist выводить некоторые строки без признака выбора (просто текст)?
Ответить с цитированием
  #2  
Старый 26.12.2024, 21:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,074
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Нет, со стандартным компонентом так не получится.
Но если нужно именно так, то можно написать код, который динамически создаст набор нужных компонентов (tlabel и tcheckbox).
Ответить с цитированием
  #3  
Старый 27.12.2024, 01:18
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,074
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот набросал пример:
Код:
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  
Старый 27.12.2024, 05:17
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 662
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Приветствую всех! Сто лет не появлялся на форуме. lmikle, персональный привет

На самом деле все можно стандартными средствами. У TCheckListBox есть свойство property Header[Index: Integer]: Boolean, которое как раз и "убирает" галочку.

Цитата:
Свойство Header в компоненте TCheckListBox в Delphi указывает, какие элементы выступают в роли заголовков.

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

Когда для элемента установлено значение true для свойства Header, рядом с ним не будет отображаться чек-бокс, а будет отображаться только текст элемента. Для этого элемента можно задать цвет фона с помощью свойства HeaderBackgroundColor и цвет шрифта с помощью свойства HeaderColor, чтобы визуально отличить его от выбираемых элементов в чек-листе.

Однако использование TCheckListBox для создания мультиколонного списка не представляется возможным, для этого рекомендуется использовать компонент TListView.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение:
zillius (27.12.2024)
  #5  
Старый 27.12.2024, 05:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,074
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

О! Не знал. Ща проверить надо

Ага, работает. Только перерисовать компонент надо после установки.
Но у меня все равно получилось красивее
Ответить с цитированием
  #6  
Старый 27.12.2024, 05:53
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 662
Версия Delphi: D6/D7
Репутация: 26643
Сообщение

Учитывая, что TCheckListBox прямой наследник от TListBox, То первым делом я глянул его код и хотел просто перекрыть DrawItem и использовать свойство Enabled[] как Visible[] для каждого элемента в зависимости от Enabled = True/False вызывать метод ListBox-а или CheckListBox-а.
А потом заметил этот Header и решил посмотреть что это такое....Так что, я тоже не знал
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter