Свойство "selected" компонента ТListBox может быть использованно только если свойство MultiSelect установленно в True.

Если Вы работаете с ListBox'ом у которого MultiSelect=false то используйте свойство ItemIndex.

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

begin

       ListBox1.Items.Add('1');

       ListBox1.Items.Add('2');

       {This will fail on a single selection ListBox}

//        ListBox1.Selected[1] := true;

       ListBox1.ItemIndex := 1; {This is ok}

end;

 

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

bm: TBitmap;

il: TImageList;

begin

bm := TBitmap.Create;

bm.LoadFromFile('C:\DownLoad\TEST.BMP');

il := TImageList.CreateSize(bm.Width, bm.Height);

il.DrawingStyle := dsTransparent;

il.Masked := true;

il.AddMasked(bm, clRed);

il.Draw(Form1.Canvas, 0, 0, 0);

bm.Free;

il.Free;

end;

 

Следующая функция имеет один параметр в виде объекта TStrings и печатает каждую строку на принтер, установленный в системе по умолчанию. Так как эта функция использует TStrings, то она будет работать с различными компонентами, которые содержат свойство типа TStrings, такие как TDBMemo или TOutline:

 

 

Code:

uses

Forms, Classes, Controls, StdCtrls, Db, DBTables, DBCtrls;

 

 

type

TForm1 = class(TForm)

   Table1: TTable;   // DBDemos customer table

   Table2: TTable;   // DBDemos orders table

   Button1: TButton;

   DBLookupComboBox1: TDBLookupComboBox;

   DataSource1: TDataSource;

   Table2CustNo: TFloatField;  // CustNo key field object used for Lookup  

   procedure Button1Click(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.Button1Click(Sender: TObject);

begin

with TStringField.Create(Table2) do begin

   FieldName := 'MyLookup';

   FieldKind:= fkLookup;

   DataSet := Table2;  

   Name := Dataset.Name + FieldName;

   KeyFields:= 'CustNo';

   LookUpDataset:= Table1;

   LookUpKeyFields:= 'CustNo';

   LookUpResultField:= 'Company';

   DbLookupCombobox1.DataField:= FieldName;

   DataSource1.DataSet:= Dataset;

   Table2.FieldDefs.Add(Name, ftString, 20, false);

end;

DbLookupCombobox1.DataSource:= Datasource1;

Table1.Active:= True;

Table2.Active:= True;

end;

 

end.

 

 

На месте подсказки используются для отображения текстовых строк для объектов, которые были обрезаны,

например, в treeview. Следующий код был протестирован только на стандартный элемент управления listbox.

Конечно вы можете использовать советы на других VCLs после соответствующей модификации.

(Только скопируйте следующий код в блок файл на form1)

 

Автор: Maarten de Haan

Надеюсь, что любители Delphi уже не один раз приукрашивали всякие ЛистБоксы и тому подобное. Автор исходника предлагает создать этот компонент своими силами.

Впрочем, Вы сами можете увидеть как можно играться со шрифтами в ListBox.

Существует довольно удобный способ прокрутки списков: если пользователь водит курсором мыши по элементам списка с нажатой левой кнопкой, то выделяется тот элемент, над которым находится курсор. А если курсор оказывается выше или ниже списка, то начинается прокрутка. О том, как такое сделать для ListView, мы сегодня и поговорим.

Во-первых, нужно сделать выделение элементов, над которыми находится курсор мыши (при нажатой левой кнопке). Для нахождения элемента по координатам курсора удобно использовать функцию GetItemAt. Чтобы сменить выделение, нужно изменить свойства Selected и ItemFocused.

Чтобы отлавливать события мыши при выходе курсора за границы ListView нужно "сказать" WIndows, что мышь сейчас "моя". Для этого используется функция SetCapture (чтобы сказать, что "мышь мне больше не нужна", используется функцией ReleaseCapture). Поскольку GetItemAt в случае выхода курсора за границы ListView возвращает пустой элемент (nil), дополнительно этот случай можно не проверять. Переменная d принимает положительное значение, если прокрутка будет происходить вниз и отрицательное в противном случае. Модуль d указывает на то, сколько элементов за раз будет прокручиваться. Нужно это для изменения скорости прокрутки (здесь скорость прокрутки зависит от того, насколько далеко находится курсор от ListView).

Сама прокрутка осуществляется в процедуре Move. К номеру выделенного элемента прибавляется d. Если новый номер выходит за рамки допустимого значения, он устанавливается в 0 или Items.Count - 1. Далее происходит проверка: если номер выделенного элемента совпадает в новым номером, то делать ничего не нужно. В противном случае нужно изменить значение Selected и ItemFocused, а также прокрутить список. Для последнего удобно использовать процедуру MakeVisible. Она прокручивает список так, чтобы указанный элемент оказался видным.

Чтобы список мог прокручиваться при неподвижной мыши, нужно сделать Timer, который бы периодически вызывал Move. Если курсор снова оказывается над ListView или пользователь отпускает левую кнопку мыши, Timer выключается.

Code:

var

d: integer = 0;

 

procedure Move;

var

NewIndex: integer;

begin

with Form1.ListView1 do if Assigned(Selected) then begin

   NewIndex := Selected.Index + d;

   if NewIndex < 0

     then NewIndex := 0

     else if NewIndex >= Items.Count

       then NewIndex := Items.Count - 1;

   if NewIndex <> Selected.Index then begin

     Selected := Items[NewIndex];

     ItemFocused := Selected;

     Selected.MakeVisible(true);

   end;

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

var

i: integer;

li: TListitem;

lc: TListColumn;

begin

Timer1.Interval := 100;

ListView1.ViewStyle := vsReport;

lc := ListView1.Columns.Add;

lc.Caption := 'Caption';

lc.AutoSize := true;

lc := ListView1.Columns.Add;

lc.Caption := 'SubItem';

lc.AutoSize := true;

ListView1.Items.BeginUpdate;

for i := 1 to 1000 do begin

   li := ListView1.Items.Add;

   li.Caption := 'Item ' + IntToStr(i);

   li.SubItems.Add('SubItem ' + IntToStr(i));

end;

ListView1.Items.EndUpdate;

end;

 

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

SetCapture(ListView1.Handle);

end;

 

procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

var

li: TListItem;

begin

if ssLeft in Shift then with ListView1 do begin

   li := GetItemAt(10, Y);

   if Assigned(li) then begin

     Timer1.Enabled := false;

     Selected := li;

     ItemFocused := ListView1.Selected;

   end else begin

     if Y >= ListView1.ClientHeight

       then d := (Y - ListView1.ClientHeight) div 20 + 1

       else d := Y div 20 - 1;

     if Timer1.Enabled = false then begin

       Move;

       Timer1.Enabled := true;

     end;

   end;

end;

end;

 

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Timer1.Enabled := false;

ReleaseCapture;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Move;

end;

 

В приведенном примере FileListBox приводится к типу TDirectoryListBox - таким образом можно добавиь дополнительные колонки.

 

Code:

with TDirectoryListBox(FileListBox1) do

begin

Columns := 2;

SendMessage(Handle, LB_SETCOLUMNWIDTH, Canvas.TextWidth('WWWWWWWW.WWW'),0);

end;

 

 

Code:

{

You need a TListBox and a TButton.

With a few modifications, you can use it with any variable

compatible with a TStringList.

If you change the operator "<"  for a ">" in the 'if' clause

below, the order will be reversed

}

 

procedure TForm1.Button1Click(Sender: TObject);

var

  i, x: Integer;

begin

  for i := 0 to (ListBox1.Items.Count - 1) do

    for x := 0 to (ListBox1.Items.Count - 1) do

      if (ListBox1.Items[x] < ListBox1.Items[i]) and (x > i) then

      begin

        ListBox1.Items.Insert(i, ListBox1.Items[x]);

        ListBox1.Items.Delete(x + 1);

      end;

end;

 

  

Code:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   ListBox1: TListBox;

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

   procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;

     Rect: TRect; State: TOwnerDrawState);

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

var

S : String;

begin

// Очистка

ListBox1.Clear;

S := 'C:\Windows\*.bmp';

// Даем команду листбоксу чтобы он нашел все картинки в папке Windows

// и занес их имена к себе

ListBox1.Perform(LB_DIR, DDL_READWRITE, Longint(@S[1]));

end;

 

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

begin

with (Control as TListBox).Canvas do

begin

   // очищаем прямоугольник

   FillRect(Rect);

   // В зависимости от индекса - определяем цвет

   Font.Color := clBlack;

   case Index of

     0: Font.Color := clBlue;

     1: Font.Color := clRed;

     2, 4: Font.Color := clGreen;

   end;

   // Выводим текст

   TextOut(Rect.Left, Rect.Top, Listbox1.Items[Index]);

end;

end;

 

end.

 

Автор: Александр (Rouse_) Багель

Использование табуляции в ListBox'е когда компонент находится в стандартном режиме не составляет труда. Но что делать если надо использовать графическое отображение элементов списка? Ведь при этом надо самому писать обработчик отрисовки элементов с разбиением на колонки. Элементарное решение - использование API функции TabbedTextOut, однако результаты работы этой функции меня явно не удовлетворили. Пришлось-таки "выкручиваться"... Символ-разделитель можно использовать любой. Например, будем использовать символ "|", тогда обработчик OnDrawItem может выглядеть следующим образом: