Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Показать TRadioButtons в TListView

Delphi , Компоненты и Классы , TListView

Показать TRadioButtons в TListView

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

unit Unit1;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls, ComCtrls;

 type
   TMain = class(TForm)
     ListView1: TListView;
     Button1: TButton;
     Button2: TButton;
     procedure FormCreate(Sender : TObject);
     procedure FormDestroy(Sender : TObject);
     procedure Button1Click(Sender : TObject);
     procedure Button2Click(Sender : TObject);
   private
     ListViewRadioList: TList;
     procedure ListViewRadioCreate(List : TListView; R : TRect);
     procedure ListViewRadioClear(List : TListView; Liste : TList);
     procedure ListViewRadioFree(List : TListView; Liste : TList);
     procedure ListViewListSelected(Item : integer; List : TListView);
     procedure ListViewRadioClick(Sender : TObject);
   public
     { Public-Deklarationen }
   end;

 var
   Main : TMain;

 implementation

 {$R *.DFM}

 procedure TMain.FormCreate(Sender : TObject);
 begin
   ListViewRadioList := TList.Create;
 end;

 procedure TMain.FormDestroy(Sender : TObject);
 begin
   ListViewRadioFree(ListView1, ListViewRadioList);
 end;

 procedure TMain.Button1Click(Sender : TObject);
 var
   R : TRect;
   NewColumn : TListColumn;
   ListItem : TListItem;
   I : integer;
 begin
   with ListView1 do
   begin
     ViewStyle := vsReport;
     Align := alLeft;
     RowSelect := True;
     ReadOnly := True;
     ShowColumnHeaders := False;
     NewColumn := Columns.Add;
     NewColumn.Width := 15;
     NewColumn := Columns.Add;
     NewColumn.Width := Width - 15 - 19; // - breite Button - breite vom Scrollbalken 
    Items.BeginUpdate;

     for I := 0 to 9 do
     begin
       ListItem := Items.Add;
       R := Items[I].DisplayRect(drBounds);
       R.Left := 1;
       R.Right := Columns[0].Width;
       ListViewRadioCreate(ListView1, R);
       Items[I].Data := TRadioButton(ListViewRadioList[I]);
       ListItem.SubItems.Add('Test' + IntToStr(I));
     end;
     Items.EndUpdate;
   end;
 end;

 procedure TMain.Button2Click(Sender : TObject);
 begin
   ListViewRadioClear(ListView1, ListViewRadioList);
 end;
 //------------------------------------------------------------------------------ 

procedure TMain.ListViewRadioCreate(List : TListView; R : TRect);
   function NewViewRadio: TRadioButton;
   begin
     Result := TRadioButton.Create(Self);
     Result.Parent := List;
     Result.BoundsRect := R;
     Result.OnClick := ListViewRadioClick;
   end;
 begin
   ListViewRadioList.Add(NewViewRadio);
 end;
 //------------------------------------------------------------------------------ 

procedure TMain.ListViewRadioFree(List : TListView; Liste : TList);
 var
   I : integer;
 begin
   if Liste.Count - 1 < 0 then exit;
   for I := 0 to Liste.Count - 1 do TRadioButton(Liste[I]).Free;
   Liste.Free;
 end;
 //------------------------------------------------------------------------------ 

procedure TMain.ListViewRadioClear(List : TListView; Liste : TList);
 var
   I : integer;
 begin
   if Liste.Count - 1 < 0 then exit;
   List.Items.BeginUpdate;
   for I := 0 to Liste.Count - 1 do TRadioButton(Liste[I]).Free;
   List.Items.Clear;
   Liste.Clear;
   List.Items.EndUpdate;
 end;
 //------------------------------------------------------------------------------ 

procedure TMain.ListViewListSelected(Item : integer; List : TListView);
 begin
   with List do
   begin
     try
       SetFocus;
     except
     end;
     Selected := Items[Item];
     ItemFocused := Selected;
   end;
 end;

 //------------------------------------------------------------------------------ 
procedure TMain.ListViewRadioClick(Sender : TObject);
 var
   I : integer;
 begin
   for I := 0 to ListViewRadioList.Count - 1 do
     if TRadioButton(ListViewRadioList[I]).Checked then
     begin
       ListViewListSelected(I, ListView1);
       break;
     end;
 end;

 end.

Перевод на русский язык:

В этом проекте Delphi демонстрируется, как отображать TRadioButtons в TListView. Проект состоит из формы с двумя кнопками (Button1 и Button2) и одним списком (ListView1). Когда вы кликаете на Button1, создается 10 радиокнопок внутри списка. Каждая радиокнопка добавляется как подэлемент списка, с собственным прямоугольником, определенным процедурой ListViewRadioCreate.

Когда вы кликаете на Button2, все радиокнопки в списке очищаются.

Вот несколько способов улучшения этого проекта:

  1. Улучшение интерфейса: текущее отображение списка не является очень пользовательски friendly. Возможно, можно добавить заголовок к списку с колонками и некоторым видом отступки для лучшей читаемости.
  2. Обработка ошибок: в проекте нет механизмов обработки ошибок, что означает, что если что-то пойдет не так во время выполнения кода (например, исключение), оно будет остановлено и покажет сообщение об ошибке. Возможно, можно реализовать блоки try-catch для обработки таких ситуаций.
  3. Организация кода: код разбросан по нескольким процедурам. Могло быть лучше организовано в отдельных классах или модулях для каждого компонента или функции.

Вот измененная версия проекта:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TMain = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FRadioButtons: TList<TRadioButton>;
    procedure CreateRadioButtons(ListView: TListView; R: TRect);
    procedure ClearRadioButtons(ListView: TListView);
  public
     { Public declarations }
  end;

var
  Main: TMain;

implementation

{$R *.dfm}

procedure TMain.FormCreate(Sender: TObject);
begin
  FRadioButtons := TList<TRadioButton>.Create;
end;

procedure TMain.Button1Click(Sender: TObject);
var
  R: TRect;
  NewColumn: TListColumn;
  ListItem: TListItem;
  I: integer;
begin
  with ListView1 do
  begin
    ViewStyle := vsReport;
    Align := alLeft;
    RowSelect := True;
    ReadOnly := True;
    ShowColumnHeaders := False;
    NewColumn := Columns.Add;
    NewColumn.Width := 15;
    NewColumn := Columns.Add;
    NewColumn.Width := Width - 15 - 19; // - ширина кнопки - ширина скроллбара
    Items.BeginUpdate;

    for I := 0 to 9 do
    begin
      ListItem := Items.Add;
      R := Items[I].DisplayRect(drBounds);
      R.Left := 1;
      R.Right := Columns[0].Width;
      CreateRadioButtons(ListView1, R);
      Items[I].Data := TRadioButton(FRadioButtons[I]);
      ListItem.SubItems.Add('Test' + IntToStr(I));
    end;
    Items.EndUpdate;
  end;
end;

procedure TMain.Button2Click(Sender: TObject);
begin
  ClearRadioButtons(ListView1);
end;

procedure TMain.CreateRadioButtons(ListView: TListView; R: TRect);
var
  NewRadio: TRadioButton;
begin
  try
    NewRadio := TRadioButton.Create(Self);
    NewRadio.Parent := ListView;
    NewRadio.BoundsRect := R;
    NewRadio.OnClick := ListViewRadioClick;
    FRadioButtons.Add(NewRadio);
  except
    on E: Exception do
      ShowMessage('Error: ' + E.Message);
  end;
end;

procedure TMain.ClearRadioButtons(ListView: TListView);
var
  I: integer;
begin
  if FRadioButtons.Count > 0 then
  begin
    ListView.Items.BeginUpdate;
    for I := 0 to FRadioButtons.Count - 1 do
      TRadioButton(FRadioButtons[I]).Free;
    ListView.Items.Clear;
    FRadioButtons.Clear;
    ListView.Items.EndUpdate;
  end;
end;

procedure TMain.ListViewRadioClick(Sender: TObject);
var
  I: integer;
begin
  for I := 0 to FRadioButtons.Count - 1 do
    if TRadioButton(FRadioButtons[I]).Checked then
    begin
      ListViewListSelected(I, ListView1);
      Break;
    end;
end;

end.

В этой измененной версии радиокнопки созданы в отдельной процедуре CreateRadioButtons. Это делает ее более легко добавлять или удалять из списка. Обработка ошибок также улучшена за счет добавления блоков try-catch для обработки исключений.

В статье описывается, как можно отобразить TRadioButtons в TListView в Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TListView ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:17:39/0.0064220428466797/1