Čo je rozhranie v delphi. Funkcie práce s rozhraniami v Delphi

len kvôli výsledkom

prísne dodržiavanie termínov

Transparentnosť

realizácia projektu

technická podpora ako darček

Programovanie, vylepšenia, konzultácie o 1C

Ako pracujeme

1. Problém prediskutujeme telefonicky. Ak máte vzdialený prístup - zobrazte na obrazovke počítača.

2. Hodnotíme prácu v rubľoch, ak je projekt veľký, ak nie - približný počet hodín.

3. Splníme úlohu.

4. Prijímate prácu vo svojom programe, ak sú nedostatky, opravujeme ich.

5. Vystavíme faktúru, zaplatíte.

Náklady na prácu

1. Všetky práce sú rozdelené do 3 kategórií: konzultácia, aktualizácia typickej konfigurácie, vývoj alebo programovanie novej zostavy, spracovanie, tlačidlá atď.

3. Pre prácu nad 10 hodín je vopred pripravená technická úloha s popisom a cenou práce. Práca začína po schválení TOR s vami.

Technická podpora

1. Ak nájdete chyby v predtým prijatých prácach, do 3 mesiacov ich bezplatne opravíme.

2. Pre stálych zákazníkov opravujeme nedostatky v našej práci bezplatne do roka.

Programy na riadenie vášho podnikania.

Kúpte si 1C:Enterprise

Sme oficiálnym predajcom 1C, môžete si u nás zakúpiť rôzne softvérové ​​produkty a licencie. Okrem kúpy „krabičky“ vám pomôžeme s nastavením programu, konzultáciou a základným nastavením.

  • účtovníctvo
  • Automatizácia predajní
  • Veľkoobchod
  • Pomoc s inštaláciou a úvodným nastavením je súčasťou balenia!
  • Dolaďovanie konfigurácií podľa potrieb zákazníka, vývoj nových modulov pri absencii potrebných funkcií v štandardnej konfigurácii.
1c účtovníctvo 1C: Riadenie obchodu 1C: Maloobchod 1C: Riadenie miezd a ľudských zdrojov
Od 3300 rubľov. Od 6700 rubľov. Od 3300 rubľov. Od 7400 rubľov.

Poskytovanie servera.

Server okamžitého nastavenia + 1C.

Žiadny server? Nevadí, vyberieme a rýchlo nastavíme server v „cloude“. Za malý poplatok získate veľmi spoľahlivé riešenie.

  • Dostupnosť 24/7
  • Nie je potrebné mať vlastného správcu systému (úspory pokryjú náklady na váš server).
  • Rýchle nastavenie a inštalácia 1C na server, za 3 dni už budete mať plne funkčný systém.
  • Ak vám riešenie nevyhovuje, môžete sa kedykoľvek presunúť na lokálny server.

SMS z vášho 1C

Chcete, aby sa zákazníci dozvedeli o akciách a zľavách včas? Klienti sa nevracajú? Nastavte si posielanie SMS priamo z 1C!

Naša spoločnosť bude vedieť rýchlo nastaviť posielanie SMS vašim zákazníkom priamo od 1C. Príklady udalostí, ktoré možno automatizovať:

  • Vďačnosť za nákup a získanie bonusov ihneď po ďalšom nákupe.
  • Pripisovanie bonusov ku karte ako darček k narodeninám/inému významnému či sviatočnému dňu.
  • Oznámenie o sklade.
  • Platnosť darčekovej poukážky.
  • Oznámenie o prijatí platby vopred a rezervácii tovaru.
  • Adresa s trasou do obchodu/kancelárie, telefónne čísla.
  • Atď.

Nastavenie v 1C môžu vykonať naši špecialisti alebo naši zamestnanci. S tarifami sa môžete zoznámiť na stránke SMS-tarify.

  • Garancia doručenia SMS, peniaze sa sťahujú len za doručené SMS.
  • Samostatné účtovanie pre každú SMS.
  • Dopĺňanie zostatku rôznymi spôsobmi.
  • Zobrazte si históriu všetkých odoslaných SMS kedykoľvek.
  • Meno odosielateľa namiesto číselného čísla na telefóne príjemcu.

Mám problém s použitím triedy Delphi z kódu C++. demo delphi dll, ktoré exportuje funkciu, ktorá vracia objekt.
môj kód Delphi DLL vyzerá takto:

Knižnica DelphiTest; // používa časť.... typ IMyObject = interface procedure DoThis(n: Integer); funkcia DoThat: PWideChar; koniec; TMyObject = class(TInterfacedObject,IMyObject) procedure DoThis(n: Integer); funkcia DoThat: PChar; koniec; // Implementácia TMyObject prejdite sem ... procedure TMyObject.DoThis(n: Integer); begin showmessage("voláte metódu DoThis s "+intToStr(n) +"parameter"); koniec; funkcia TMyObject.DoThat: PChar; begin showmessage("voláte funkciu DoThat"); Vysledok:= Pchar("Ahoj im Dothat"); koniec;

// export funkcie DLL:

Funkcia CreateMyObject: IMyObject; stdcall;export; var txt: TextFile; begin AssignFile(txt,"C:\log.log"); reset(txt); Writeln(txt,"ahoj"); Vysledok:= TMyObject.Create; koniec; exportuje CreateMyObject;

v mojom projekte C++ som deklaroval rozhranie IMyObject takto:

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

a moja hlavná funkcia je nasledovná:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() ( HMODULE hLib; hLib = LoadLibrary(L"DelphiTest.dll"); claim(hLib != NULL); // prejsť !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANCE)hLib, "CreateMyObject "); if (pfnCreate == NULL) ( DWORD errc = GetLastError(); printf("%u\n", errc); // dostane chybu 127 ) else( printf("úspešné načítanie\n"); ) IMyObject* objptr = pfnCreate(); objptr->DoThis(5); FreeLibrary(hLib); int in; scanf_s("%i", &in); return 0; )

v tomto príklade som pri pokuse o prístup k exportovanej funkcii dostal chybu runtime. chyby riadkov:
IMyObject* objptr = pfnCreate();

Môžete mi povedať, čo je zlé na mojom príklade?
a ak je to možné, akýkoľvek pracovný príklad na prístup k triede Delphi (v knižnici DLL) z kódu C++.

Riešenie

Prvým problémom je volanie konvencie metódy. Rozhranie Delphi používa register, ktorý je špecifickou konvenciou volania pre Delphi. pomocou stdcall Napríklad pre metódy rozhrania.

Ďalší problém je v C++. Vaše rozhranie C++ musí byť odvodené od IUnknown . Tiež nesmie deklarovať konštruktor alebo deštruktor.

Okrem toho váš kód Delphi exportuje PWideChar, ktorý sa nemapuje na char* . Mapuje sa na wchar_t* .

Ak sa pozrieme ďalej, vrátenie PChar tu funguje skvele, pretože vaša implementácia vracia doslova. Ale vážnejší kód bude pravdepodobne chcieť použiť dynamicky pridelený reťazec, v tomto bode je váš návrh chybný.

Upozorňujeme, že ak chcete vytvoriť súbor v koreňovom adresári systémovej jednotky, musíte byť administrátor so zvýšenými právami. Takže toto je ďalší potenciálny bod zlyhania.

Očakávam, že existujú ďalšie chyby, ale to je všetko, čo som zatiaľ našiel.

Článok bol napísaný na základe výsledkov analýz programov napísaných mladými vývojármi našej skupiny.

Správne usporiadajte poradie spínania komponentov

Mnohí používatelia, najmä tí, ktorí predtým pracovali v systéme DOS, majú vo zvyku prepínať medzi vstupnými poľami nie pomocou myši, ale pomocou klávesnice pomocou klávesu Tab. Navyše je to oveľa rýchlejšie ako výber každého poľa myšou. Preto treba správne nastaviť poradie spínania komponentov. Týka sa to ako komponentov vo všetkých komponentoch kontajnera (panelov, GroupBoxov a podobne), tak aj samotných komponentov kontajnera, ak ich je vo formulári viacero.

Poradie prepínania komponentov vo vnútri kontajnera je nastavené vlastnosťou TabOrder. Prvý komponent, ktorý sa stane aktívnym, je komponent s TabOrder rovným 0, druhý komponent s 1 atď., kým sa neopakujú všetky komponenty. Okrem toho má komponent vlastnosť TabStop, ktorá udáva, či komponent dostane fokus pri prepínaní klávesom Tab. Ak potrebujete zakázať prepínanie na ktorýkoľvek komponent, nastavte preň TabStop = false. V tomto prípade bude možné prepnúť na tento komponent iba pomocou myši.

Sú chvíle, keď používatelia, ktorí sú zvyknutí prepínať určitý kľúč v jednom programe zo zvyku, ho naďalej používajú v iných. Toto sa často stáva u používateľov 1C, kde sa kláves Enter dá použiť na navigáciu cez vstupné polia. No dajme im tú možnosť v našich programoch, ak o to požiadajú. Nastavte vlastnosť KeyPreview formulára na hodnotu true a napíšte obsluhu udalosti OnKeyPress:

Procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
začať
if ord(key)=vk_Return then
Form1.SelectNext(PriemForm.ActiveControl, true, true);
koniec;

Takáto obsluha poskytuje prechod cez prvky formulára po stlačení klávesu Enter. Je potrebné poznamenať, že táto metóda nebude fungovať s tlačidlami, pretože stlačenie klávesu Enter na tlačidle spôsobí jeho stlačenie, zatiaľ čo stlačenie klávesu Tab prenesie zameranie vstupu na ďalší komponent v sekvencii prepínania.

Predvolené tlačidlá

Všetci rovnakí používatelia si rýchlo zvyknú na to, že v dialógových oknách aplikácie spravidla môžete potvrdiť svoju voľbu klávesom Enter a zrušiť klávesom Esc. Nesklamme ich v našich programoch, najmä preto, že je to veľmi jednoduché. Pre tlačidlo Enter nastavte vlastnosť Default na true. Pre tlačidlo, ktoré reaguje na Esc, nastavte vlastnosť Zrušiť na hodnotu true. A to je všetko.

Áno alebo nie

Všetky dialógové okná vyžadujúce akcie používateľa musia mať aspoň dve tlačidlá: potvrdenie akcie a odmietnutie akcie (Áno/Nie, Uložiť/Zrušiť atď.). Akciu je možné zrušiť zatvorením okna tlačidlom [X] v záhlaví okna. Je neplatné, ak existuje len jedno tlačidlo na potvrdenie akcie a pre odmietnutie sa má okno zavrieť tlačidlom [X] v nadpise, alebo nie je možnosť odmietnutia vôbec. To mätie používateľa, čo spôsobuje logickú otázku: ako odmietnuť?

Nezabudnite tiež na to, čo bolo povedané vyššie v odseku „Predvolené tlačidlá“.

Všetky dialógové okná by sa mali otvárať v strede obrazovky

Vycentrované namiesto miesta, kde boli vytvorené v režime návrhu. Jednak je vizuálnejší a jednak automaticky odstraňuje problém s rôznym rozlíšením obrazovky pre rôznych používateľov.

Výnimka je v prípade, že dialógové okno nie je modálne a v dôsledku práce používateľa v tomto okne nastanú v hlavnom okne okamžite zmeny (napríklad filtrovanie množiny údajov, prekresľovanie grafov atď.).

Veľkosť okien by nemala presiahnuť veľkosť obrazovky.

V žiadnom prípade. Je to hanba, keď časť okna vylieza z obrazovky. Táto požiadavka nezávisí od rozlíšenia obrazovky používateľa, t.j. výhovorky typu „Nech dajú vyššie rozlíšenie“ nefungujú.

Správna zmena veľkosti prvkov okna

Prvky okna musia správne zmeniť veľkosť alebo presunúť sa pri zmene veľkosti okna, pri maximalizácii okna a pri obnovení okna po maximalizácii.

Všetko je vždy viditeľné

Zmenšenie veľkosti okna by nemalo viesť k zmiznutiu prvkov okna a pokiaľ možno by nemalo viesť k objaveniu sa posuvníkov (scrollerov) samotného okna. Môžete obmedziť minimálnu veľkosť okna, aby boli všetky prvky viditeľné a prístupné. Ak nie je možné umiestniť komponenty tak, aby boli v okne všetci viditeľní, môžete použiť záložky (typu PageControl) na rozdelenie komponentov do skupín. Nechýbajú ani výhovorky o rozlíšení obrazovky.

Rady všade, rady vždy

Pri tlačidlách, najmä na paneloch s nástrojmi (ako je Panel s nástrojmi), by mali byť uvedené rady, aby bolo vždy jasné, prečo je toto alebo toto tlačidlo potrebné.

Farebné spektrum

Komponenty na formulári nie je potrebné maľovať vo všetkých farbách dúhy. To unavuje oči a rozptyľuje pozornosť používateľa. Nevyzerá to "cool". Zvýraznenie sa používa, keď je potrebné upozorniť používateľa na konkrétny prvok alebo konkrétnu časť okna. Záznamy s chybami môžete napríklad vyfarbiť svetločervenou farbou alebo naopak svetlozelenou farbou záznamov, ktorých overenie bolo úspešné.

Záver

Existuje veľmi dobrá metóda, ktorá vám umožňuje nájsť nedostatky programu vo všeobecnosti a najmä rozhrania. Je to jednoduché: predstavte si seba na mieste používateľa a pol hodiny sa snažte pracovať tak, ako on. Ešte lepšie je, ak je váš používateľ na dosah (napr. pracuje v rovnakej organizácii). V takom prípade si sadnite vedľa neho, alebo skôr namiesto neho, a snažte sa robiť jeho prácu. Zadávanie údajov, ich zmena, zobrazenie prehľadov atď. Ak neviete, ako to urobiť správne, opýtajte sa svojho používateľa. Nevykonávajte jednu alebo dve operácie rovnakého typu ako v režime ladenia, ale 20-30 alebo dokonca viac rôznych operácií v inom poradí. Zabudnite niečo zadať alebo to zadajte nesprávne a uvidíte, ako na to program zareaguje. Rýchlo uvidíte slabé miesta vášho programu.

Autor článku zautomatizoval prácu prijímacej komisie na univerzite a v prvom roku realizácie programu trávil na prijímacej komisii 3-4 hodiny denne, registroval uchádzačov, vypĺňal ich osobné údaje a dával im správy o skúškach. A v zostávajúcom pracovnom čase opravené chyby a nedostatky. Verte mi, že budúci rok nezostanú prakticky žiadne problémy. Rovnako to bolo aj so zavedením personálneho modulu.

Majte teda na pamäti používateľskú skúsenosť. Nech je pre nich práca s vašimi programami jednoduchá a príjemná.

Objektovo orientované programovanie (OOP) okrem konceptu triedy poskytuje aj základný koncept rozhrania.

Čo je to rozhranie a aké sú vlastnosti práce s ním v programovacom jazyku Delphi?

Rozhranie je sémantická a syntaktická konštrukcia v programovom kóde používaná na špecifikáciu služieb poskytovaných triedou alebo komponentom (Wikipedia).

V skutočnosti rozhranie definuje zoznam vlastností a metód, ktoré by sa mali použiť pri práci s triedou, ktorá implementuje toto rozhranie, ako aj ich podpis (názov, typ údajov, akceptované parametre (pre procedúry a funkcie) atď.). Teda trieda, ktorá implementuje rozhranie, musí nevyhnutne implementovať všetky jeho komponenty. Navyše v prísnom súlade s tým, ako sú v ňom opísané.

Rozhrania sa veľmi často porovnávajú s abstraktnými triedami, ale napriek všetkým podobnostiam toto porovnanie nie je úplne správne. V abstraktných triedach je k dispozícii minimálne kontrola nad viditeľnosťou členov. Zároveň nie sú definované rozsahy pre rozhrania.

Rozhrania vám umožňujú urobiť architektúru flexibilnejšou, pretože zjednocujú prístup ku konkrétnej funkcionalite a tiež vám umožňujú vyhnúť sa množstvu problémov spojených s dedením tried (rozhrania možno dediť aj jedno od druhého).

Delphi používa kľúčové slovo interface na deklarovanie rozhrania. Toto je rovnaké kľúčové slovo, ktoré definuje časť modulu, ku ktorej je možné pristupovať zvonku (medzi kľúčovými slovami rozhrania a implementácie). Pri deklarovaní rozhrania sa však používa iná syntax, podobne ako pri deklarovaní tried.

Delphi / Pascal

IMyNewInterface = procedúra rozhrania InterfaceProc; koniec;

IMyNewInterface = rozhranie

procedúra InterfaceProc ;

koniec ;

Samotná syntax deklarácie rozhrania teda nemá žiadne zásadné rozdiely od iných programovacích jazykov (funkcie syntaxe založené na Pascal sa nepočítajú). Implementácia rozhraní má zároveň množstvo charakteristických čŕt.

Faktom je, že rozhrania Delphi boli pôvodne zavedené na podporu technológie COM. Preto rozhranie IInterface, ktoré je v Delphi predchodcom všetkých ostatných rozhraní (akýsi analóg TObject), už obsahuje tri základné metódy pre prácu s touto technológiou: QueryInterface, _AddRef, _Release. V dôsledku toho, ak trieda implementuje akékoľvek rozhranie, potom musí implementovať aj tieto metódy. Aj keď táto trieda nie je navrhnutá na prácu s COM.

Kvôli tejto vlastnosti rozhrania IInterface vedie v Delphi používanie rozhraní vo väčšine prípadov k pridávaniu zjavne nepoužívaných funkcií do triedy.

Existuje knižničná trieda TInterfaceObject, ktorá už implementáciu týchto metód obsahuje a pri dedení z nej nie je potrebné ich implementovať sami. Ale keďže Delphi nepodporuje viacnásobnú dedičnosť tried, jeho použitie často spôsobuje len ďalšiu zložitosť pri návrhu a implementácii už požadovanej funkcionality.

To všetko viedlo k tomu, že napriek všetkým možnostiam, ktoré rozhrania poskytujú, ich praktické využitie v Delphi takmer nepresahovalo rámec práce s COM.

Tým, že sú optimalizované na prácu hlavne s touto technológiou, rozhrania, či skôr funkčnosť a architektonické obmedzenia, ktoré bez problémov pridávajú, sa pri riešení iných problémov neospravedlňujú.

Mnoho programátorov Delphi je preto v skutočnosti stále zbavených výkonného a flexibilného nástroja na vývoj aplikačnej architektúry.

Tento článok je založený na otázkach na fórach: "Ako môžem vrátiť reťazec z knižnice DLL?", "Ako preniesť a vrátiť pole záznamov?", "Ako preniesť formulár do knižnice DLL?"

Aby ste nepremrhali polovicu života snahou prísť na to, v tomto článku prinesiem všetko na striebornom podnose.

Témy tohto článku sa už v tomto blogu v rôznej miere dotkli, ale v tomto článku sú zhromaždené v hromade, zdôvodnenie je uvedené. Stručne povedané, odkaz na tento článok môže byť hodený na tých, ktorí vyvíjajú DLL.

Dôležitá poznámka: článok si treba prečítať dôsledne. Príklady kódu sú uvedené len ako príklady, v každom kroku (odseku) článku je pridaný kód príkladov s novými podrobnosťami. Napríklad na samom začiatku článku nie je žiadne spracovanie chýb, sú naznačené „klasické“ metódy (ako napríklad použitie GetLastError, konvencie sdtcall atď.), ktoré sú v priebehu článku nahradené adekvátnejšími. Deje sa tak z dôvodu, aby „nové“ („nezvyčajné“) konštrukcie nevyvolávali otázky. V opačnom prípade by ste museli ku každému príkladu vložiť poznámku vo formulári: "toto je diskutované v tomto odseku nižšie, ale toto je v tomto." V každom prípade na konci článku je odkaz na hotový kód napísaný s prihliadnutím na všetko, čo je uvedené v článku. Môžete si to jednoducho vziať a použiť. A článok vysvetľuje prečo a prečo. Ak vás nezaujíma "prečo a prečo" - prejdite na záver a odkaz na stiahnutie príkladu.