Лабораторная работа: Створення проекту з використанням технології Drag&Drop та контекстних підказок
if(Sender as TControl<> Source) then Accept := Source is TListBox else Accept := False;
end;
У ньому спочатку перевіряється, чи не є даний об'єкт (Sender ) і об'єкт-джерело (Source ) тим самим об'єктом.
Це зроблено, щоб уникнути перетаскування інформації усередині того самого списку.
Значення параметра Accept , що задається в обробнику події OnDragOver , визначає вигляд курсору, що переміщається при перетаскуванні над даним об'єктом. Цей вигляд показує користувачу, чи може даний об'єкт прийняти інформацію, що передається. Якщо в об'єкті не описаний обробник події OnDragOver , то вважається, що даний об'єкт не може прийняти інформацію від об'єкта-джерела.
Процедура прийому інформації від об'єкта-джерела, записується в обробнику події OnDragDrop об'єкта-приймача. Ця подія настає, якщо після перетаскування користувач відпустив клавішу миші над даним об'єктом. В обробник цієї події передаються параметри Source (об'єкт-джерело) і X і Y координати курсору. Якщо продовжити приклад перетаскування інформації з одного списку в іншій, то обробник події OnDragDrop може мати вигляд:
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
(Sender as TListBox).Items.Add((Source as TListBox).Items[(Source as TListBox).ItemIndex]);
end;
У цьому обробнику рядок, що виділений у списку-джерелі (Source as TListBox).Items[(Source as TListBox).ItemIndex] , додається в список-приймач методом (Sender as TListBox).Items.Add . Використовується операція as , яка дозволяє розглядати параметри Sender і Source як вказівники на об'єкт класу TListBox . Це робиться тому, що ці параметри є оголошені у заголовку процедури як вказівники на об'єкти класу TObject . Але в класі TObject немає властивостей Items і ItemIndex, які нам потрібні. Ці властивості є визначені в класі TListBox , що є нащадком TObject . Тому з параметрами Sender і Source у даному випадку треба оперувати як із вказівниками на об'єкти TListBox , що і виконує операція as .
У даному випадку можна було б не використовувати параметр Sender , замінивши (Sender as TListBox) просто на ListBox1 . Але запис оператора в загальному вигляді за допомогою параметра Sender дозволяє скористатися таким обробником і для інших об'єктів ListBox , якщо вони є в ужитку.
Після завершення чи припинення перетаскування настає подія OnEndDrag , в обробнику якої можна передбачити якісь додаткові дії. Також пов'язана з перетаскуванням подія OnStartDrag , що дозволяє зробити якісь операції на початку перетаскування, коли іншим способом цей момент не можна зафіксувати.
Таким чином, якщо в ужитку є кілька списків і потрібно задати можливість копіювання рядків кожного з цих списків у будь-який іншій, те це вимагає двох операцій:
1. Написати для одного списку обробник події OnDragOver . Для всіх інших списків указати для події OnDragOver цей же обробник (виділивши у формі всі списки, що залишилися).
2. Написати аналогічним чином для всіх списків обробник події OnDragDrop .
Якщо починати перетаскування потрібно тільки при виконанні якої-небудь додаткової умови, наприклад, при натисканні клавіші Alt, то буде потрібно задати для всіх списків значення властивості DragMode , рівне dmManual і написати обробник події OnMouseDown .
Контекстна підказка
програмування контекстна підказка
Контекстна підказка - це невелике віконце з текстом, яке з'являться за деякий час після наведення курсору миші на певний об'єкт на формі. Для різних об'єктів текст може бути різним, тому підказка називається контекстною.
Для створення такої підказки у програмі слід задати значення властивості Hint (рядкового типу) для відповідного об'єкта, а також установити у True значення його властивості ShowHint. Ці дії можна виконати як у процесі проектування так і програмно.
Завдання
Написати програму, яка показує можливості технології Drag&Drop для заданих об'єктів - джерела та приймача. Необхідну інформацію для користувача програми оформити у вигляді контекстної підказки.
Варіанти завдання
1. Edit StringGrid.
2. ListBox ListBox.
3. StringGridMemo.
4. MemoRichEdit.
5. ListBoxListView.