Створення інтерфейсу користувача. Рекомендації щодо створення інтерфейсів користувача в Delphi Що таке інтерфейс в Delphi

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

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

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

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

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

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

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

Delphi/Pascal

IMyNewInterface = interface procedure InterfaceProc;

end;

IMyNewInterface =interface

procedure InterfaceProc;

end;

Справа в тому, що 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 у будь-який момент.
  • Ім'я відправника замість цифрового номера телефону одержувача повідомлення.

Стаття написана за результатами розбору програм, написаних молодими розробниками нашої групи.

Правильно розставляємо послідовність перемикання компонентів

Багато користувачів, особливо ті, хто раніше працював у ДОС, мають звичку перемикатися між полями введення не мишкою, а за допомогою клавіатури клавішею Tab. До того ж це набагато швидше, ніж виділяти кожне поле мишею. Тому порядок перемикання компонентів має бути виставлений правильно. Це стосується як компонентів усередині всіх компонентів-контейнерів (панелей, GroupBox-ів та подібних до них), так і самих компонентів-контейнерів, якщо їх на формі декілька.

Порядок перемикання компонентів усередині контейнера визначається властивістю TabOrder. Першим стає активним компонент, у якого TabOrder дорівнює 0, другим з 1 тощо, поки не будуть перебрані всі компоненти. Крім цього, компонент має властивість TabStop, яка показує, чи компонент отримуватиме фокус при перемиканні клавішею Tab. Якщо потрібно заборонити перемикання на будь-який компонент, поставте TabStop = false. У цьому випадку перейти на цей компонент можна буде тільки за допомогою миші.

Трапляються випадки, коли користувачі, які звикли перемикатися певною клавішею в одній програмі, за звичкою продовжують користуватися нею і в інших. Часто це відбувається з користувачами 1С, де для переходу полями введення може використовуватися клавіша Enter. Що ж, дамо їм таку можливість у наших програмах, якщо вони про це просять. Встановлюємо у форми властивість KeyPreview у true та пишемо обробник події OnKeyPress:

Procedure TForm1.FormKeyPress (Sender: TObject; var Key: Char);
begin
if ord(key)=vk_Return then
Form1.SelectNext(PriemForm.ActiveControl, true, true);
end;

Такий обробник забезпечує перехід по елементах форми при натисканні Enter. Слід зазначити, що такий метод працюватиме з кнопками, т.к. Натискання Enter на кнопці призводить до її натискання, тоді як натискання Tab передає фокус введення наступного в послідовності перемикання компоненту.

Стандартні кнопки

Ті ж користувачі досить швидко звикають, що в діалогових вікнах додатків, як правило, клавішею Enter можна підтвердити свій вибір, а клавішею Esc – скасувати. Давайте не розчаровуватимемо їх у наших програмах, тим більше що зробити це дуже просто. Для кнопки, що реагує на Enter, встановлюємо властивість Default у true. Для кнопки, що реагує на Esc, встановлюємо властивість Cancel у true. І все.

Так чи ні

Усе діалогові вікна, що запитують дії користувача, повинні мати принаймні дві кнопки: підтвердження дії та відмови від дії (Так/Ні, Зберегти/Скасувати тощо). Відмова від дії може здійснюватися закриттям вікна кнопкою [X] у заголовку вікна. Неприпустимо, якщо є лише одна кнопка для підтвердження дії, а для відмови передбачається закривати вікно кнопкою [X] у заголовку або можливість відмови взагалі відсутня. Це плутає користувача, викликаючи логічне запитання: як відмовитися?

Також не забуваємо про те, що було сказано вище у пункті "Кнопки за замовчуванням".

Усі діалогові вікна повинні відкриватися по центру екрану

Центр, а не там, де вони були створені в режимі проектування. По-перше, це наочніше, а по-друге, автоматично усуває проблему різного дозволу екрана у різних користувачів.

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

Розміри вікон не повинні перевищувати розмірів екрану

Ні в якому разі. Це неподобство, коли частина вікна вилазить за екран. Ця вимогазалежить від дозволу екрана в користувача, тобто. відмовки типу "Нехай поставлять більшу роздільну здатність" не проходять.

Коректна зміна розмірів віконних елементів

Віконні елементи повинні коректно змінювати свої розміри або переміщатися при зміні розмірів вікна, максимізації вікна і відновлення вікна після максимізації.

Все завжди видно

Зменшення розмірів вікна не повинне призводити до зникнення віконних елементів і бажано не повинно призводити до появи смуг прокручування (scroller-ів) самого вікна. Можна обмежувати мінімальні розміри вікна таким чином, щоб усі елементи були видні та доступні. Якщо немає можливості розмістити компоненти таким чином, щоб усі були видні у вікні, можна використовувати закладки (типу PageControl) для розбиття компонентів на групи. Відмовки щодо дозволу екрану теж не пропускаємо.

Хінти скрізь, хінти завжди

Для кнопок, особливо на панелях інструментів (типу ToolBar) повинні бути задані підказки (hint), щоб завжди було зрозуміло, навіщо потрібна та чи інша кнопка.

Кольорова гама

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

Висновок

Є дуже хороший метод, який дозволяє знайти недоліки програми взагалі та інтерфейсу зокрема. Він простий: уявіть себе на місці користувача і протягом півгодини спробуйте працювати так, як він працює. Ще краще, якщо ваш користувач у межах досяжності (наприклад, працює у тій самій організації). У такому разі сядьте поруч із ним, а краще замість нього, і спробуйте зробити його роботу. Вносити дані, змінювати їх, виводити звіти тощо. Якщо ви не знаєте, як зробити правильно, запитайте свого користувача. Зробіть не одну-дві однотипні операції, як у режимі налагодження, а 20-30, а то й більш різних операцій, в різному порядку. Забудьте щось ввести або введіть неправильно та подивіться, як програма на це відреагує. Ви досить швидко побачите слабкі місця вашої програми.

Автор статті автоматизував роботу приймальної комісії у ВНЗ, і в перший рік впровадження програми по 3-4 години на день проводив у приймальній комісії, реєструючи абітурієнтів, заповнюючи їх персональні дані та надаючи їм звіти про складання іспитів. А в решту робочий часвиправляв помилки та недоліки. Повірте, наступного року проблем практично не залишилося. Аналогічно було і за впровадження кадрового модуля.

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

У мене проблема з використанням класу Delphi із коду C++. delphi dll demo, яка експортує функцію, що повертає об'єкт.
мій код Delphi Dll виглядає так:

Library DelphiTest; // uses part.... type IMyObject = interface procedure DoThis(n: Integer); функція DoThat: PWideChar; end; TMyObject = class(TInterfacedObject,IMyObject) procedure DoThis(n: Integer); функція DoThat: PChar; end; // TMyObject implementation go here ... procedure TMyObject.DoThis(n: Integer); починається showmessage("Ви знайдете цей метод з "+intToStr(n) +"parameter"); end; function TMyObject.DoThat: PChar; починають showmessage("Ви знайдете функцію DoThat"); Result:= Pchar("Hello im Dothat"); end;

// Експорт функції DLL:

Function CreateMyObject: IMyObject; stdcall;export; var txt: TextFile; begin AssignFile(txt,"C:\log.log"); Reset(txt); Writeln(txt, "hello"); Result:= TMyObject.Create; end; exports CreateMyObject;

у моєму проекті C ++ я оголосив інтерфейс IMyObject наступним чином:

Class IMyObject (public: IMyObject(); virtual ~IMyObject(); virtual void DoThis(int n) = 0; virtual char* DoThat() = 0; );

і моя основна функція так:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() ( HMODULE hLib; hLib = LoadLibrary(L"DelphiTest.dll"); assert(hLib != NULL); // pass !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANCE)hLi "); if (pfnCreate == NULL) ( DWORD errc = GetLastError(); printf("%u\n", errc); // it gets error 127 ) else( printf("success load\n"); ) IMyObject* objptr = pfnCreate(); objptr->DoThis(5);

у цьому прикладі я отримав помилку під час виконання, коли я намагаюся отримати доступ до експортованої функції. помилки у рядку:
IMyObject* objptr = pfnCreate();

Ви можете сказати мені, що не так з моїм прикладом.
і, якщо можливо, будь-який робочий приклад для доступу до класу Delphi (DLL) з коду C++.

Рішення

Перша проблема – виклик угоди методів. Інтерфейс Delphi використовує register, який є специфічною угодою про виклики Delphi. Використання stdcall Наприклад, для методів інтерфейсу.

Наступна проблема у C++. Ваш інтерфейс C ++ повинен бути похідним від IUnknown, Крім того, він не повинен оголошувати конструктор або деструктор.

Крім цього, ваш код Delphi експортується PWideChar, який не відображається на char* , він відображається на wchar_t* ,

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

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

Я очікую, що є інші помилки, але це все, що я знайшов досі.

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

Інтерфейс користувача, який Ви створюєте, повинен використовувати стандартні, звичні користувачам елементи, і забезпечувати максимальну зручність. Все це в кінцевому рахунку визначається таким критерієм, як ефективність інтерфейсу - максимальний результат з мінімальними зусиллями.
Принципи створення зручного інтерфейсу відомі. Як самі загальних принципівпри створенні інтерфейсів можна розглядати три основні положення:

  1. Програма повинна допомагати виконати завдання, а не ставати цим завданням.
  2. При роботі з програмою користувач не повинен відчувати себе дурнем.
  3. Програма повинна працювати так, щоб користувач не вважав комп'ютер дурнем.
Перший принцип- Це так звана "прозорість" інтерфейсу. Інтерфейс користувача повинен бути інтуїтивно зрозумілим, простим для освоєння і не створювати для користувача проблем, які він змушений буде долати в процесі роботи. Використовуйте стандартні, без зайвого прикрашання компоненти, застосовуйте звичні, використовувані аналогічними програмами прийоми управління, і Ви досягнете критеріїв виконання першого принципу.

Другий принципполягає у знехтуванні інтелектуальними здібностями користувачів. На власному досвіді мені відомо, що часто користувачі не тільки не вміють працювати за комп'ютером, але й просто бояться зробити щось самостійно. Тому інтерфейс користувача має бути максимально дружнім.
Тим більше, що побоювання користувачів найчастіше виправдані, адже вартість програми та й самого комп'ютера не йде ні в яке порівняння з вартістю, наприклад, створеної багаторічними зусиллями бази даних. Саме тому програміст при створенні інтерфейсу користувача зобов'язаний завжди вбудовувати програму "захист від дурня" - від неправильних дій і введення користувачем невірних даних. Але деякі програмісти надто захоплюються таким захистом, роблять його надто настирливим, і в результаті робота програми нагадує знамените "крок вліво, крок управо вважається втечею"! І те, що програміст створює як вирішення проблеми, саме починає створювати проблеми.
Для дотримання другого принципуне потрібно дозволяти програмі "виправляти" дії користувача та вказувати, що як саме йому діяти, заганяючи у вузькі рамки. Також не слід надмірно захоплюватися виведенням інформаційних повідомлень-підказок, особливо діалогових, це відволікає користувача від роботи. А краще загалом передбачити можливість відключення підказок.

Третій принципполягає в тому, щоб створювати програму з максимально можливими розумовими здібностями. Незважаючи на швидкий розвиток комп'ютерної технікиНавіть широко поширені програми лише досить умовно можна назвати такими, що мають штучний інтелект. Вони заважають роботі користувача, виводячи на екран діалогові вікна з дурними питаннями, що викликають подив навіть у найпростіших ситуаціях. В результаті користувачі в серцях вигукують: "Та й тупа ця машина"!
У мене особисто викликають роздратування постійні питання практично всіх текстових редакторівпро те, чи не зберегти змінений текст, хоча початковий і нинішній текст не відрізняються символом. Так, я щось набирав, але потім повернув все назад, невже не можна збагнути! Доводиться перевіряти, чи не зіпсував я що-небудь.

Намагайтеся дотримуватися таких правил:

Стандартні елементи інтерфейсу
Використовуйте стандартні компоненти для цього елемента інтерфейсу. Зустрівши Вашу програму, користувач не буде гаяти час на знайомство, а відразу приступить до роботи - це одна з ознак професійно зробленої програми.
Невелика палітра інструментів
Намагайтеся використовувати не дуже багато різноманітних компонентів. І звичайно, використовуючи десь в одному місці один стандартний компонент, в аналогічному випадку також застосовуйте саме його.
Одинакова відстань між елементами керування
Розташовуйте елементи інтерфейсу на однаковій відстані між собою. Розкидані абияк компоненти створюють відчуття непрофесійно зробленого продукту. І навпаки, ретельно вивірене розміщення на Формі кнопок, перемикачів, прапорців та інших компонентів, що становлять інтерфейс – ознака якісної роботи.
TabOrder. "Правильний" порядок
TabOrder- це порядок переміщення екранного курсору елементами керування при натисканні клавіші Tab. У правильно написаній програмі курсор переміщається, дотримуючись логіки роботи користувача з програмою. При створенні програми програміст часто змінює компоненти, одні видаляє, інші додає в міру необхідності. В результаті в готовій програмі курсор хаотично скаче за Формою. Завершивши програму, не забувайте налаштувати TabOrder.
Вибір шрифтів
Шрифти просто дайте спокій. Задані за замовчуванням Delphi шрифти підійдуть для будь-якої системи, на якій може працювати Ваша програма. Напівжирний шрифт використовуйте лише для виділення важливих елементів. Застосування ж курсивуі особливо підкреслення, Який користувач може прийняти за гіперпосилання - поганий тон.
Вибір квітів
Що стосується кольорів елементів інтерфейсу, то також, як і у випадку зі шрифтами, краще залиште їх стандартними за замовчуванням. Delphi використовує системну палітру Windows, і користувач, змінивши її, легко налаштує кольори під себе.
Альтернативне управління
Професійно зроблена програма повинна мати можливість керуватися не тільки мишкою, але і з клавіатури. Не повинно бути функцій, доступних для виконання лише мишею (малювання в графічних редакторівне зараховується!). Для функцій, що найбільш використовуються, слід передбачити "гарячі клавіші" для їх швидкого виклику.
Цеглини інтерфейсу
Що стосується конкретних елементів інтерфейсу користувача, то якість взаємодії користувача з програмою залежить від:
  • відповідності елемента управління виконуваної ним задачі;
  • правил, якими функціонує елемент управління.
    На цій сторінці розглядаються правила створення деяких елементів інтерфейсу.
А зараз хочу показати, які інструменти пропонує Delphi для управління компонентами на Формі, їх взаємним розташуванням та поведінкою курсору при натисканні клавіші Tab.

Для того, щоб розташувати відносно один одного компоненти в правильному порядку, спочатку необхідно їх виділити. Можна просто обвести мишкою область на Формі, де містяться вибрані компоненти. Або, утримуючи " Shift", вказати тією ж мишкою кожен компонент, що підлягає виділенню. Повторне клацання мишкою по виділеному компоненту (при натиснутому " Shift") знімає із нього виділення.

Виділеними компонентами можна керувати як єдиним цілим - пересувати за формою, присвоїти значення однаковим властивостям, скопіювати (для встановлення, наприклад, на іншу форму), навіть видалити.

Тепер клацніть правою кнопкоюпо одному з компонентів, і з "випливаючого" меню виберіть Position -> Align...З'явиться діалогове віконце, що дозволяє налаштувати положення компонентів групи по горизонталі і вертикалі. Наприклад, нам потрібно вирівняти наші чотири кнопки лівим краєм і зробити так, щоб між ними була однакова відстань по вертикалі. Для цього виділимо радіокнопки Horizontal: Left sidesі Vertikal: Space equally.

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

У цьому меню рядок Tab O rder...викликає появу діалогового вікна, керуючого переміщенням курсору елементами інтерфейсу при натисканні клавіші Tab. У момент появи Форми на екрані курсор перебуватиме, природно, на компоненті, що знаходиться на першому рядку діалогового вікна. І далі переміщатиметься вниз за списком. На діалоговому вікні дві сині стрілочки "вгору" і "вниз" керують положенням виділеного компонента. Виділяйте потрібний компонент, стрілками переміщуйте на потрібну сходинку у списку, і так далі.

При виборі пункту меню Control ->з'являється підменю, що складається з двох пунктів:

  • Bring to Front
  • Send to Back
Це методи компонента, доступні програмно. Button1.SendToBackпереміщає кнопку на "задній план", а Button1.BringToFront- На "передній план". Тобто, якщо один компонент знаходиться над іншим, ці методи змінюють їх місцями. Випадки, в яких це може бути застосовано, досить очевидні.