Внешний вид сайта:

Как поместить RaditoButton внутрь TListBox

Компонент TListBox в Delphi отображает коллекцию элементов в прокручиваемом списке. Свойство MultuSelect определяет, что пользователь может выбрать более одного пункта. Когда свойство MultiSelect установлено в False (по умолчанию), то ListBox может действовать, как контейнер для группы TRadioButton (аналогично с TRadioGroup).

RadioButton как элемент списка TListBox

Как это реализуется:

Поместите на форму объект TListBox и добавьте элементы списка в его свойстве Items

Далее, запишите следующий код:

private
    { Private declarations }
    procedure LB_Draw_Item(ctrl: TWinControl;
            i: integer; rect: TRect; state: TOwnerDrawState);

{ ... }

procedure TForm1.FormCreate(Sender: TObject);
begin
  with lbRadio do
  begin
    Style:= lbOwnerDrawFixed;
    ItemHeight:= 20;
    OnDrawItem:= LB_Draw_Item;
  end;
end;

procedure TForm1.LB_Draw_Item(ctrl: TWinControl; i: integer; rect: TRect;
  state: TOwnerDrawState);
const
  IsSelected: array[boolean] of integer = (
        DFCS_BUTTONRADIO, DFCS_BUTTONRADIO or DFCS_CHECKED);
var
  btnRect: TRect;
  listBox: TListBox;
begin
  listBox:= ctrl as TListBox;
  with listBox.Canvas do
  begin
     FillRect(rect);

    btnRect.Left:= rect.Left + 5;
    btnRect.Right:= rect.Left + 15;
    btnRect.Bottom:= rect.Bottom;
    btnRect.Top:= rect.Top;

    DrawFrameControl(
            Handle, btnRect, DFC_BUTTON, IsSelected[odSelected in State]);

    TextOut(20, rect.Top + 1, listBox.Items[i]);
  end;
end;

Примечание: свойство Style компонента TListBox должно быть установлено в lbOwnerDrawFixed для того, чтобы в событии OnDrawItem, когда он выводит элементы списка можно было нарисовать группу TRadioButton. Мы сделали это программно, но можно определить и в Инспекторе объектов.

Комментарии

Нет комментариев. Ваш будет первым!