Навіщо нам потрібно встановлювати заново елементи списку?

Ви могли б подумати, що нам достатньо повідомити списку, що його зображення застаріло і тоді він сам перемалюють, і ви були б праві Проблема в тому, що список Windows занадто розумний Як тільки елемент занесений до списку і встановлено його висота, ця інформація зберігається в самому списку Список не змінить цю інформацію, навіть якщо його дуже добре про це попросити В результаті, коли користувач вибирає новий шрифт для списку, висота якого відрізняється від старого, список, не знаючи про це, не стане перебудовувати елементи Зміни відбуваються один раз: коли елемент додається в список Ми використовуємо факт, що список перетрусить себе при додаванні елементів Ми будемо просто прибирати всі існуючі елементи в списку, встановлювати заново шрифт і вимірювати висоту елементів, вже використовуючи новий шрифт Такий підхід, однак, передбачає знання того, що за елементи в списку і які атрибути з ними асоційовані

Якби ви створювали список загального призначення, вам, ймовірно, потрібно було б тримати чотири окремі масиву обєктів у вашому компоненті Перший містив би текст елемента, другий – растровий малюнок, повязаний з цим елементом Врахуйте, що покажчики на малюнки (bitmap) можуть бути рівні NULL і їх необовязково встановлювати для всіх елементів Третій масив містив би кольору, повязані з елементами, які повинні були бути використані при промальовуванню елемента в списку Останній (четвертий) масив використовувався б для збереження шрифтів, повязаних з елементами, причому знову ж значення можуть бути не встановлені (NULL) і в цьому випадку не застосовуються Краще, ніж тримати чотири масиву (які повинні бути синхронізовані один з одним при додаванні і видаленні елементів), створити свій обєкт C + +, в якому б зберігалися ці атрибути елемента Ось така думка на майбутнє

У нас в прикладі всього два елементи в списку, так що нам простіше стежити за тим, що має бути зображено і з яким малюнком, кольором, шрифтом Ось повна реалізація методу SetListBoxItems, який додає елементи в список:

void  TForm1::SetListBoxItems(void)

{

ListBox1-&gtClear()

/ / Додати елементи в список

ListBox1-> Items-> AddObject (Земля, Fbmp1) ListBox1-> Items-> AddObject (Корабель, Fbmp2)

}

Нічого жахливо складного в цій процедурі немає Насамперед вона видаляє всі існуючі елементи в списку, викликаючи метод Clear обєкта список (TListBox) Потім два елементи додаються в список Якщо ви ніколи раніше не працювали з TListBox і при цьому знайомі з нормальним способом асоціювання даних в програмі з елементами списку, то вас чекає сюрприз Метод AddObject класу TListBox дозволяє програмісту додавати і текст, і асоційовані з ним дані разом Другий параметр функції, в нашому випадку – растровий малюнок, є нетипізовані обєктом Ви можете передавати туди все, що завгодно, якщо тільки ви зможете це потім правильно інтерпретувати Як ви побачите, коли ми дійдемо до коду промальовування списку, нам необхідно зберігати такий же покажчик (або як мінімум успадкований від загального предка), щоб ефективно працювати з такими даними

Джерело: Теллес М – 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>

*

*