Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Internet, Wi-Fi, lokalne mreže
  • Apstrakt: Upotreba otvorenih interfejsa Delphi programskog okruženja. Preporuke za kreiranje korisničkih interfejsa u opisu Delphi Delphi interfejsa

Apstrakt: Upotreba otvorenih interfejsa Delphi programskog okruženja. Preporuke za kreiranje korisničkih interfejsa u opisu Delphi Delphi interfejsa

Imam problem sa korištenjem Delphi klase iz C++ koda. delphi dll demo koji izvozi funkciju koja vraća objekat.
moj Delphi Dll kod izgleda ovako:

Library DelphiTest; // koristi dio.... tip IMyObject = procedura interfejsa DoThis(n: Integer); funkcija DoThat: PWideChar; kraj; TMyObject = class(TInterfacedObject,IMyObject) procedura DoThis(n: Integer); funkcija DoThat: PChar; kraj; // Implementacija TMyObject idi ovdje ... procedure TMyObject.DoThis(n: Integer); begin showmessage("pozivate DoThis metodu sa "+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: TextFile; započeti AssignFile(txt,"C:\log.log"); reset (txt); Writeln(txt,"zdravo"); Rezultat:= TMyObject.Create; kraj; izvozi CreateMyObject;

u svom C++ projektu deklarirao sam interfejs IMyObject ovako:

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

a moja glavna funkcija je sljedeća:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() ( HMODULE hLib; hLib = LoadLibrary(L"DelphiTest.dll"); assert(hLib != NULL); // pass !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANCE)hLiby,ject "); if (pfnCreate == NULL) ( DWORD errc = GetLastError(); printf("%u\n", errc); // dobija grešku 127 ) else( printf("success load\n"); ) IMyObject* objptr = pfnCreate(); objptr->DoThis(5); FreeLibrary(hLib); int in; scanf_s("%i", &in); return 0; )

u ovom primjeru dobio sam runtime grešku kada sam pokušao pristupiti izvezenoj funkciji. greške u liniji:
IMyObject* objptr = pfnCreate();

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

Rješenje

Prvi problem je pozivanje konvencije metode. Delphi interfejs koristi registar koji je posebna konvencija o pozivanju za Delphi. koristeći stdcall Na primjer, za metode interfejsa.

Sljedeći problem je u C++. Vaše C++ sučelje mora biti izvedeno iz IUnknown.Takođe, ne smije deklarirati konstruktor ili destruktor.

Osim toga, vaš Delphi kod izvozi PWideChar koji se ne preslikava u char*, već u wchar_t*.

Gledajući dalje, vraćanje PChara ovdje odlično funkcionira jer vaša implementacija vraća literal. Ali ozbiljniji kod će vjerovatno htjeti koristiti dinamički dodijeljeni niz, u tom trenutku vaš dizajn je pogrešan.

Imajte na umu da morate biti viši administrator da biste kreirali datoteku u korijenu sistemskog diska. Dakle, ovo je još jedna potencijalna tačka neuspjeha.

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

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

Ispravno uredite redoslijed uključivanja komponenti

Mnogi korisnici, posebno oni koji su ranije radili u DOS-u, imaju naviku da prelaze između polja za unos ne pomoću miša, već pomoću tastature pomoću tastera Tab. Osim toga, to je mnogo brže od odabira svakog polja mišem. Stoga, redoslijed uključivanja komponenti mora biti ispravno postavljen. Ovo se odnosi i na komponente unutar svih komponenti kontejnera (paneli, GroupBoxovi i slično), i na same komponente kontejnera, ako ih ima nekoliko na obrascu.

Redoslijed prebacivanja komponenti unutar kontejnera je postavljen svojstvom TabOrder. Prva komponenta koja postaje aktivna je ona sa TabOrder jednakim 0, druga sa 1, i tako dalje, sve dok se sve komponente ne ponavljaju. Osim toga, komponenta ima svojstvo TabStop, koje ukazuje da li će komponenta dobiti fokus prilikom prebacivanja pomoću tipke Tab. Ako trebate onemogućiti prebacivanje na bilo koju komponentu, postavite TabStop = false za nju. U tom slučaju će se moći prebaciti na ovu komponentu samo uz pomoć miša.

Postoje slučajevi kada korisnici koji su navikli da mijenjaju određeni ključ u jednom programu, iz navike, nastave da ga koriste u drugim. To se često događa kod korisnika 1C, gdje se tipka Enter može koristiti za navigaciju kroz polja za unos. Pa, dajmo im tu priliku u našim programima ako to traže. Postavite svojstvo KeyPreview obrasca na true i napišite rukovalac događaja OnKeyPress:

Procedura TForm1.FormKeyPress(Pošiljalac: TObject; var ključ: Char);
početi
ako je ord(key)=vk_Return onda
Form1.SelectNext(PriemForm.ActiveControl, true, true);
kraj;

Takav rukovalac obezbeđuje prelaz kroz elemente obrasca kada se pritisne taster Enter. Treba napomenuti da ova metoda neće raditi sa dugmadima, jer pritiskom na Enter na dugme se ono pritisne, dok se pritiskom na Tab prenosi fokus ulaza na sledeću komponentu u nizu prebacivanja.

Podrazumevana dugmad

Isti se korisnici brzo naviknu na činjenicu da u dijaloškim okvirima aplikacije u pravilu svoj izbor možete potvrditi tipkom Enter, a otkazati tipkom Esc. Nemojmo ih razočarati u našim programima, pogotovo jer je to vrlo lako za napraviti. Za dugme Enter postavite svojstvo Default na true. Za dugme koje odgovara na Esc, postavite svojstvo Cancel na true. I to je sve.

da ili ne

Svi dijaloški okviri koji zahtijevaju radnje korisnika moraju imati najmanje dva dugmeta: potvrdu radnje i odbijanje radnje (Da/Ne, Sačuvaj/Otkaži, itd.). Radnja se može otkazati zatvaranjem prozora sa [X] dugmetom u naslovu prozora. Nevažeće je ako postoji samo jedno dugme za potvrdu radnje, a za odbijanje treba zatvoriti prozor sa dugmetom [X] u naslovu, ili uopšte ne postoji mogućnost odbijanja. Ovo zbunjuje korisnika, izazivajući logično pitanje: kako odbiti?

Takođe, ne zaboravite na ono što je gore rečeno u paragrafu "Podrazumevana dugmad".

Svi dijaloški okviri bi se trebali otvoriti u sredini ekrana

Centrirano umjesto na mjestu gdje su kreirani u načinu dizajna. Prvo, vizualniji je, a drugo, automatski eliminira problem različitih rezolucija ekrana za različite korisnike.

Izuzetak se pravi ako dijaloški okvir nije modalan, a kao rezultat rada korisnika u ovom prozoru, promjene se odmah javljaju u glavnom prozoru (na primjer, filtriranje skupa podataka, ponovno iscrtavanje grafikona, itd.).

Veličina prozora ne bi trebalo da prelazi veličinu ekrana.

Ni u kom slučaju. Sramota je kada dio prozora ispuzi iz ekrana. Ovaj zahtjev ne ovisi o rezoluciji ekrana korisnika, tj. izgovori poput "Neka stave višu rezoluciju" ne rade.

Ispravno mijenjanje veličine elemenata prozora

Elementi prozora moraju ispravno mijenjati veličinu ili se pomicati kada se promijeni veličina prozora, kada je prozor maksimiziran i kada se prozor vrati nakon što je maksimiziran.

Sve je uvek vidljivo

Smanjenje veličine prozora ne bi trebalo da dovede do nestanka elemenata prozora i po mogućnosti ne bi trebalo da dovede do pojave klizača (skrolera) samog prozora. Možete ograničiti minimalnu veličinu prozora tako da svi elementi budu vidljivi i dostupni. Ako nije moguće postaviti komponente tako da su svi vidljivi u prozoru, možete koristiti kartice (tipa PageControl) da podijelite komponente u grupe. Izgovori o rezoluciji ekrana također se ne propuštaju.

Nagoveštaji svuda, saveti uvek

Za dugmad, posebno na trakama sa alatkama (kao što je Toolbar), treba dati nagoveštaje kako bi uvek bilo jasno zašto je potrebno ovo ili ono dugme.

Spektar boja

Nije potrebno obojiti komponente na formu u sve dugine boje. Ovo zamara oči i raspršuje pažnju korisnika. Ne izgleda "kul". Isticanje se koristi kada je potrebno skrenuti pažnju korisnika na određeni element ili određeni dio prozora. Na primjer, unose s greškama možete obojiti svijetlocrvenom bojom ili, naprotiv, svijetlozelenom bojom unosa, čija je provjera uspjela.

Zaključak

Postoji vrlo dobra metoda koja vam omogućava da pronađete nedostatke programa općenito, a posebno sučelja. Jednostavno: zamislite sebe na mjestu korisnika i pola sata pokušajte raditi kako on radi. Još je bolje ako je vaš korisnik na dohvat ruke (npr. radi u istoj organizaciji). U ovom slučaju, sedite pored njega, odnosno umesto njega, i pokušajte da radite svoj posao. Unesite podatke, promijenite ih, prikažite izvještaje itd. Ako ne znate kako to učiniti kako treba, pitajte svog korisnika. Nemojte raditi jednu ili dvije operacije istog tipa, kao u načinu za otklanjanje grešaka, već 20-30 ili čak više različitih operacija, različitim redoslijedom. Zaboravite nešto da unesete ili unesete pogrešno i pogledajte kako program reaguje na to. Brzo ćete uočiti slabe tačke vašeg programa.

Autor članka je automatizirao rad prijemne komisije na univerzitetu, te je u prvoj godini implementacije programa provodio 3-4 sata dnevno na prijemnoj komisiji, registrovao kandidate, popunjavao njihove lične podatke i davao im ispitni izvještaji. I u preostalom radnom vremenu ispravljene greške i nedostaci. Vjerujte mi, sljedeće godine praktično više nema problema. Tako je bilo i sa uvođenjem kadrovskog modula.

Stoga, imajte na umu korisničko iskustvo. Neka im bude lako i ugodno raditi s vašim programima.

Objektno orijentisano programiranje (OOP), pored koncepta klase, takođe obezbeđuje osnovni koncept interfejsa.

Šta je interfejs i koje su karakteristike rada sa njim u programskom jeziku Delphi?

Interfejs je semantička i sintaktička konstrukcija u programskom kodu koja se koristi za specifikaciju usluga koje pruža klasa ili komponenta (Vikipedija).

U stvari, interfejs definiše listu svojstava i metoda koje treba koristiti kada se radi sa klasom koja implementira ovaj interfejs, kao i njihov potpis (ime, tip podataka, prihvaćeni parametri (za procedure i funkcije), itd.). Dakle, klasa koja implementira interfejs mora nužno implementirati sve njegove komponente. Štaviše, u strogom skladu sa načinom na koji su u njemu opisani.

Vrlo često se interfejsi porede sa apstraktnim klasama, ali uz sve sličnosti, ovo poređenje nije sasvim tačno. U apstraktnim časovima, u najmanju ruku, dostupna je kontrola vidljivosti članova. U isto vrijeme, opsegi nisu definirani za sučelja.

Interfejsi vam omogućavaju da arhitekturu učinite fleksibilnijom, jer objedinjuju pristup određenoj funkcionalnosti, a također vam omogućavaju da izbjegnete niz problema povezanih sa nasljeđivanjem klasa (interfejsi se također mogu naslijediti jedan od drugog).

Delphi koristi ključnu riječ interfejs za deklarisanje interfejsa. Ovo je ista ključna riječ koja definira dio modula kojem se može pristupiti izvana (između interfejsa i ključnih riječi implementacije). Međutim, kada se deklariše interfejs, koristi se drugačija sintaksa, slična deklarisanju klasa.

Delphi/Pascal

IMyNewInterface = procedura interfejsa InterfaceProc; kraj;

IMyNewInterface =sučelje

procedure InterfaceProc ;

kraj ;

Dakle, sama sintaksa deklaracije interfejsa nema fundamentalne razlike od drugih programskih jezika (osobine sintakse zasnovane na Pascal-u se ne računaju). Istovremeno, implementacija interfejsa ima niz karakterističnih karakteristika.

Činjenica je da su Delphi interfejsi prvobitno uvedeni da podržavaju COM tehnologiju. Dakle, interfejs IIinterface, koji je u Delphiju predak svih ostalih interfejsa (neka vrsta analoga TObject), već sadrži tri osnovne metode za rad sa ovom tehnologijom: QueryInterface, _AddRef, _Release. Kao rezultat toga, ako klasa implementira bilo koji interfejs, onda mora implementirati i te metode. Čak i ako ova klasa nije dizajnirana za rad sa COM.

Zbog ove karakteristike interfejsa IIinterface, u Delphiju upotreba interfejsa, u većini slučajeva, dovodi do dodavanja očigledno nekorišćenih karakteristika u klasu.

Postoji bibliotečka klasa TInterfaceObject koja već sadrži implementaciju ovih metoda i, kada se od nje nasljeđuje, nema potrebe da ih sami implementirate. Ali pošto Delphi ne podržava višestruko nasljeđivanje klasa, njegova upotreba često samo uzrokuje dodatnu složenost u dizajnu i implementaciji već potrebne funkcionalnosti.

Sve je to dovelo do činjenice da, uprkos svim mogućnostima koje pružaju interfejsi, njihova praktična upotreba u Delphiju gotovo da nije išla dalje od rada sa COM-om.

Budući da su optimizirani za rad uglavnom s ovom tehnologijom, sučelja, odnosno funkcionalnost i arhitektonska ograničenja koja dodaju bez greške, ne opravdavaju se pri rješavanju drugih problema.

Stoga su mnogi Delphi programeri još uvijek, zapravo, lišeni moćnog i fleksibilnog alata za razvoj arhitekture aplikacija.

samo za rezultate

striktno poštovanje rokova

Transparentnost

implementacija projekta

tehnička podrška na poklon

Programiranje, poboljšanja, konsultacije na 1C

Kako radimo

1. O problemu razgovaramo telefonom. Ako imate daljinski pristup - prikažite na ekranu vašeg računara.

2. Rad procjenjujemo u rubljama ako je projekat velik, ako nije - približan broj sati.

3. Završili smo posao.

4. Vi prihvatate rad u svom programu, ako postoje nedostaci, mi ih ispravljamo.

5. Mi izdajemo fakturu, vi plaćate.

Troškovi rada

1. Svi radovi su podeljeni u 3 kategorije: konsultacije, ažuriranje tipične konfiguracije, razvoj ili programiranje novog izveštaja, obrada, dugmad itd.

3. Za rad preko 10 sati unaprijed se izrađuje tehnički zadatak sa opisom i cijenom radova. Rad počinje nakon odobrenja TOR-a sa vama.

Tehnička podrška

1. Ukoliko nađete greške u prethodno prihvaćenim radovima, u roku od 3 mjeseca, ispravljamo ih besplatno.

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

Programi za vođenje vašeg poslovanja.

Kupite 1C:Enterprise

Mi smo službeni zastupnik 1C, od nas možete kupiti razne softverske proizvode i licence. Pored kupovine "kutije", pomoći ćemo vam da podesite program, konsultujete i izvršite osnovna podešavanja.

  • Računovodstvo
  • Automatizacija prodavnice
  • Veleprodaja
  • Pomoć oko instalacije i početnog podešavanja uključena je u paket!
  • Fino podešavanje konfiguracija prema potrebama kupca, razvoj novih modula u nedostatku potrebnih funkcija u standardnoj konfiguraciji.
1c računovodstvo 1C: Upravljanje trgovinom 1C: Maloprodaja 1C: Platni spisak i upravljanje ljudskim resursima
Od 3300 rub. Od 6700 rub. Od 3300 rub. Od 7400 rub.

Obezbeđivanje servera.

Server za trenutno podešavanje + 1C.

Nema servera? Nema veze, izabraćemo i brzo postaviti server u "oblaku". Za malu naknadu dobijate veoma pouzdano rešenje.

  • Dostupnost 24/7
  • Nema potrebe da zadržite svog administratora sistema (uštede će pokriti troškove vašeg servera).
  • Brzo podešavanje i instalacija 1C na serveru, za 3 dana ćete već imati potpuno ispravan sistem.
  • U svakom trenutku možete preći na lokalni server ako vam rješenje ne odgovara.

SMS sa vašeg 1C

Želite da kupci na vrijeme saznaju o akcijama i popustima? Klijenti se ne vraćaju? Podesite slanje SMS-a direktno iz 1C!

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

  • Zahvalnost za kupovinu i prikupljanje bonusa odmah nakon sljedeće kupovine.
  • Prikupljanje bonusa na karticu kao poklon za rođendan/drugi važan ili praznični dan.
  • Obavijest o skladištu.
  • Istek trajanja poklon vaučera.
  • Obaveštenje o prijemu avansa i rezervaciji robe.
  • Adresa sa uputama za radnju/kancelariju, brojevi telefona.
  • itd.

Postavljanje u 1C mogu izvršiti naši stručnjaci ili naši zaposlenici. Sa tarifama se možete upoznati na stranici SMS-tarife.

  • Garancija dostave SMS-a, novac se podiže samo za isporučeni SMS.
  • Zasebna naplata za svaki SMS.
  • Dopunjavanje bilansa na razne načine.
  • Pogledajte historiju svih poslanih SMS-ova u bilo kojem trenutku.
  • Ime pošiljaoca umjesto brojčanog broja na telefonu primaoca.
Ovaj članak se zasniva na pitanjima na forumima: "Kako da vratim string iz DLL-a?", "Kako da prosledim i vratim niz zapisa?", "Kako da prosledim obrazac u DLL?".

Kako ne biste proveli pola života smišljajući to - u ovom članku ću sve donijeti na srebrnom tacnu.

Teme ovog članka, u različitoj mjeri, već su dotaknute više puta na ovom blogu, ali u ovom članku su skupljene u gomilu, daju se opravdanja. Ukratko, veza do ovog članka može se baciti onima koji razvijaju DLL.

Važna napomena: članak se mora pročitati sukcesivno. Primjeri kodova su dati samo kao primjeri, na svakom koraku (tački) članka dodaje se šifra primjera s novim detaljima. Na primjer, na samom početku članka nema rukovanja greškama, naznačene su "klasične" metode (kao što su korištenje GetLastError, sdtcall konvencije itd.), koje se u toku članka zamjenjuju adekvatnijim. To se radi iz razloga što "novi" ("neobični") dizajni ne postavljaju pitanja. U suprotnom, uz svaki primjer bi se morala ubaciti napomena u obliku: "o tome se govori u onom pasusu ispod, a o onom - u ovom ovdje." U svakom slučaju, na kraju članka nalazi se link 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" - skrolujte do kraja do zaključka i linka za preuzimanje primjera.

Top Related Articles