Наследяване на интерфейса на Delphi. Характеристики на работа с интерфейси в Delphi

Имам проблем с използването на клас 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 системен дискТрябва да сте администратор с повишени права. Така че това е друга потенциална точка на провал.

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

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

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

Много потребители, особено тези, които преди това са работили в 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), за да разделите компонентите на групи. Ние също така не пренебрегваме извиненията относно разделителната способност на екрана.

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

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

Цветова гама

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

Заключение

Има много добър метод, който ви позволява да намерите недостатъци в програмата като цяло и в интерфейса по-специално. Просто е: представете си себе си на мястото на потребителя и половин час се опитайте да работите по начина, по който той работи. Още по-добре, ако вашият потребител е в обсега (например работи в същата организация). В този случай седнете до него или още по-добре вместо него и се опитайте да му свършите работата. Въведете данни, променете ги, покажете отчети и т.н. Ако не знаете как да го направите правилно, попитайте вашия потребител. Не само една или две операции от един и същи тип, както в режим на отстраняване на грешки, но 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?

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

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

Интерфейсите често се сравняват с абстрактни класове, но въпреки всички прилики, това сравнение не е напълно правилно. Като минимум абстрактните класове ви позволяват да контролирате видимостта на членовете. В същото време обхватите не са дефинирани за интерфейси.

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

За да декларирате интерфейс в Delphi, използвайте ключовата дума interface. Това е същата ключова дума, която дефинира раздел от модула, който може да бъде достъпен отвън (между ключови думиинтерфейс и изпълнение). Въпреки това, когато се декларира интерфейс, се използва различен синтаксис, подобен на декларирането на класове.

Делфи/Паскал

IMyNewInterface = интерфейсна процедура InterfaceProc;

край;

IMyNewInterface =интерфейс

процедура InterfaceProc;

край ;

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

Факт е, че интерфейсите на Delphi първоначално са въведени, за да поддържат COM технологията. Следователно интерфейсът IInterface, който в Delphi е предшественик на всички останали интерфейси (вид аналог на TObject), вече съдържа три основни метода за работа с тази технология: QueryInterface, _AddRef, _Release. В резултат на това, ако даден клас имплементира някакъв интерфейс, тогава той трябва да имплементира и тези методи. Дори ако този клас не е предназначен за COM работа. Поради тази характеристика на интерфейса на IInterface,интерфейси, в повечето случаи води до добавяне на очевидно неизползвани възможности към класа.

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

Всичко това доведе до факта, че въпреки всички възможности, предоставени от интерфейсите, те практическо приложениеВ Delphi почти нищо не е надхвърляло работата с COM.

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

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

Споделете