Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

unit Unit1;

interface

uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls { вам нужно это для ListBox } ;

type TForm1 = class(TForm)

 procedure FormCreate(Sender: TObject);

 procedure FormResize(Sender: TObject);

private

 { Private declarations }

public

 { Public declarations }

end;

var

 Form1: TForm1;

 listbox: TListBox;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

 listbox := TListBox.Create(self);

 listbox.Parent := self;

 listbox.Top := 0;

 listbox.Left := 0;

 listbox.Width := self.Width div 2;

 listbox.Height := self.Height div 2;

 listbox.items.add('тест 1');

 listbox.items.add('тест 2');

 {
и т.д, и т.п. … }

end;

procedure TForm1.FormResize(Sender: TObject);

begin

 listbox.Width := self.Width div 2 ;

 listbox.Height := self.Height div 2 ;

end;

end.

Двойной ListBox

Я расположил на форме два компонента Listbox, и с помощью следующего кода заполнил один из них данными из таблицы:

tableName.Refresh; {в вашем случае это может и не понадобится}

tableName.First; {Убедимся, что мы смотрим первую запись}

while not tableName.Eof do {проходим в цикле таблицу}

begin

 listbox1.items.add(tableName.FieldByName('USRID').AsString); {добавляем элемент в listbox1}

 tableName.Next; {переходим к следующей записи}

end;

ниже я привел процедуру из моего рабочего кода, в котором я использую эту технологию. Я передаю ей в качестве параметров имя таблицы и имена компонентов listbox1 и listbox2. Я пользуюсь этой процедурой, поскольку у меня есть

несколько таблиц с полями одинакового типа:

procedure TTemplateFrm.buildList(tableName: TTable; SelBox, AvailBox: TListBox);

begin

 {в этой процедуре мы собираемся добавить данные в listbox'ы}

 {получаем любые новые данные}

 tableName.Refresh;

 {Убедимся, что мы смотрим первую запись}

 tableName.First;

 {Теперь очищаем ListBox'ы}

 SelBox.Clear;

 AvailBox.Clear;

 {Теперь добавляем элементы}

 while not tableName.EOF do begin

AvailBox.Items.Add(tableName.fieldByName('USRID').AsString + ' ' + tableName.fieldByName('DESCRIPTION').AsString);

tableName.Next;

 end;

end;

Как перемещать данные между этими двумя списками? Если вы хотите использовать технологию «drag and drop» (перетащи и брось), то в обработчике mousedown вашей исходной таблицы воспользуйтесь процедурой begindrag:

if Button = mbLeft then Tlistbox(sender).BeginDrag(false);

Затем, в вашем другом ListBox, для «опознания» и получения данных создайте следующий обработчик DragOver:

if Source = ListBox1 then Accept := true

else Accept := false;

Не используйте «Accept := (Source is TListbox)», как это показано в большинстве примеров. У вас имеется два компонента ListBox, следовательно, вам нужно сослаться на имя объекта, а не на его тип, а иначе программа просто не поймет кто есть кто.

Затем в обработчике dragDrop поместите следующий код, добавляющий данные в ListBox2 и удаляющий их из ListBox1.

Listbox2.Items.Add(Listbox1.Items[Listbox1.ItemIndex]);

Listbox1.Items.Delete(Listbox1.ItemIndex);

И, наконец, добавьте кнопку «Сохранить», если вы хотите сохранить содержимое ListBox2 в базе данных.

Я надеюсь, что это именно то, что вы искали, и что это окажется вам полезным. Если вы хотите также перемещать данные из ListBox2 в ListBox1, вам необходимо будет создать тот же код, но реверсировать его для получения в коде правильных ссылок на компоненты ListBox.

ListBox — OnChange

Delphi 1

Это было два месяца тому назад. Я нашел это на одном из Delphi-сайтов. Не очень сложно и понятно.

UNIT Lbox;

INTERFACE

USES SysUtils, WinTypes, Messages, Classes, Controls, Graphics, Forms,Menus, StdCtrls;

Type TCngListBox = Class(TListBox)

Поделиться с друзьями: