Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Internet, Wi-Fi, lokalne mreže
  • Sažetak: Korištenje otvorenih sučelja programskog okruženja Delphi. Preporuke za izradu korisničkih sučelja u Delphiju Opis Delphi sučelja

Sažetak: Korištenje otvorenih sučelja programskog okruženja Delphi. Preporuke za izradu korisničkih sučelja u Delphiju Opis Delphi sučelja

Imam problem s korištenjem Delphi klase iz C++ koda. delphi dll demo, koji eksportira funkciju koja vraća objekt.
moj Delphi Dll kod izgleda ovako:

Knjižnica DelphiTest; // koristi dio.... tip IMyObject = sučelje procedure DoThis(n: Integer); funkcija DoThat: PWideChar; kraj; TMyObject = class(TInterfacedObject,IMyObject) procedure DoThis(n: Integer); funkcija DoThat: PChar; kraj; // TMyObject implementacija ide ovdje ... procedure TMyObject.DoThis(n: Integer); begin showmessage("pozivate DoThis metodu s "+intToStr(n) +"parametrom"); kraj; funkcija TMyObject.DoThat: PChar; begin showmessage("pozivate DoThat funkciju"); Rezultat:= Pchar("Hello im Dothat"); kraj;

// izvoz DLL funkcije:

Funkcija CreateMyObject: IMyObject; stdcall;izvoz; var txt: tekstualna datoteka; begin AssignFile(txt,"C:\log.log"); Reset(txt); Writeln(txt,"zdravo"); Rezultat:= TMyObject.Create; kraj; izvozi CreateMyObject;

u svom C++ projektu deklarirao sam IMyObject sučelje ovako:

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

a moja glavna funkcija je ovakva:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() ( HMODULE hLib; hLib = LoadLibrary(L"DelphiTest.dll"); assert(hLib != NULL); // prolaz !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANCE)hLib, "CreateMyObject "); if (pfnCreate == NULL) ( DWORD errc = GetLastError(); printf("%u\n", errc); // dobiva pogrešku 127 ) else( printf("uspješno učitavanje\n"); ) IMyObject* objptr = pfnCreate(); objptr->DoThis(5); FreeLibrary(hLib); int in; scanf_s("%i", &in); return 0; )

u ovom primjeru dobio sam pogrešku prilikom izvođenja kada pokušam pristupiti izvezenoj funkciji. greške u liniji:
IMyObject* objptr = pfnCreate();

Možete li mi reći što nije u redu s mojim primjerom.
i ako je moguće, bilo koji radni primjer za pristup Delphi klasi (u DLL-u) iz C++ koda.

Riješenje

Prvi problem je pozivanje metode metode. Delphi sučelje koristi register koji je specifična Delphi konvencija pozivanja. korištenje stdcall Na primjer, za metode sučelja.

Sljedeći problem je u C++. Vaše C++ sučelje mora proizaći iz IUnknown. Osim toga, ono ne smije deklarirati konstruktor ili destruktor.

Osim toga, vaš Delphi kod eksportira PWideChar koji nije preslikan u char*, već je preslikan u wchar_t*.

Gledajući dalje, vraćanje PChara ovdje dobro funkcionira jer vaša implementacija vraća literal. Ali ozbiljniji kod će vjerojatno htjeti koristiti dinamički dodijeljeni niz, u kojem trenutku vaš dizajn ima manjkavosti.

Imajte na umu da za stvaranje datoteke u korijenu pogona sustava morate biti administrator s povišenim ovlastima. Dakle, ovo je još jedna potencijalna točka neuspjeha.

Očekujem da ima drugih grešaka, ali ovo je sve što sam do sada pronašao.

Članak je napisan na temelju rezultata analiza programa koje su napisali mladi programeri naše grupe.

Ispravno organiziramo redoslijed sklopnih komponenti

Mnogi korisnici, posebno oni koji su prethodno radili u DOS-u, imaju naviku prebacivati ​​između polja za unos ne mišem, već pomoću tipkovnice pomoću tipke Tab. Osim toga, puno je brže od odabira svakog polja mišem. Stoga redoslijed prebacivanja komponenti mora biti ispravno postavljen. Ovo se odnosi kako na komponente unutar svih komponenti spremnika (paneli, GroupBoxes i slično), tako i na same komponente spremnika, ako ih je više na obrascu.

Redoslijed izmjene komponenti unutar spremnika određen je svojstvom TabOrder. Prva komponenta koja postaje aktivna je ona s TabOrder jednakom 0, druga s 1 itd., dok se sve komponente ne pobroje. Osim toga, komponenta ima svojstvo TabStop, koje pokazuje hoće li komponenta dobiti fokus kada se prebaci tipkom Tab. Ako trebate zabraniti prebacivanje na bilo koju komponentu, postavite njen TabStop = false. U tom slučaju možete se prebaciti na ovu komponentu samo pomoću miša.

Postoje slučajevi kada korisnici koji su navikli prebacivati ​​se određenom tipkom u jednom programu, iz navike je nastave koristiti u drugima. To se često događa s korisnicima 1C, gdje se tipka Enter može koristiti za navigaciju kroz polja za unos. Pa dat ćemo im takvu priliku u našim programima ako to budu tražili. Postavite svojstvo obrasca KeyPreview na true i napišite rukovatelj događajima OnKeyPress:

Procedura TForm1.FormKeyPress(Pošiljatelj: TObject; var Key: Char);
početi
if ord(key)=vk_Return then
Form1.SelectNext(PriemForm.ActiveControl, true, true);
kraj;

Ovaj rukovatelj omogućuje navigaciju kroz elemente obrasca kada se pritisne tipka Enter. Treba napomenuti da ova metoda neće raditi s gumbima, jer... pritiskom na Enter na gumbu dolazi do klika na njega, dok pritiskom na Tab stavlja fokus unosa na sljedeću komponentu u slijedu prebacivanja.

Zadani gumbi

Svi se isti korisnici brzo naviknu na činjenicu da u dijaloškim okvirima aplikacije u pravilu svoj izbor možete potvrditi tipkom Enter, a odustati tipkom Esc. Nemojmo ih razočarati u našim programima, pogotovo jer je to vrlo jednostavno za napraviti. Za gumb koji reagira na Enter, postavite svojstvo Default na true. Za gumb koji reagira na Esc, postavite svojstvo Cancel na true. To je sve.

da ili ne

Svi dijaloški okviri koji zahtijevaju radnje korisnika moraju imati najmanje dva gumba: potvrđivanje radnje i odbijanje radnje (Da/Ne, Spremi/Odustani, itd.). Radnju je moguće poništiti zatvaranjem prozora tipkom [X] u naslovu prozora. Neprihvatljivo je da postoji samo jedan gumb za potvrdu radnje, a za odbijanje treba zatvoriti prozor s gumbom [X] u naslovu ili uopće ne postoji mogućnost odbijanja. Ovo zbunjuje korisnika, postavljajući logično pitanje: kako odbiti?

Također, ne zaboravite ono što je gore rečeno u odlomku "Zadani gumbi".

Svi dijaloški okviri trebali bi se otvoriti u središtu zaslona

Centrirano, a ne tamo gdje su stvoreni u načinu dizajna. Prvo, više je vizualno, a drugo, automatski uklanja problem različitih razlučivosti zaslona za različite korisnike.

Iznimka je ako dijaloški okvir nije modalan, a kao rezultat rada korisnika u ovom prozoru, promjene se odmah događaju u glavnom prozoru (na primjer, filtriranje skupa podataka, ponovno crtanje grafikona itd.).

Veličine prozora ne smiju premašivati ​​veličinu ekrana

Ni u kom slučaju. Sramotno je kad se dio prozora proteže izvan paravana. Ovaj zahtjev ne ovisi o razlučivosti zaslona korisnika, tj. izgovori poput "Neka postave veću rezoluciju" ne funkcioniraju.

Ispravna promjena veličine prozorskih elemenata

Elementi prozora trebaju mijenjati veličinu ili se ispravno pomicati kada se prozoru promijeni veličina, kada se prozor maksimizira i kada se prozor vrati nakon maksimiziranja.

Uvijek se sve vidi

Smanjenje veličine prozora ne bi trebalo dovesti do nestanka elemenata prozora i, po mogućnosti, ne bi trebalo dovesti do pojave traka za pomicanje (klizača) samog prozora. Možete ograničiti minimalne veličine prozora tako da svi elementi budu vidljivi i dostupni. Ako nije moguće postaviti komponente tako da sve budu vidljive u prozoru, možete koristiti knjižne oznake (kao što je PageControl) da podijelite komponente u grupe. Također ne ignoriramo isprike o razlučivosti zaslona.

Savjeti posvuda, savjeti uvijek

Za gumbe, posebno na alatnim trakama (kao što je alatna traka), treba navesti savjete kako bi uvijek bilo jasno zašto je potreban ovaj ili onaj gumb.

Spektar boja

Ne biste trebali bojiti komponente na obrascu u svim duginim bojama. To zamara oči i odvlači pozornost korisnika. Ne izgleda "cool". Označavanje se koristi kada je potrebno skrenuti pozornost korisnika na određeni element ili određeni dio prozora. Na primjer, zapise koji sadrže pogreške obojite svijetlocrvenom bojom ili, obrnuto, zapise koji su uspješno provjereni obojite svijetlozelenom bojom.

Zaključak

Postoji vrlo dobra metoda koja vam omogućuje pronalaženje nedostataka u programu općenito, a posebno u sučelju. Jednostavno: zamislite sebe na korisnikovom mjestu i pola sata pokušajte raditi na način na koji on radi. Još je bolje ako je vaš korisnik unutar dometa (na primjer, radi u istoj organizaciji). U tom slučaju sjednite pored njega, ili još bolje, umjesto njega i pokušajte raditi njegov posao. Unesite podatke, promijenite ih, prikažite izvješća itd. Ako ne znate kako to učiniti ispravno, pitajte svog korisnika. Nemojte samo jednu ili dvije operacije iste vrste, kao u načinu rada za otklanjanje pogrešaka, već 20-30, ili čak više različitih operacija, različitim redoslijedom. Zaboravite nešto unijeti ili unesite netočno i pogledajte kako će program na to reagirati. Brzo ćete uvidjeti slabosti vašeg programa.

Autor članka automatizirao je rad upisnog povjerenstva na sveučilištu, te je u prvoj godini uvođenja programa provodio 3-4 sata dnevno u upisnom povjerenstvu, prijavljujući pristupnike, ispunjavajući njihove osobne podatke i izdavajući ih. izvješća o položenim ispitima. A u preostalom radnom vremenu ispravljao je greške i nedostatke. Vjerujte mi, sljedeće godine praktički neće biti nikakvih problema. Isto se dogodilo i prilikom uvođenja kadrovskog modula.

Stoga imajte na umu korisničko iskustvo. Olakšajte im i učinite ugodnim rad s vašim programima.

Objektno orijentirano programiranje (OOP) uz koncept klase daje i temeljni koncept sučelja.

Što je sučelje i koje su značajke rada s njim u programskom jeziku Delphi?

Sučelje je semantička i sintaktička konstrukcija u programskom kodu koja se koristi za određivanje usluga koje pruža klasa ili komponenta (Wikipedia).

U suštini, sučelje definira popis svojstava i metoda koje se moraju koristiti pri radu s klasom koju ovo sučelje implementira, kao i njihov potpis (ime, tip podataka, prihvaćeni parametri (za procedure i funkcije), itd.). Dakle, klasa koja implementira određeno sučelje mora implementirati sve njegove komponente. Štoviše, u strogom skladu s onim kako su u njemu opisani.

Sučelja se često uspoređuje s apstraktnim klasama, ali unatoč svim sličnostima, ova usporedba nije sasvim točna. Kao minimum, apstraktne klase vam omogućuju kontrolu vidljivosti članova. U isto vrijeme, opseg nije definiran za sučelja.

Sučelja vam omogućuju da arhitekturu učinite fleksibilnijom, jer objedinjuju pristup ovoj ili onoj funkcionalnosti, a također vam omogućuju da izbjegnete niz problema povezanih s nasljeđivanjem klasa (sučelja se također mogu naslijeđivati ​​jedno od drugog).

Da biste deklarirali sučelje u Delphiju, koristite ključnu riječ sučelja. Ovo je ista ključna riječ koja definira odjeljak modula kojem se može pristupiti izvana (između ključnih riječi sučelja i implementacije). Međutim, kada se deklarira sučelje, koristi se druga sintaksa, slična deklaraciji klasa.

Delphi/Pascal

IMyNewInterface = procedura sučelja InterfaceProc; kraj;

IMyNewInterface = sučelje

procedura InterfaceProc;

kraj ;

Dakle, sama sintaksa deklaracije sučelja nije bitno različita od ostalih programskih jezika (značajke sintakse temeljene na Pascalu se ne računaju). U isto vrijeme, implementacija sučelja ima niz karakterističnih značajki.

Činjenica je da su Delphi sučelja izvorno uvedena za podršku COM tehnologiji. Dakle, sučelje IInterface, koje je u Delphiju predak svih ostalih sučelja (neka vrsta analoga TObject), već sadrži tri osnovne metode za rad s ovom tehnologijom: QueryInterface, _AddRef, _Release. Kao rezultat toga, ako klasa implementira bilo koje sučelje, onda mora implementirati i ove metode. Čak i ako ova klasa nije namijenjena za COM rad.

Zbog ove značajke IIinterface sučelja, u Delphiju korištenje sučelja, u većini slučajeva, dovodi do dodavanja očito neiskorištenih mogućnosti klasi.

Postoji klasa biblioteke TInterfaceObject koja već sadrži implementaciju ovih metoda i, kada nasljeđujete od nje, nema potrebe da ih sami implementirate. Ali budući da Delphi ne podržava višestruko nasljeđivanje klasa, njegova uporaba često samo uzrokuje dodatne poteškoće u dizajnu i implementaciji već potrebne funkcionalnosti.

Sve je to dovelo do toga da, usprkos svim mogućnostima koje sučelja pružaju, njihova praktična primjena u Delphiju gotovo da nije išla dalje od rada s COM-om.

Budući da su optimizirana za rad uglavnom s ovom tehnologijom, sučelja, odnosno funkcionalnost i arhitektonska ograničenja koja ona nužno dodaju, ne opravdavaju se pri rješavanju drugih problema.

Stoga su mnogi Delphi programeri još uvijek, zapravo, uskraćeni za snažan i fleksibilan alat za razvoj arhitekture aplikacija.

samo za rezultat

strogo pridržavanje rokova

Transparentnost

provedba projekta

tehnička podrška na poklon

Programiranje, izmjene, konzultacije o 1C

Kako radimo

1. Telefonski razgovaramo o problemu. Ako imate daljinski pristup, prikažite ga na zaslonu računala.

2. Procjenjujemo rad u rubljima ako je projekt velik, a ako nije, približan broj sati.

3. Obavljamo posao.

4. Prihvaćate rad u svom programu, ako ima nedostataka mi ih ispravljamo.

5. Mi izdajemo račun, vi plaćate.

Trošak rada

1. Sav posao podijeljen je u 3 kategorije: savjetovanje, ažuriranje standardne konfiguracije, razvoj ili programiranje novog izvješća, obrada, gumb itd.

3. Za rad duži od 10 sati potrebno je unaprijed izraditi tehnički zahtjev s opisom i cijenom rada. Rad počinje nakon usuglašavanja tehničkih specifikacija s vama.

Tehnička podrška

1. Ako u roku od 3 mjeseca pronađete bilo kakve greške u prethodno prihvaćenom radu, mi ih besplatno ispravljamo.

2. Za stalne kupce, nedostatke u radu otklanjamo besplatno u roku od godinu dana.

Softver za upravljanje vašim poslovanjem.

Kupite 1C:Enterprise

Mi smo službeni zastupnik 1C, kod nas možete kupiti razne softverske proizvode i licence. Osim kupnje “kutije”, pomoći ćemo Vam u postavljanju programa, savjetima i osnovnim postavkama.

  • Računovodstvo
  • Automatizacija trgovine
  • Veleprodaja
  • Pomoć pri instalaciji i početnom postavljanju uključena je u paket!
  • Fino podešavanje konfiguracija prema potrebama korisnika, razvoj novih modula u nedostatku potrebnih funkcija u standardnoj konfiguraciji.
1c računovodstvo 1C: Upravljanje trgovinom 1C: Maloprodaja 1C: Upravljanje plaćama i osobljem
Od 3300 rub. Od 6700 rub. Od 3300 rub. Od 7400 rub.

Pružanje poslužitelja.

Instant postavljanje servera + 1C.

Nema poslužitelja? Nema problema, mi ćemo odabrati i brzo postaviti poslužitelj u oblaku. Za malu naknadu dobivate vrlo pouzdano rješenje.

  • Dostupnost 24\7
  • Nema potrebe za vlastitim administratorom sustava (ušteda će pokriti troškove vašeg poslužitelja).
  • Brzo postavljanje i instalacija 1C na poslužitelju, za 3 dana već ćete imati potpuno radni sustav.
  • Možete se preseliti na lokalni poslužitelj u bilo kojem trenutku ako niste zadovoljni rješenjem.

SMS s vašeg 1C

Želite da Vaši kupci saznaju za akcije i popuste? Klijenti se ne vraćaju? Postavite slanje SMS-a izravno iz 1C!

Naša tvrtka će moći brzo postaviti slanje SMS-a vašim klijentima izravno iz 1C. Primjeri događaja koji se mogu automatizirati:

  • Zahvaljujemo na kupnji i bonuse dodjeljujemo odmah nakon sljedeće kupnje.
  • Prikupljanje bonusa na karticu kao poklon za rođendan\drugi značajan ili praznik.
  • Obavijest o prispijeću robe u skladište.
  • Istek darovnih bonusa.
  • Obavijest o primitku avansa i rezervacija robe.
  • Adresa s uputama do trgovine/ureda, brojevi telefona.
  • I tako dalje.

Postavljanje u 1C mogu obaviti naši stručnjaci ili vaši zaposlenici. Tarife možete pogledati na stranici SMS tarife.

  • Zajamčena dostava SMS-a, novac se naplaćuje samo za isporučeni SMS.
  • Posebna cijena za svaki SMS.
  • Nadopunite svoj saldo na različite načine.
  • U svakom trenutku pogledajte povijest svih poslanih SMS-ova.
  • Ime pošiljatelja umjesto digitalnog broja u telefonu primatelja poruke.
Ovo je članak temeljen na pitanjima na forumima: “Kako mogu vratiti niz iz DLL-a?”, “Kako proslijediti i vratiti niz zapisa?”, “Kako proslijediti obrazac u DLL?”.

Kako ne biste potrošili pola života na smišljanje, u ovom ću članku donijeti sve na pladnju.

Teme ovog članka dotaknute su više puta na ovom blogu u različitim stupnjevima, ali u ovom članku su prikupljene zajedno i opravdane. Ukratko, možete baciti poveznicu na ovaj članak onima koji razvijaju DLL-ove.

Važna nota: članak se mora pročitati sekvencijalno. Primjeri koda navedeni su samo kao primjeri, u svakom koraku (točki) članka dodaje se primjer koda s novim detaljima. Na primjer, na samom početku članka nema obrade grešaka, naznačene su “klasične” metode (kao što je korištenje GetLastError , konvencija sdtcall itd.), koje se zamjenjuju adekvatnijima kako članak napreduje. To je učinjeno kako "novi" ("neobični") dizajni ne bi izazivali pitanja. U suprotnom, bilo bi potrebno umetnuti bilješku za svaki primjer poput: "o tome se raspravlja u tom odlomku ispod, ali o tome se raspravlja u ovom odlomku." U svakom slučaju, na kraju članka nalazi se poveznica na gotov kod, napisan uzimajući u obzir sve što je rečeno u članku. Možete ga jednostavno uzeti i koristiti. A članak objašnjava zašto i zašto. Ako vas ne zanima “zašto i zašto”, skrolajte do kraja do zaključka i poveznice za preuzimanje primjera.

Najbolji članci na temu