Най-добрите ИТ решения за бизнеса. Създаване на потребителски интерфейс с помощта на интерфейси в Delphi

Създаване интерфейспотребителят е сведен до избиране от палитрата от компоненти на Delphi компонентите, необходими за работата на програмата, обслужващи интерфейсуправление, както и интерфейспоказване на информация и прехвърлянето й във формуляра с последващо оформление.

Потребителският интерфейс, който създавате, трябва да използва стандартни елементи, познати на потребителите, и да осигурява максимално удобство. Всичко това в крайна сметка се определя от такъв критерий като ефективността на интерфейса - максимални резултати с минимални усилия.
Принципите за създаване на удобен за потребителя интерфейс са известни. Като най общи принципипри създаване потребителски интерфейсиМогат да се разгледат три основни момента:

  1. Програмата трябва да помага за изпълнението на задача, а не да се превръща в тази задача.
  2. Когато работите с програмата, потребителят не трябва да се чувства като глупак.
  3. Програмата трябва да работи по такъв начин, че потребителят да не смята компютъра за глупак.
Първи принцип- това е така наречената "прозрачност" на интерфейса. Потребителският интерфейс трябва да бъде интуитивен, лесен за научаване и да не създава проблеми на потребителя, които той ще трябва да преодолява по време на работния процес. Използвайте стандартни, без излишна украса, компоненти, използвайте познати, използвани подобни програмитехники за управление и ще постигнете критериите за ефективност първи принцип.

Втори принципе да пренебрегнем интелектуални способностипотребители. От моя собствен опит знам, че често потребителите не само не знаят как да работят на компютър, но просто се страхуват да направят нещо сами. Следователно потребителският интерфейс трябва да бъде възможно най-приятелски настроен.
Освен това страховете на потребителите често са оправдани, тъй като цената на програмата и дори на самия компютър не може да се сравни с цената, например, на база данни, създадена в продължение на много години усилия. Ето защо, когато създава потребителски интерфейс, програмистът винаги трябва да вгради в програмата „безупречна защита“ - срещу неправилни действия и въвеждане на неверни данни от потребителя. Но някои програмисти се увличат твърде много от подобна защита, правят я твърде натрапчива и в резултат на това работата на програмата прилича на известното „една крачка наляво, една стъпка надясно се счита за бягство“! И това, което програмистът създава като решение на проблем, самото започва да създава проблеми.
Да се ​​съобразява втори принципняма нужда да позволявате на програмата да „коригира“ действията на потребителя и да посочи как точно трябва да действа, принуждавайки го в тясна рамка. Освен това не трябва да се увличате твърде много с показването на информационни подканващи съобщения, особено диалогови, тъй като това отвлича вниманието на потребителя от работата. Би било по-добре да предоставите възможност за пълно деактивиране на подсказките.

Трети принципе да се създаде програма с възможно най-високи "умствени" възможности. Въпреки бързото развитие компютърна техника, дори масово използваните програми могат много условно да се нарекат притежаващи изкуствен интелект. Те пречат на изживяването на потребителя чрез показване диалогови прозорцис глупави въпроси, които предизвикват объркване дори в най-простите ситуации. В резултат на това потребителите възкликват в сърцата си: „Каква глупава машина!“
Мен лично ме дразнят непрекъснатите въпроси от почти всички текстови редакториза това дали да запазите променения текст, въпреки че оригиналният и текущият текст не се различават по никакъв символ. Да, написах нещо, но след това върнах всичко обратно, наистина ли е невъзможно да го разбера! Трябва да проверя дали все пак не съм развалил нещо.

Опитайте се да се придържате към следните правила:

Стандартни елементи на интерфейса
Използвайте стандартните за на този елементинтерфейсни компоненти. Срещайки вашата програма, потребителят няма да губи време да се опознае, а веднага ще започне работа - това е един от признаците на професионално направена програма.
Малка палитра от инструменти
Опитайте се да не използвате твърде много различни компоненти. И естествено, след като сте използвали един стандартен компонент някъде на едно място, в подобен случай също го използвайте.
Еднакво разстояние между контролите
Поставете интерфейсните елементи на еднакво разстояние един от друг. Безразборно разпръснатите компоненти създават усещането за непрофесионално изработен продукт. И обратното, внимателно провереното разположение на бутони, превключватели, квадратчета за отметка и други компоненти, които изграждат интерфейса във формуляра, е знак за висококачествена работа.
TabOrder. "Правилна" поръчка
TabOrderе редът, в който курсорът на екрана се движи през контролите при натискане на клавиш Таб. В правилно написана програма курсорът се движи, следвайки логиката на работа на потребителя с програмата. Когато създава програма, програмистът често променя компонентите, премахва някои и добавя други, ако е необходимо. В резултат на това в готовата програма курсорът скача хаотично около формата. След като завършите програмата, не забравяйте да конфигурирате TabOrder.
Избор на шрифт
Просто оставете шрифтовете. Шрифтовете по подразбиране на Delphi са подходящи за всяка система, на която може да работи вашата програма. Използвайте получер шрифт само за подчертаване на важни елементи. Приложение курсиви особено подчертаване, което потребителят може да обърка с хипервръзка, е лоша форма.
Избор на цветове
Що се отнася до цветовете на елементите на интерфейса, както и в случая с шрифтовете, по-добре е да ги оставите стандартни по подразбиране. Delphi използва системната палитра на Windows и потребителят може лесно да персонализира цветовете, като я промени.
Алтернативно управление
Професионално направената програма трябва да може да се управлява не само с мишката, но и с клавиатурата. Не трябва да има функции, които могат да се изпълняват само с мишката (рисуване с графични редакторине се брои!). За най-използваните функции трябва да предоставите „горещи клавиши“ за бърз достъп.
Интерфейсни тухли
Що се отнася до специфичните елементи на потребителския интерфейс, качеството на взаимодействието на потребителя с програмата зависи от:
  • съответствие на управляващия елемент със задачата, която изпълнява;
  • правила, по които управляващият елемент работи.
    Тази страница обсъжда правилата за създаване на някои елементи на интерфейса.
А сега искам да покажа какви инструменти предлага Delphi за управление на компоненти във формуляра, тяхната относителна позиция и поведение на курсора при натискане на клавиш Таб.

За да позиционирате компонентите един спрямо друг в в правилния ред, на първо време необходимо е да ги подчертаем. Можете просто да кръгнете областта на формуляра, която съдържа избраните компоненти. Или като задържите " Shift", използвайте същата мишка, за да посочите всеки компонент, който да бъде избран. Щракнете отново с мишката върху избрания компонент (докато натискате " Shift") премахва избора му.

Избраните компоненти могат да се управляват като едно цяло - да се преместват във формуляра, да се присвояват стойности на същите свойства, да се копират (за инсталиране, например, на друг формуляр), дори да се изтриват.

Сега щракнете щракнете с десния бутонедин от компонентите и от изскачащото меню изберете Позиция -> Подравняване...Ще се появи диалогов прозорец, който ви позволява да регулирате хоризонталната и вертикалната позиция на компонентите в групата. Например, трябва да подравним нашите четири бутона вляво и да се уверим, че имат еднакво вертикално разстояние между тях. За да направите това, изберете радио бутоните Хоризонтално: леви страниИ Вертикално: Равно пространство.

Като изберете арт Център, ще подредим компонентите така, че техните центрове да са разположени на една и съща линия хоризонтално или вертикално, а елементът Център в прозорецапремества компоненти в центъра на прозореца, също хоризонтално или вертикално.

В същия ред на менюто Таб Оред...кара да се появи диалогов прозорец, който контролира как курсорът се движи през елементите на интерфейса при натискане на клавиш Таб. Когато формулярът се появи на екрана, курсорът естествено ще бъде върху компонента, разположен на първия ред на диалоговия прозорец. И след това ще се премести надолу в списъка. В диалоговия прозорец две сини стрелки нагоре и надолу контролират позицията на избрания компонент. Изберете необходимия компонент, използвайте стрелките, за да го преместите на желания ред в списъка и т.н.

При избор на елемент от менюто Контрол ->Появява се подменю, състоящо се от два елемента:

  • Изведете отпред
  • Изпрати назад
Това са компонентни методи, които също са достъпни програмно. Button1.SendToBackпремества бутона на „фон“ и Button1.BringToFront- на „преден план“. Тоест, ако един компонент е позициониран над друг, тези методи разменят позициите си. Случаите, в които това може да се приложи, са доста очевидни.

Статията е написана въз основа на резултатите от анализи на програми, написани от млади разработчици от нашата група.

Подреждаме правилно последователността на превключване на компонентите

Много потребители, особено тези, които преди това са работили в DOS, имат навика да превключват между полетата за въвеждане не с мишката, а с помощта на клавиатурата с клавиша Tab. Освен това е много по-бързо от избирането на всяко поле с мишката. Следователно редът на превключване на компонентите трябва да бъде зададен правилно. Това се отнася както за компонентите във всички контейнерни компоненти (панели, GroupBoxes и други подобни), така и за самите контейнерни компоненти, ако има няколко от тях във формуляра.

Редът на превключване на компонентите вътре в контейнера се определя от свойството TabOrder. Първият става активен компонент, чийто TabOrder е 0, вторият с 1 и т.н., докато всички компоненти бъдат итерирани. В допълнение, компонентът има свойство TabStop, което показва дали компонентът ще получи фокус при превключване с клавиша Tab. Ако трябва да забраните превключването към някой компонент, задайте неговия TabStop = false. В този случай можете да превключите към този компонент само с помощта на мишката.

Има случаи, когато потребители, които са свикнали да превключват с определен ключ в една програма, по навик продължават да го използват в други. Това често се случва с потребители на 1C, където клавишът Enter може да се използва за навигация през полетата за въвеждане. Е, ние ще им дадем такава възможност в нашите програми, ако поискат. Задайте свойството KeyPreview на формата на true и напишете манипулатор на събитие OnKeyPress:

Процедура TForm1.FormKeyPress(Sender: TObject; var Key: Char);
започвам
if ord(key)=vk_Return тогава
Form1.SelectNext(PriemForm.ActiveControl, true, true);
край;

Този манипулатор осигурява навигация през елементи на формуляр, когато се натисне клавишът Enter. Трябва да се отбележи, че подобен методняма да работи с бутони, защото... натискането на Enter върху бутон води до щракване върху него, докато натискането на Tab дава фокус на въвеждането към следващия компонент в последователността за превключване.

Бутони по подразбиране

Всички същите потребители бързо свикват с факта, че в диалоговите прозорци на приложенията по правило можете да потвърдите избора си с клавиша Enter и да отмените с клавиша Esc. Нека не ги разочароваме в нашите програми, особено след като е много лесно да се направи. За бутон, който отговаря на Enter, задайте свойството по подразбиране на true. За бутона, който отговаря на Esc, задайте свойството Cancel на true. това е всичко

Да или не

Всички диалогови прозорци, изискващи потребителски действия, трябва да имат поне два бутона: потвърждаване на действието и отхвърляне на действието (Да/Не, Запазване/Отказ и т.н.). Действието може да бъде отменено чрез затваряне на прозореца с бутона [X] в заглавието на прозореца. Недопустимо е да има само един бутон за потвърждаване на действието, а за отказ се предполага затваряне на прозореца с бутона [X] в заглавието или изобщо няма възможност за отказ. Това обърква потребителя, повдигайки логичен въпрос: как да откажа?

Също така не забравяйте казаното по-горе в параграфа „Бутони по подразбиране“.

Всички диалогови прозорци трябва да се отварят в центъра на екрана

Центрирани, а не там, където са създадени в режим на проектиране. Първо, той е по-визуален и второ, автоматично елиминира проблема с различните разделителни способности на екрана за различните потребители.

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

Размерите на прозорците не трябва да надвишават размера на екрана

Няма начин. Срамота е, когато част от прозореца излиза извън екрана. Това изискванене зависи от разделителната способност на екрана на потребителя, т.е. извинения като „Нека зададат по-висока резолюция“ не работят.

Правилно преоразмеряване на прозоречните елементи

Елементите на прозореца трябва да преоразмеряват или да се движат правилно, когато прозорецът се преоразмерява, когато прозорецът се увеличава и когато прозорецът се възстановява след максимизиране.

Винаги всичко се вижда

Намаляването на размера на прозореца не трябва да води до изчезването на елементите на прозореца и за предпочитане не трябва да води до появата на ленти за превъртане (скролери) на самия прозорец. Можете да ограничите минималните размери на прозореца, така че всички елементи да са видими и достъпни. Ако не е възможно да поставите компоненти така, че да се виждат всички в прозореца, можете да използвате отметки (като PageControl), за да разделите компонентите на групи. Също така не пренебрегваме извиненията относно разделителната способност на екрана.

Съвети навсякъде, съвети винаги

За бутоните, особено на лентите с инструменти (като ToolBar), трябва да се уточнят подсказките, така че винаги да е ясно защо е необходим този или онзи бутон.

Цветова гама

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

Заключение

Има много добър метод, който ви позволява да намерите недостатъци в програмата като цяло и в интерфейса по-специално. Просто е: представете си себе си на мястото на потребителя и половин час се опитайте да работите по начина, по който той работи. Още по-добре, ако вашият потребител е в обсега (например работи в същата организация). В този случай седнете до него или още по-добре вместо него и се опитайте да му свършите работата. Въведете данни, променете ги, покажете отчети и т.н. Ако не знаете как да го направите правилно, попитайте вашия потребител. Не само една или две операции от същия тип, както в режим на отстраняване на грешки, но 20-30 или дори повече различни операции, в различен ред. Забравете да въведете нещо или го въведете неправилно и вижте как програмата реагира на това. Бързо ще видите слабостите на вашата програма.

Авторът на статията автоматизира работата на приемната комисия в университета и през първата година от въвеждането на програмата той прекарваше 3-4 часа на ден в приемната комисия, регистрирайки кандидатите, попълвайки личните им данни и ги издавайки отчети за положени изпити. А в оставащото работно време коригира грешки и недостатъци. Повярвайте ми, през следващата година практически няма да останат проблеми. Същото се случи и при въвеждането на модула за персонал.

Затова имайте предвид потребителското изживяване. Направете им лесна и приятна работа с вашите програми.

Това е статия, базирана на въпроси във форумите: „Как мога да върна низ от DLL?“, „Как да предам и върна масив от записи?“, „Как да предам формуляр към DLL?“.

За да не прекарате половината си живот в измисляне, в тази статия ще донеса всичко на тепсия.

Темите на тази статия са били засягани повече от веднъж в този блог в различна степен, но в тази статия те са събрани заедно и обосновани. Накратко, можете да хвърлите връзка към тази статия на тези, които разработват DLL файлове.

Важна забележка: статията трябва да се прочете последователно. Примерите за кодове са предоставени само като примери, на всяка стъпка (точка) от статията примерният код се добавя с нови подробности. Например, в самото начало на статията няма обработка на грешки; посочени са „класически“ методи (като използване на GetLastError, конвенцията sdtcall и т.н.), които се заменят с по-адекватни с напредването на статията. Това беше направено така, че „новите“ („необичайни“) дизайни да не повдигат въпроси. В противен случай ще е необходимо да вмъкнете бележка за всеки пример като: „това се обсъжда в този параграф по-долу, а това се обсъжда в този параграф.“ Във всеки случай в края на статията има връзка към готов код, написан, като се вземе предвид всичко, казано в статията. Можете просто да го вземете и да го използвате. И статията обяснява защо и защо. Ако не се интересувате от „защо и защо“, превъртете до края до заключението и линка за изтегляне на примера.

само за резултата

стриктно спазване на сроковете

Прозрачност

изпълнение на проекта

техническа поддръжка като подарък

Програмиране, модификации, консултации по 1C

Как работим

1. Обсъждаме проблема по телефона. В зависимост от наличността отдалечен достъп- покажете на екрана на вашия компютър.

2. Ние оценяваме работата в рубли, ако проектът е голям; ако не, приблизителният брой часове.

3. Свършваме работата.

4. Приемате работата във вашата програма, ако има недостатъци, ние ги коригираме.

5. Ние издаваме фактура, Вие плащате.

Разходи за работа

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

3. За работа над 10 часа се изготвя предварително техническо задание с описание и стойност на работата. Работата започва след съгласуване на техническите спецификации с Вас.

Техническа поддръжка

1. Ако откриете грешки в предварително приета работа в рамките на 3 месеца, ние ги коригираме безплатно.

2. За редовни клиентиКоригираме всички недостатъци в работата си безплатно в рамките на една година.

Софтуер за управление на вашия бизнес.

Купете 1C:Enterprise

Ние сме официален дилър на 1C, можете да закупите различни софтуерни продуктии лицензи. В допълнение към закупуването на „кутията“, ние ще ви помогнем да настроите програмата, ще предоставим съвети и ще направим основни настройки.

  • Счетоводство
  • Автоматизация на магазина
  • Продажби на едро
  • Помощ при инсталиране и първоначална настройкавключено в пакета!
  • Фина настройка на конфигурациите според нуждите на клиента, разработване на нови модули при липса на необходимите функции в стандартната конфигурация.
1C: Счетоводство 1C: Управление на търговията 1C: Търговия на дребно 1C: Заплата и управление на персонала
От 3300 rub. От 6700 rub. От 3300 rub. От 7400 rub.

Предоставяне на сървър.

Незабавна настройка на сървър + 1C.

Няма сървър? Няма проблем, ние ще изберем и бързо ще настроим сървър в облака. За малка таксаполучавате много надеждно решение.

  • Наличност 24\7
  • Няма нужда да пазите своя системен администратор(спестените ще покрият разходите ви за сървър).
  • Бърза настройка и инсталиране на 1C на сървъра, след 3 дни вече ще имате напълно работеща система.
  • Можете да се преместите в локален сървър, ако решението не е задоволително.

SMS от вашия 1C

Искате ли вашите клиенти да научават за промоции и отстъпки? Клиентите не се ли връщат? Настройте изпращането на SMS директно от 1C!

Нашата компания ще може бързо да настрои изпращането на SMS до вашите клиенти директно от 1C. Примери за събития, които могат да бъдат автоматизирани:

  • Благодаря за покупката и бонусите се присъждат веднага след следващата покупка.
  • Начисляване на бонуси към картата като подарък за рожден ден/друг значим ден или празник.
  • Известие за пристигане на стоки в склада.
  • Изтичане на бонусите за подарък.
  • Известие за получаване на авансово плащане и резервация на стоки.
  • Адрес с упътване до магазин/офис, телефони.
  • и т.н.

Настройката в 1C може да се извърши от нашите специалисти или вашите служители. Можете да видите тарифите на страницата SMS тарифи.

  • Гарантирана доставка на SMS, пари се таксуват само за доставени SMS.
  • Отделна цена за всеки SMS.
  • Попълнете баланса си по различни начини.
  • Вижте историята на всички изпратени SMS по всяко време.
  • Вместо това име на изпращача цифров номерв телефона на получателя на съобщението.

Имам проблем с използването на клас Delphi от C++ код. delphi dll демо, което експортира функция, която връща обект.
моят Delphi Dll код изглежда така:

Библиотека DelphiTest; // използва част.... тип IMyObject = интерфейсна процедура DoThis(n: Integer); функция DoThat: PWideChar; край; TMyObject = class(TInterfacedObject,IMyObject) procedure DoThis(n: Integer); функция DoThat: PChar; край; // Реализация на TMyObject отидете тук ... процедура TMyObject.DoThis(n: Integer); begin showmessage("вие извиквате DoThis метода с "+intToStr(n) +"параметър"); край; функция TMyObject.DoThat: PChar; start showmessage("вие извиквате функцията DoThat"); Резултат:= Pchar("Hello im Dothat"); край;

// експортиране на DLL функция:

Функция CreateMyObject: IMyObject; stdcall; експортиране; var txt: текстов файл; започнете AssignFile(txt,"C:\log.log"); Нулиране (txt); Writeln(txt,"здравей"); Резултат:= TMyObject.Create; край; експортира CreateMyObject;

в моя C++ проект декларирах интерфейса IMyObject така:

Клас 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); // пропуск !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANCE)hLib, "CreateMyObject "); if (pfnCreate == NULL) ( DWORD errc = GetLastError(); printf("%u\n", errc); // получава грешка 127 ) else( printf("успешно зареждане\n"); ) IMyObject* objptr = pfnCreate(); objptr->DoThis(5); int_s("%i", &in);

в този пример получих грешка по време на изпълнение, когато се опитам да осъществя достъп до експортираната функция. грешки в реда:
IMyObject* objptr = pfnCreate();

Можете ли да ми кажете какво не е наред с моя пример.
и ако е възможно, всеки работещ пример за достъп до Delphi клас (в DLL) от C++ код.

Решение

Първият проблем е извикването на конвенцията на метода. Delphi интерфейсизползва регистър, който е специфична за Delphi конвенция за извикване. използване на stdcall Например, за интерфейсни методи.

Следващият проблем е в C++. Вашият C++ интерфейс трябва да произлиза от IUnknown Освен това не трябва да декларира конструктор или деструктор.

Отделно от това, вашият Delphi код се експортира от PWideChar, който не е картографиран към char* Той се картографира към wchar_t*.

Ако погледнем по-нататък, връщането на PChar работи добре тук, защото вашата реализация връща литерал. Но по-сериозният код вероятно ще иска да използва динамично разпределен низ, в който момент вашият дизайн е дефектен.

Моля, обърнете внимание, че за да създадете файл в root системен дискТрябва да сте администратор с повишени права. Така че това е друга потенциална точка на провал.

Очаквам да има и други грешки, но това е всичко, което открих досега.