Вантажимо форми з бази даних або Як зареєструвати клас з його імені (исходники, документація), Документація, Програмування, статті

Ідея зберігання ресурсів форми – файлів dfm – в базі даних не нова. При правильному використанні цього методу, можна зробити досить легко настроюється під вимоги користувача, в плані інтерфейсу, ядро для додатків (для цього потрібно мати редактор форм). Бачені мною реалізації завантаження форм з бази даних мали одне слабке місце: реалізація реєстрації класів. Для правильної завантаження форми повинні бути зареєстровані всі класи, використовувані в цій формі. Раніше реєстрація проходила “напряму”, тобто створювалася процедура, в якій за допомогою процедури RegisterClass, проводилася реєстрація всіх необхідних класів. У даній статті пропонується інший спосіб реєстрації класів: отримуємо імена необхідних класів з ресурсу форма і реєструємо їх по імені.



База даних

В даній статті використовується база даних MS Access, яка містить тільки одну таблицю FRM з полями: CLSNME (текстове поле) – для імені класу форми, FRMDFM (поле MEMO) – для зберігання ресурсу форми. Ресурс форми зберігаємо в текстовому поданні і беремо його з файлу dfm (поставити галочку “Text DFM” в контекстному меню форми в редакторі форм Delphi).


Завантаження форми з бази даних

Для завантаження ресурсу форми з бази даних помістимо результат запиту до поля FRMDFM в поле класу TBlobField. Приклад створення такого поля можна подивитися у файлі допомоги Delphi для конструктора класу TBlobField. Далі зберігаємо інформацію з цього поля в TMemoryStream. Для того щоб перетворити текст, який ми зберегли в TMemoryStream, до формату ресурсу форми скористаємося функцією ObjectTextToResource. Після цього можна створювати форму за допомогою функції ReadComponentRes класу TMemoryStream. Текст коду, відповідального за завантаження форми, дивися у доданому прикладі (функція TFormLoader.LoadForm, файл UntDynamicLoad).

Реєстрація класів.

Після того як ми вважали ресурс форми в TMemoryStream і перед її створенням з цього ресурсу за допомогою функції ReadComponentRes повинні бути зареєстровані всі класи, використовувані в завантажується формі. Отримати всі ці класи можна пропарсів ресурс форми в його текстовому вигляді (кожне ім’я класу стоїть після двокрапки в рядку зі словом object).

Далі потрібно зареєструвати цей клас, якщо він раніше не був зареєстрований.

Клас реєструється за допомогою процедури RegisterClass (AClass: TPersistentClass). Після того як ми пропарсілі ресурс форми ми маємо тільки ім’я класу. Delphi не надає стандартних процедур реєстрації класу по його імені (одержання покажчик на клас за допомогою функції GetClass (const ClassName: string), якщо він ще не зареєстрований, природно не можна).

Я досить довго шукав спосіб зробити це. У російськомовному інтернеті я так нічого і не знайшов. Спосіб був знайдений на http://www.tamaracka.com/ (Search Borland * Newsgroups: Ludovic Dubois Classes Hack). Ludovic Dubois запропонував код, який з виконуваного файлу і файлів bpl може витягнути покажчики на класи (TClass) за їх імені (або отримати всі класи визначені в exe і bpl). Природно, якщо проект не використовує runtime packages, тобто всі пакети будуть зв’язані прямо в виконуваний файл, достатньо дивитися тільки exe-файл. В іншому випадку, необхідно переглядати всі використовувані runtime пакети (Отримати їх список за допомогою EnumModules не складає труднощів). Код Ludovic Dubois включений в доданий приклад з додаванням визначення деяких використовуваних ним типів.

Приклад програми, що завантажує форму з бази даних.

Всі функції для роботи із завантаженням форми винесені в окремий не візуальний клас TFormLoader (файл UntDynamicLoad). Функції POSearchClasses, POSearchClassesCallBack належать Ludovic Dubois і служать для отримання TClass з exe або bpl файлів по його імені. Проект налаштований на використання runtime packages. Функція CollectAllPackages повертає список всіх використовуваних модулів (вони будуть проглядатися на предмет входження в них шуканого класу). Функція LoadForm власне створює і завантажує форму з бази даних.

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


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

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

Ваш отзыв

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

*

*