Советы по Delphi

         

Двойной 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. [001507]



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