Советы по Delphi

         

Компонент Check List


Вопрос:

Я ищу компонент ListBox, который может отображать квадратик с галочкой (check box) для выбранных элементов списка - компонент CheckList, если вам будет угодно (просто последний компонент содержит меньший набор характеристик, чем мне необходимо).

  1. Загрузите 'Adding Graphics in your listboxes and comboboxes' (дополнительная графика для компонентов ListBox и Combobox) из Borland Technical Information - документ TI2793.
  2. Добавьте в ваш ListBox изображение неотмеченного квадратика.
  3. Используя событие двойного щелчока заменяйте изображение на отмеченный квадратик.
Рисование графики в коде для компонентов ListBox и ComboBox

Способность добавления своей графики в ListBox и ComboBox может значительно изменить внешний вид компонентов, делая графику более дружественной при общении с пользователем.

В: Как мне вставить свою графику в Listbox или ComboBox???

Приведу здесь пример, шаг за шагом иллюстрирующий данную технологию.....

  1. Создайте форму.
  2. Расположите на вашей форме компоненты ComboBox и Listbox.
  3. Измените свойство Style компонента ComboBox на csOwnerDrawVariable и свойство Style компонента ListBox на lbOwnerDrawVariable. Обработчик события OnDrawItem компонентов TListBox или TComboBox позволяет осуществить вывод как объекта (графики), так и строки элемента. В данном примере осуществляется вывод как графического объекта, так и строки.
  4. Создайте 5 переменных типа TBitmap в VAR секции вашей формы.


  5. Создайте процедуру для события формы OnCreate.
  6. Создайте процедуру для события ComboBox OnDraw.
  7. Создайте процедуру для события ComboBox OnMeasureItem.
  8. Освободите ресурсы в обработчике события формы OnClose.
    {НАЧАЛО OWNERDRW.PAS}
unit Ownerdrw;

interface

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm) ComboBox1: TComboBox; ListBox1: TListBox; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure ComboBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer); procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure ListBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer); private { Private declarations } public { Public declarations } end;
var
Form1: TForm1; TheBitmap1, TheBitmap2, TheBitmap3, TheBitmap4, TheBitmap5 : TBitmap; implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
TheBitmap1 := TBitmap.Create; TheBitmap1.LoadFromFile('C:\delphi\images\buttons\globe.bmp'); TheBitmap2 := TBitmap.Create; TheBitmap2.LoadFromFile('C:\delphi\images\buttons\video.bmp'); TheBitmap3 := TBitmap.Create; TheBitmap3.LoadFromFile('C:\delphi\images\buttons\gears.bmp'); TheBitmap4 := TBitmap.Create; TheBitmap4.LoadFromFile('C:\delphi\images\buttons\key.bmp'); TheBitmap5 := TBitmap.Create; TheBitmap5.LoadFromFile('C:\delphi\images\buttons\tools.bmp'); ComboBox1.Items.AddObject('Изображение1: Глобус', TheBitmap1); ComboBox1.Items.AddObject('Изображение2: Видео', TheBitmap2); ComboBox1.Items.AddObject('Изображение3: Механизм', TheBitmap3); ComboBox1.Items.AddObject('Изображение4: Ключ', TheBitmap4); ComboBox1.Items.AddObject('Изображение5: Инструмент', TheBitmap5); ListBox1.Items.AddObject('Изображение1: Глобус', TheBitmap1); ListBox1.Items.AddObject('Изображение2: Видео', TheBitmap2); ListBox1.Items.AddObject('Изображение3: Механизм', TheBitmap3); ListBox1.Items.AddObject('Изображение4: Ключ', TheBitmap4); ListBox1.Items.AddObject('Изображение5: Инструмент', TheBitmap5);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TheBitmap1.Free; TheBitmap2.Free; TheBitmap3.Free; TheBitmap4.Free; TheBitmap5.Free; end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index:
Integer;
Rect: TRect; State: TOwnerDrawState); var
Bitmap: TBitmap; Offset: Integer; begin
with
(Control as TComboBox).Canvas do begin FillRect(Rect); Bitmap := TBitmap(ComboBox1.Items.Objects[Index]); if Bitmap <> nil then begin BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed); Offset := Bitmap.width + 8; end; { отображаем текст } TextOut(Rect.Left + Offset, Rect.Top, Combobox1.Items[Index]) end; end;

procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index:
Integer; var Height: Integer); begin
height:= 20; end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index:
Integer;
Rect: TRect; State: TOwnerDrawState); var
Bitmap: TBitmap; Offset: Integer; begin
with
(Control as TListBox).Canvas do begin
FillRect(Rect); Bitmap := TBitmap(ListBox1.Items.Objects[Index]); if Bitmap <> nil then begin BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed); Offset := Bitmap.width + 8; end; { отображаем текст } TextOut(Rect.Left + Offset, Rect.Top, Listbox1.Items[Index]) end; end;

procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index:
Integer;
var Height: Integer); begin
height:= 20; end;

end.
{КОНЕЦ OWNERDRW.PAS}

{НАЧАЛО OWNERDRW.DFM}
object Form1: TForm1
Left = 211 Top = 155 Width = 435 Height = 300 Caption = 'Form1' Font.Color = clWindowText Font.Height = -13 Font.Name = 'System' Font.Style = [] PixelsPerInch = 96 OnClose = FormClose OnCreate = FormCreate TextHeight = 16 object ComboBox1: TComboBox Left = 26 Top = 30 Width = 165 Height = 22 Style = csOwnerDrawVariable ItemHeight = 16 TabOrder = 0 OnDrawItem = ComboBox1DrawItem OnMeasureItem = ComboBox1MeasureItem end object ListBox1: TListBox Left = 216 Top = 28 Width = 151 Height = 167 ItemHeight = 16
Style = lbOwnerDrawVariable TabOrder = 1 OnDrawItem = ListBox1DrawItem OnMeasureItem = ListBox1MeasureItem end end
{КОНЕЦ OWNERDRW.DFM}

[000151]



Содержание раздела