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

### Проблемы и решение: Управление чекбоксами в виртуальном списке TListView в Delphi

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

Проблемы и решение: Управление чекбоксами в виртуальном списке TListView в Delphi

Вопрос пользователя заключается в том, что свойство Checkbox в компоненте TListView поддерживается только в режимах отображения vsList и vsReport. Однако, согласно предоставленной документации, это утверждение устарело, и чекбоксы могут быть видны и функциональны во всех режимах отображения, кроме режима плитки, который был введен в версии ComCtl32.dll 6.00 и выше.

Тем не менее, использование чекбоксов в виртуальном списке TListView (с установленным стилем LVS_OWNERDATA) имеет свои особенности. В таких списках нет элементов, которые можно было бы "пометить", и для управления состоянием элементов следует использовать состояние изображений. В документации Microsoft указано, что можно использовать состояния изображений, такие как проверенные и не проверенные чекбоксы, для указания определенных приложением состояний элементов. Эти состояния изображений отображаются в режимах иконок, маленьких иконок, списка и отчета.

Подтвержденный ответ:

Для управления чекбоксами в виртуальном списке TListView в Delphi, необходимо использовать изображения состояний. Пример кода ниже демонстрирует базовую реализацию, в которой информация о состоянии элементов хранится в отдельном массиве. Для запуска кода создайте пустую форму, создайте обработчик события OnCreate для формы и вставьте следующий код:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ImgList;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FListView: TListView;
    FListViewCheckStateArray: array of 0..1;
    procedure ListViewData(Sender: TObject; Item: TListItem);
    procedure ListViewMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Bmp: TBitmap;
begin
  FListView := TListView.Create(Self);
  FListView.Parent := Self;
  FListView.Align := alClient;
  FListView.OwnerData := True;
  FListView.ViewStyle := vsSmallIcon;

  FListView.StateImages := TImageList.Create(Self);
  Bmp := TBitmap.Create;
  Bmp.PixelFormat := pf32bit;
  Bmp.SetSize(16, 16);
  DrawFrameControl(Bmp.Canvas.Handle, Rect(0, 0, 16, 16), DFC_BUTTON, DFCS_BUTTONCHECK);
  FListView.StateImages.Add(Bmp, nil);
  DrawFrameControl(Bmp.Canvas.Handle, Rect(0, 0, 16, 16), DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_CHECKED);
  FListView.StateImages.Add(Bmp, nil);
  Bmp.Free;

  FListView.Items.Count := 257;
  SetLength(FListViewCheckStateArray, FListView.Items.Count);

  FListView.OnData := ListViewData;
  FListView.OnMouseDown := ListViewMouseDown;
end;

procedure TForm1.ListViewData(Sender: TObject; Item: TListItem);
begin
  Item.Caption := Format('This is item %.2d', [Item.Index]);
  Item.StateIndex := FListViewCheckStateArray[Item.Index];
end;

procedure TForm1.ListViewMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Item: TListItem;
begin
  if (Button = mbLeft) and (htOnStateIcon in FListView.GetHitTestInfoAt(X, Y)) then begin
    Item := FListView.GetItemAt(X, Y);
    Assert(Assigned(Item));
    FListViewCheckStateArray[Item.Index] := Ord(not Boolean(FListViewCheckStateArray[Item.Index]));
    FListView.UpdateItems(Item.Index, Item.Index);
  end;
end;

end.

Альтернативный ответ

Не указан, так как в предоставленном контексте он не упоминается.

Заключение

При работе с виртуальным списком TListView в Delphi для управления состоянием элементов следует использовать изображения состояний вместо стандартных чекбоксов. Представленный пример кода демонстрирует, как можно организовать взаимодействие с элементами списка, используя массивы для хранения состояний и обработчики событий для их изменения.

Создано по материалам из источника по ссылке.

Управление чекбоксами в виртуальном списке TListView в Delphi требует использования состояний изображений для отображения выбранных элементов.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 15:04:18/0.0032889842987061/0