Списки з drag-and-drop, частина друга C + + Builder

Одна річ дійсно спантеличила мене в програмі перетягування після того, як я її написав Це та ж проблема, якої я був спантеличений і тоді, після початкової версії проекту з drag-and-drop, про який я говорив на початку цього прикладу Проблема в тому, що перетягувати елементи потрапляють в кінець того списку, в який їх притягли Це дратує користувача, який акуратно перемістив мишу до елементу, після якого хоче додати перетягуються, а отримує їх у кінці списку

У другій версії програми перетягування в списках ми вирішимо цю проблему

Вихідний код для другого прикладу програми перетягування в списках знаходиться на супровідному компакт-диску в каталозі Chapter4 \ DragDropList2

Використовуючи код, написаний нами для попереднього прикладу, виправте метод OnDragDrop, щоб він виглядав так:

void __fastcall TForm1::OnDragDrop(TObject *Sender, TObject *Source, int X, int Y)

{

TListBox *pList1 = (TListBox *)Source TListBox *pList2 = (TListBox *)Sender

/ / Який елемент знаходиться під перетягувати POINT p

px = X

py = Y

int nItemIndex = pList2-&gtItemAtPos( p, false )

String s = упускати на елемент: + String (nItemIndex) Label1-> Caption = s

/ / Копіюємо те, що вибрано

for ( int i=0 i&ltpList1-&gtItems-&gtCount ++i ) if ( pList1-&gtSelected[ i ] )

{

/ / Додати у другий список

pList2-&gtItems-&gtInsert(  nItemIndex,

pList1-&gtItems-&gtStrings[ i ] )

/ / І видалити з першого

pList1-&gtItems-&gtDelete( i )

}

}

Зробивши це, ви, по-перше, ставите елемент у коректну позицію в новому списку, а по-друге, реалізуєте список, що дозволяє перетасовувати елементи, перетягуючи їх усередині списку

Зауважте, що ми додали шматочок коду, що відзначає місце, куди елемент потрапляє Причина цього проста Спробуйте перетягнути елемент нижче останнього елемента в списку Ви можете припустити, що метод ItemAtPos зійде з розуму, намагаючись визначити, що за елемент лежить у позиції, яка не належить ні одному елементу Звичайно, я теж цього очікував, коли писав цей приклад, але метод з розуму не зійшов На самому справі, він працює саме так, як я б хотів, повертаючи номер на один більше, ніж число елементів у списку Це чудово працює з методом Insert (вставити) властивості Items (елементи), що належить класу TListBox (список), який, отримавши цей номер, радісно додасть елемент до кінця списку Хм Схоже, хтось вже дійсно думав над цією проблемою

У CBuilder такі приклади зустрічаються всюди в бібліотеці VCL Ви побачите, що рідко потрібно заглядати в велику документацію, так як в основному все працює так, як ви і очікували Іноді десь щось відрізнятиметься, але звичайно в таких випадках ви побачите, що ваша позиція заснована на вашому попередньому досвіді Замість складної методики для реалізації чого-небудь в CBuilder зазвичай використані найпростіші підходи Найпростіші з точки зору програміста

Отже, ви тепер знаєте набагато більше про процедуру drag-and-drop, ніж раніше, може навіть більше, ніж вам хотілося

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*