ListBox, CheckListBox, DBLookUp, Другие списки
Свойство "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; |
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
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; |
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
Следующая функция имеет один параметр в виде объекта TStrings и печатает каждую строку на принтер, установленный в системе по умолчанию. Так как эта функция использует TStrings, то она будет работать с различными компонентами, которые содержат свойство типа TStrings, такие как TDBMemo или TOutline:
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
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. |
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
На месте подсказки используются для отображения текстовых строк для объектов, которые были обрезаны,
например, в treeview. Следующий код был протестирован только на стандартный элемент управления listbox.
Конечно вы можете использовать советы на других VCLs после соответствующей модификации.
(Только скопируйте следующий код в блок файл на form1)
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
Автор: Maarten de Haan
Надеюсь, что любители Delphi уже не один раз приукрашивали всякие ЛистБоксы и тому подобное. Автор исходника предлагает создать этот компонент своими силами.
Впрочем, Вы сами можете увидеть как можно играться со шрифтами в ListBox.
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
Существует довольно удобный способ прокрутки списков: если пользователь водит курсором мыши по элементам списка с нажатой левой кнопкой, то выделяется тот элемент, над которым находится курсор. А если курсор оказывается выше или ниже списка, то начинается прокрутка. О том, как такое сделать для 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; |
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
В приведенном примере FileListBox приводится к типу TDirectoryListBox - таким образом можно добавиь дополнительные колонки.
Code: |
with TDirectoryListBox(FileListBox1) do begin Columns := 2; SendMessage(Handle, LB_SETCOLUMNWIDTH, Canvas.TextWidth('WWWWWWWW.WWW'),0); end; |
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
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; |
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
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_) Багель
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
Использование табуляции в ListBox'е когда компонент находится в стандартном режиме не составляет труда. Но что делать если надо использовать графическое отображение элементов списка? Ведь при этом надо самому писать обработчик отрисовки элементов с разбиением на колонки. Элементарное решение - использование API функции TabbedTextOut, однако результаты работы этой функции меня явно не удовлетворили. Пришлось-таки "выкручиваться"... Символ-разделитель можно использовать любой. Например, будем использовать символ "|", тогда обработчик OnDrawItem может выглядеть следующим образом:
- Подробности
- Родительская категория: VCL
- Категория: ListBox, CheckListBox, DBLookUp, Другие списки
Страница 2 из 3