Delphi використання інтерфейсів. Найкращі IT-рішення для бізнесу. Коректна зміна розмірів віконних елементів

Однією і найбільш сильних сторінсереди програмування Delphiє її відкрита архітектура, завдяки якій Delphi допускає свого роду метапрограмування, дозволяючи програмувати середовище програмування. Такий підхід переводить Delphi на якісно новий рівень систем розробки додатків і дозволяє вбудовувати до цього продукту додаткові інструментальні засоби, що підтримують практично всі етапи створення прикладних систем. Такий широкий спектр можливостей відкривається завдяки реалізованій в Delphi концепції так званих відкритих інтерфейсів, які є сполучною ланкою між IDE (Integrated Development Environment) та зовнішніми інструментами.

Ця стаття присвячена відкритим інтерфейсам Delphi і є огляд можливостей, що ними представляються. У Delphi визначено шість відкритих інтерфейсів: Tool Interface, Design Interface, Expert Interface, File Interface, Edit Interface та Version Control Interface. Навряд чи в рамках цієї статті нам вдалося б детально висвітлити та проілюструвати можливості кожного з них. Більш ґрунтовно розібратися в цих питаннях вам допоможуть вихідні тексти Delphi, благо розробники забезпечили їх розгорнутими коментарями. Оголошення класів, що представляють відкриті інтерфейси, містяться у відповідних модулях у каталозі...\Delphi\Source\ToolsAPI. Design Interface (модуль DsgnIntf.pas) надає засоби для створення редакторів властивостей та компонентів.

Редактори властивостей та компонентів – це тема, гідна окремої розмови, тому нагадаємо лише, що редактор властивості контролює поведінку Інспектора Об'єктів при спробі змінити значення відповідної властивості, а редактор компонента активізується при подвійному натисканні лівої кнопки миші на зображенні вміщеного на форму компонента. Version Control Interface (модуль VCSIntf.pas) призначений створення систем контролю версій. Починаючи з версії 2.0 Delphi підтримує інтегровану систему контролю версій Intersolv PVCS, тому в більшості випадків у розробці власної системи немає необхідності. Тому розгляд Version Control Interface ми також опустимо. File Interface (модуль FileIntf.pas) дозволяє перевизначити робочу файлову систему IDE, що дозволяє вибору власного способу зберігання файлів (у Memo-полях на сервері БД, наприклад). Edit Interface (модуль EditIntf.pas) надає доступ до буфера вихідних текстів, що дозволяє проводити аналіз коду та виконувати його генерацію, визначати та змінювати позицію курсора у вікні редактора коду, а також керувати синтаксичним виділенням вихідного тексту.

Спеціальні класи надають інтерфейси до поміщених на форму компонентів (визначення типу компонента, отримання посилань на батьківський та дочірні компоненти, доступ до властивостей, передача фокусу, видалення тощо), до самої форми та ресурсного файлу проекту. Також Edit Interface дозволяє ідентифікувати так звані модульні нотифікатори, що визначають реакцію такі події, як зміна вихідного тексту модуля, модифікація форми, перейменування компонента, збереження, перейменування чи видалення модуля, зміна ресурсного файлу проекту тощо. Tool Interface (модуль ToolIntf. pas) надає розробникам кошти для отримання загальної інформаціїпро стан IDE та виконання таких дій, як відкриття, збереження та закриття проектів та окремих файлів, створення модуля, отримання інформації про поточний проект (число модулів та форм, їх імена тощо), реєстрація файлової системи, Організація інтерфейсів до окремих модулів і т.д. На додаток до модульних нотифікаторів Tool Interface визначає add-in нотифікатори, що повідомляють про такі події, як відкриття/закриття файлів і проектів, завантаження та збереження desktop-файлу проекту, додавання/виключення модулів проекту, інсталяція/деінсталяція пакетів, компіляція проекту, компіляція проекту На відміну від модульних нотифікаторів add-in, нотифікатори дозволяють скасувати виконання деяких подій.

Крім того, Tool Interface надає засоби доступу до головного меню IDE Delphi, дозволяючи вбудовувати додаткові пункти. Expert Interface (модуль ExptIntf.pas) є основою створення експертів - програмних модулів, вбудованих в IDE з метою розширення її функціональності. Як приклад експерта можна навести вхід у Delphi Database Form Wizard, що виконує генерацію форми для перегляду та зміни вмісту таблиці БД. Визначивши клас експерта, необхідно подбати про те, щоб Delphi дізналася про нашого експерта. Для цього його потрібно зареєструвати за допомогою виклику процедури RegisterLibraryExpert, передавши їй як параметр екземпляр класу експерта. Як ілюстрацію створимо простий експерт у стилі esStandard, який при виборі відповідного пункту меню Delphi виводить повідомлення про те, що він запущений. Як видно з наведеної вище таблиці, стиль esStandard зобов'язує перекрити шість методів:

Для того, щоб експерт був “приведений у дію”, необхідно вибрати пункт меню Component/Install Component ... , вибрати в діалозі Browse модуль, що містить експерт (у нашому випадку exmpl_01.pas), натиснути ОК і після компіляції пакету dclusr30.dpk у головному меню Delphi у розділі Help має з'явитися пункт Simple Expert 1, під час вибору якого з'являється інформаційне повідомлення “Standard Expert started!”. Чому Delphi поміщає пункт меню експерта до розділу Help, залишається загадкою. Якщо вам не подобається те, що пункт меню з'являється там, де завгодно Delphi, а не там де хочете ви, можливий наступний варіант: створити експерт в стилі add-in, що виключає автоматичне створення пункту меню, а пункт меню додати "вручну" , використовуючи інструмент Tool Interface. Це дозволить встановити місце розташування нового пункту в головному меню довільним чином.

Для додавання пункту меню використовується клас TIToolServices – основа Tool Interface – та класи TIMainMenuIntf, TIMenuItemIntf, що реалізують інтерфейси до головного меню IDE та його пунктів. Примірник ToolServices класу TIToolServices створюється самою IDE за її ініціалізації. Зверніть увагу на те, що відповідальність за звільнення інтерфейсів до головного меню Delphi та його пунктів повністю лягає на розробника. Принагідно трохи ускладнимо функціональне навантаження експерта: при активізації свого пункту меню він видаватиме довідку про ім'я проекту, відкритого в даний моменту середовищі: У цьому прикладі центральне місце займає функція AddIDEMenuItem, що здійснює додавання пункту меню головне меню IDE Delphi. В якості параметрів передаються текст нового пункту меню, його ідентифікатор, ідентифікатор пункту, перед яким вставляється новий пункт, символьне представлення клавіші, яка разом з клавішею Ctrl може використовуватися для швидкого доступу до нового пункту, і обробник події, що відповідає вибору нового пункту. Ми додали новий пункт меню до розділу View перед пунктом Watches.

Тепер познайомимося із нотифікаторами. Визначимо add-in нотифікатор, який відстежує моменти закриття/відкриття проектів і коригує відповідним чином поле, що зберігає ім'я активного проекту (реалізацію методів, які не зазнали змін порівняно з попереднім прикладом, для стислості опустимо): Для реалізації нотифікатора ми визначили клас TIAddInNotifier, і перекрили метод FileNotification. IDE буде викликати цей метод кожного разу, коли відбувається подія, на яку здатний зреагувати add-in нотифікатор (кожна подія позначається відповідною константою типу TFileNotification). Поле Expert у класі TAddInNotifier служить зворотного зв'язку з експертом (метод TAddInNotifier.FileNotification). У деструкторі експерта реєстрація нотифікатора знімається та нотифікатор знищується. А тепер проілюструємо використання модульних нотифікаторів. Створимо add-in експерт, який видає повідомлення про кожен акт збереження проектного файлу (реалізацію вже знайомих нам методів для стислості не наводимо): У цьому прикладі add-in експерт відстежує події, що відповідають відкриттю/закриттю проектів.

При кожному відкритті проекту реєструється модульний нотифікатор, який відповідає файлу проекту. У плані реалізації модульні нотифікатори схожі на add-in нотифікатори: ми визначаємо клас TModuleNotifier, що є нащадком TIModuleNotifier і перекриваємо його методи Notify і ComponentRenamed. IDE викликає метод Notify при виникненні певних подій, що стосуються цього модуля; усередині цього методу і визначається реакція на ту чи іншу подію. Метод ComponentRenamed викликається за зміни імені компонента, що лежить на формі модуля. Ми не використовуємо цей метод, але зобов'язані його перекрити, інакше при зміні імені компонента відбуватиметься виклик абстрактного методу базового класущо призводить до непередбачуваних наслідків.

Реєстрація модульного нотифікатора є більш складним процесом порівняно з реєстрацією add-in нотифікатора: спочатку ми отримуємо інтерфейс модуля (TIModuleInterface), а потім за допомогою інтерфейсу модуля реєструємо нотифікатор. Під час закриття проекту реєстрація модульного нотифікатора знімається (знову з використанням TIModuleInterface) і нотифікатор знищується. Насамкінець покажемо, як можна визначати позицію курсора у вікні редактора коду. Створимо експерт, який при виборі відповідного пункту меню видавав би повідомлення, що містить ім'я активного файлу та позицію курсору в ньому (наведена реалізація тільки суттєвих для даного прикладуМетоди): Для визначення позиції курсору ми повинні отримати наступну послідовність інтерфейсів: модульний інтерфейс (TIModuleInterface); інтерфейс редактора коду (TIEditor Interface); інтерфейс подання модуля у вікні редактора (TIEditView)

Якщо при виборі пункту меню експерта активним є файл з вихідним текстом (*.pas), видається повідомлення, що містить ім'я активного файлу і поточну позицію курсору в ньому. Якщо активним є pas-файл, то повідомлення не видається. Для отримання імені активного файлу використовується метод GetCurrentFile класу TIToolServices. У цьому завершимо розгляд способів використання відкритих інтерфейсів. CD-ROM містить вихідні тексти всіх наведених прикладів. На CD-ROM також міститься складніший і розгорнутий приклад, що містить add-in експерт, що дозволяє користувачеві робити закладки у вихідному тексті Delphi-модулів. Короткий посібник із встановлення та використання Експерта Закладок міститься у файлі bkmrks97.htm. Отже, у цій статті загалом розглянуті відкриті інтерфейси та наведено приклади їх використання. Ще раз повторимо: завдяки наявності вихідних текстів відкритих інтерфейсів ви легко зможете розібратися в деталях, що вас цікавлять. Сподіваємося, що різноманітність можливостей, що надаються відкритими інтерфейсами, породить у вас не одну сміливу та корисну ідею.

Це стаття з мотивів питань на форумах: "Як мені повернути рядок з DLL?", "Як передати та повернути масив записів?", "Як передати в DLL форму?".

Щоб вам не витрачати половину життя на розібратися - у цій статті я принесу все на блюдечку.

Теми цієї статті різною мірою вже не раз торкалися цього блогу, але в цій статті вони зібрані в купу, наведені обґрунтування. Коротше посиланням на цю статтю можна кидатися в тих, хто розробляє DLL.

Важлива примітка: статтю потрібно читати послідовно. Приклади коду наводяться лише як приклади, на кожному кроці (пункті) статті код прикладів додається новими подробицями. Наприклад, на самому початку статті немає обробки помилок, вказуються "класичні" способи (типу, використання GetLastError, угоди sdtcall і т.д.), які під час статті замінюються більш адекватними. Зроблено з тієї причини, щоб " нові " ( " незвичайні " ) конструкції не викликали питань. Інакше довелося б до кожного прикладу вставляти примітку виду: "ось це обговорюється в тому пункті нижче, а ось те - в цьому ось". У будь-якому випадку в кінці статті є посилання на готовий код, написаний з урахуванням всього сказаного в статті. Можете просто його брати та використовувати. А стаття пояснює навіщо та чому. Якщо вам не цікаво "навіщо і чому" - гортайте в кінець до висновку та посилання на скачування прикладу.

Об'єктно-орієнтоване програмування (ООП) крім поняття класу передбачає також фундаментальне поняття інтерфейсу.

Що ж таке інтерфейс та які особливості роботи з ним у мові програмування Delphi?

Інтерфейс - семантична та синтаксична конструкція у коді програми, що використовується для специфікування послуг, що надаються класом або компонентом (Вікіпедія).

По суті, інтерфейс визначає перелік властивостей і методів, які повинні використовуватися при роботі з класом, який цей інтерфейс реалізує, а також їх сигнатуру (назва, тип даних, параметри, що приймаються (для процедур і функцій) і т.д.). Таким чином, клас, який реалізує той чи інший інтерфейс, обов'язково має реалізувати всі його компоненти. Причому у суворій відповідності до того, як вони в ньому описані.

Найчастіше інтерфейси порівнюють з абстрактними класами, але за всієї схожості це порівняння дуже коректно. В абстрактних класах є, як мінімум, управління видимістю членів. У той же час, для інтерфейсів області видимості не визначено.

Інтерфейси дозволяють зробити архітектуру гнучкішою, оскільки уніфікують доступ до того чи іншого функціоналу, а також дозволяють уникнути цілого ряду проблем пов'язаних з успадкуванням класів (інтерфейси також можуть успадковуватися один від одного).

Для оголошення інтерфейсу Delphi служить ключове слово interface. Це теж ключове слово, що визначає секцію модуля, до якої можна звернутися ззовні (між ключовими словами interface та implementation). Однак при оголошенні інтерфейсу застосовується інший синтаксис, схожий на оголошення класів.

Delphi/Pascal

IMyNewInterface = interface procedure InterfaceProc; end;

IMyNewInterface =interface

procedure InterfaceProc;

end;

Таким чином, сам синтаксис оголошення інтерфейсу немає принципових відмінностей з інших мов програмування (особливості синтаксису заснованого на Pascal поза рахунок). У той же час, реалізація інтерфейсів має низку характерних рис.

Справа в тому, що Delphi інтерфейси спочатку були введені для підтримки технології COM. Тому інтерфейс IInterface, який у Delphi є предком всім інших інтерфейсів (свого роду аналог TObject), вже містить у собі три базові методи роботи з цією технологією: QueryInterface, _AddRef, _Release. Як результат, якщо клас реалізує будь-який інтерфейс, він повинен обов'язково реалізувати й ці методи. Навіть якщо цей клас не призначений для роботи COM.

Внаслідок цієї особливості інтерфейсу IInterface, у Delphi використання інтерфейсів, в більшості випадків, призводить до додавання до класу свідомо не використовуваних можливостей.

Існує бібліотечний клас TInterfaceObject, який містить реалізацію цих методів і, при успадкування від нього, необхідність реалізовувати їх самостійно відпадає. Але так як Delphi не підтримує множинне успадкування класів, його застосування часто викликає додаткові складності в проектуванні та реалізації вже необхідного функціоналу.

Все це призвело до того, що, незважаючи на всі можливості, що надаються інтерфейсами, їх практичне застосуванняу Delphi майже не вийшло за межі роботи з COM.

Будучи оптимізованими для роботи головним чином з цією технологією, інтерфейси, а точніше додані ними в обов'язковому порядку функціонал і архітектурні обмеження при вирішенні інших завдань себе не виправдовують.

Тому, багато програмістів Delphi до цих пір, по факту, позбавлені потужного і гнучкого інструменту для розробки архітектури додатків.

тільки за результат

жорстке дотримання термінів

Прозорість

виконання проекту

техпідтримки у подарунок

Програмування, доопрацювання консультації з 1С

Як ми працюємо

1. Обговорюємо проблему телефоном. За наявності віддаленого доступу – показуєте на екрані комп'ютера.

2. Ми оцінюємо роботу в рублях, якщо проект великий, якщо ні - приблизна кількість годин.

3. Ми виконуємо роботу.

4. Ви приймаєте роботу у вашій програмі, якщо є недоліки, ми їх виправляємо.

5. Ми виставляємо рахунок, ви сплачуєте.

Вартість робіт

1. Усі роботи діляться на 3 категорії: консультація, оновлення типової конфігурації, розробка чи програмування нового звіту, обробки, кнопки тощо.

3. На роботи понад 10 годин попередньо складається технічне завдання з описом та вартістю робіт. Роботи розпочинаються після погодження ТЗ із Вами.

Технічна підтримка

1. Якщо ви виявляєте якісь помилки, у раніше прийнятих роботах, протягом 3-х місяців, ми виправляємо їх безкоштовно.

2. Постійним клієнтамБудь-які недоліки, допущені в наших роботах, виправляємо безкоштовно протягом року.

Програми для керування вашим бізнесом.

Придбати 1С:Підприємство

Ми є офіційним дилером фірми 1С, ви можете придбати у нас різні програмні продуктита ліцензії. Крім покупки "коробки" ми допоможемо вам налаштувати програму, проконсультуємо та зробимо базові налаштування.

  • Бухгалтерський облік
  • Автоматизація магазину
  • Оптові продажі
  • Допомога в установці та початковому налаштуванні включена в пакет!
  • Тонка настройка конфігурацій під потреби замовника, розробка нових модулів за відсутності необхідних функцій стандартної конфігурації.
1с Бухгалтерія 1С:Управління торгівлею 1С:Роздріб 1С:Зарплата та Управління Персоналом
Від 3300 руб. Від 6700 руб. Від 3300 руб. від 7400 руб.

Надання сервера.

Моментальне налаштування сервера + 1С.

Нема сервера? Не біда, підберемо і швидко налаштуємо сервер у "хмарі". За невелику платню ви отримуєте дуже надійне рішення.

  • Доступність 24\7
  • Немає необхідності тримати власне системного адміністратора(Економія покриє витрати на ваш сервер).
  • Швидке налаштування та встановлення 1С на сервер, через 3 дні у вас вже буде повністю робоча система.
  • Будь-якої миті можна переїхати на локальний серверякщо рішення не влаштує.

SMS із вашої 1С

Бажаєте щоб клієнти під час дізнавалися про акції, знижки? Клієнти не повертаються? Налаштуйте відправлення SMSпрямо з 1С!

Наша компанія зможе в короткий термін налаштувати відправку SMS Вашим клієнтам безпосередньо з 1С. Приклади подій, які можна автоматизувати:

  • Подяка за купівлю та нарахування бонусів відразу після чергової купівлі.
  • Нарахування бонусів на картку в подарунок на день народження до іншого знаменного або святкового дня.
  • Повідомлення про надходження товару складу.
  • Закінчення терміну подарункових бонусів.
  • Повідомлення про надходження передоплати та резервування товару.
  • Адреса з уточненнями проїзду до магазину, номера телефонів.
  • І т.п.

Налаштування в 1С можна зробити силами наших спеціалістів чи своїх співробітників. Ознайомитись з тарифами можна на сторінці SMS-тарифів.

  • Гарантія доставки SMS, гроші знімаються лише за SMS.
  • Окрема тарифікація кожного SMS.
  • Поповнення балансу у різний спосіб.
  • Перегляд історії всіх відправлених SMS у будь-який момент.
  • Ім'я відправника замість цифрового номера телефону одержувача повідомлення.
2021 wisemotors.ru. Як це працює. Залізо. Майнінг. Криптовалюта.