• Doporučení pro vytváření uživatelských rozhraní v Delphi. Abstrakt: Používání otevřených rozhraní programovacího prostředí Delphi Programs pro řízení vašeho podnikání

    Stvoření rozhraní uživatel se omezí na výběr z palety komponent, které komponenty Delphi jsou nezbytné pro fungování programu a obsluhu rozhraní vedení, stejně tak rozhraní zobrazení informací a jejich přenos do formuláře s následným rozložením.

    Uživatelské rozhraní, které vytvoříte, by mělo používat standardní, uživatelsky známé prvky a poskytovat maximální pohodlí. To vše je nakonec určeno takovým kritériem, jako je účinnost rozhraní - maximální výsledek s minimálním úsilím.
    Principy tvorby uživatelsky přívětivého rozhraní jsou známé. Jako nejobecnější zásady pro vytváření uživatelských rozhraní lze považovat tři hlavní body:

    1. Program by měl pomoci splnit úkol, ne se stát úkolem.
    2. Při práci s programem by se uživatel neměl cítit jako blázen.
    3. Program by měl fungovat tak, aby uživatel počítač nepovažoval za blázna.
    První zásada- jedná se o tzv. "průhlednost" rozhraní. Uživatelské rozhraní by mělo být intuitivní, snadno se naučit a nevytvářet uživateli problémy, které bude muset v procesu překonat. Používejte standardní, nepřikrášlené komponenty, používejte obvyklé ovládací prvky používané podobnými programy a dosáhnete výkonnostních kritérií první zásada.

    Druhý princip spočívá v zanedbání intelektuálních schopností uživatelů. Z vlastní zkušenosti vím, že často uživatelé nejen neumějí pracovat u počítače, ale jednoduše se bojí sami cokoliv dělat. Uživatelské rozhraní by proto mělo být co nejpřívětivější.
    Obavy uživatelů jsou navíc často oprávněné, protože náklady na program a samotný počítač se nedají srovnávat například s náklady na databázi vytvořenou mnohaletým úsilím. Proto musí programátor při vytváření uživatelského rozhraní vždy zabudovat do programu „ochranu bláznů“ – před chybnými akcemi a uživatelským zadáním nesprávných dat. Někteří programátoři se ale s takovou ochranou nechají příliš unést, udělají ji příliš rušivou a v důsledku toho fungování programu připomíná slavné „krok vlevo, krok vpravo je považován za únik“! A to, co programátor vytvoří jako řešení problému, samo začne vytvářet problémy.
    Abychom vyhověli druhý princip není třeba dovolit programu, aby „opravoval“ akce uživatele a naznačoval, co přesně má za něj jednat, čímž jej zažene do úzkého rámce. Také byste se neměli nechat příliš unést zobrazováním informačních nápověd, zejména dialogových, protože to odvádí pozornost uživatele od práce. A je lepší poskytnout možnost úplně zakázat výzvy.

    Třetí princip je vytvořit program s co největšími „mentálními“ schopnostmi. Navzdory rychlému rozvoji výpočetní techniky lze i rozšířené programy jen velmi podmíněně nazývat umělou inteligencí. Zasahují do práce uživatele zobrazováním dialogových oken s hloupými otázkami, které způsobují zmatek i v těch nejjednodušších situacích. Výsledkem je, že uživatelé ve svých srdcích volají: "No, to auto je hloupé!"
    Osobně mi vadí neustálé dotazy snad všech textových editorů, zda změněný text uložit, ačkoliv se původní a aktuální text neliší ani o jediný znak. Ano, něco jsem napsal, ale pak jsem vše vrátil, je opravdu nemožné na to přijít! Musím zkontrolovat, jestli jsem něco nepokazil.

    Snažte se dodržovat následující pravidla:

    Standardní prvky rozhraní
    Pro tento prvek rozhraní použijte standardní komponenty. Po seznámení s vaším programem nebude uživatel ztrácet čas seznamováním se, ale okamžitě začne pracovat - to je jeden ze znaků profesionálně vyrobeného programu.
    Malá paleta nástrojů
    Snažte se nepoužívat příliš mnoho různých komponent. A samozřejmě pomocí jedné standardní součástky někde na jednom místě ji v podobném případě také použít.
    Stejné rozestupy mezi ovládacími prvky
    Uspořádejte prvky rozhraní ve stejné vzdálenosti od sebe. Náhodně rozházené komponenty vytvářejí pocit neprofesionálního produktu. A naopak, pečlivě zkalibrované umístění na formuláři tlačítek, přepínačů, zaškrtávacích políček a dalších komponent, které tvoří rozhraní, je známkou kvalitní práce.
    pořadí karet. "správné pořadí
    TabOrder je pořadí, ve kterém se kurzor na obrazovce pohybuje nad ovládacími prvky, když je stisknuta klávesa Tab. Ve správně napsaném programu se kurzor pohybuje v souladu s logikou práce uživatele s programem. Při tvorbě programu programátor často komponenty mění, některé odebírá, jiné podle potřeby přidává. Výsledkem je, že v hotovém programu kurzor náhodně přeskakuje přes formulář. Po dokončení programu nezapomeňte nastavit TabOrder.
    Výběr písma
    Nechte písma na pokoji. Vlastní výchozí fonty Delphi budou fungovat pro jakýkoli systém, na kterém může běžet váš program. Tučné písmo používejte pouze pro zvýraznění důležitých prvků. aplikace kurzívní a zvláště podtržení, který může uživatel zaměnit za hypertextový odkaz – špatný tvar.
    Výběr barev
    Co se týče barev prvků rozhraní, stejně jako v případě písem je lepší ponechat je standardně standardní. Delphi používá systémovou paletu Windows a její změnou si uživatel může snadno přizpůsobit barvy pro sebe.
    Alternativní řízení
    Profesionálně vyrobený program by se měl dát ovládat nejen myší, ale i klávesnicí. Neměly by být k dispozici žádné funkce pro provádění pouze myší (kreslení v grafických editorech se nepočítá!). U nejpoužívanějších funkcí by měly být k dispozici „horké klávesy“ pro jejich rychlý přístup.
    Stavební bloky rozhraní
    S ohledem na specifické prvky uživatelského rozhraní závisí kvalita interakce uživatele s programem na:
    • soulad ovládacího prvku s jeho úkolem;
    • pravidla, podle kterých kontrola funguje.
      Tato stránka pojednává o pravidlech pro vytváření některých prvků rozhraní.
    A nyní chci ukázat, jaké nástroje nabízí Delphi pro správu komponent na formuláři, jejich relativní polohu a chování kurzoru při stisku klávesy. Tab.

    Aby bylo možné uspořádat komponenty vůči sobě ve správném pořadí, nejprve je potřeba je zvýraznit. Můžete jednoduše táhnout myší přes oblast ve formuláři, která obsahuje vybrané komponenty. Nebo držením Posun", stejnou myší určete každou komponentu, která má být vybrána. Opakované kliknutí myší na vybranou komponentu (při současném stisknutí " Posun") zruší výběr.

    Vybrané komponenty lze spravovat jako jeden celek – přesouvat po Formuláři, přiřazovat hodnoty stejným vlastnostem, kopírovat (pro instalaci např. na jiný Formulář), dokonce mazat.

    Nyní klikněte pravým tlačítkem myši na jednu ze součástí az "vyskakovací" nabídky vyberte Pozice -> Zarovnat... Zobrazí se dialogové okno, které vám umožní upravit polohu komponent ve skupině vodorovně a svisle. Potřebujeme například zarovnat naše čtyři tlačítka doleva a ujistit se, že mají mezi sebou stejnou vertikální vzdálenost. Chcete-li to provést, vyberte přepínače Horizontální: levé strany A Vertikální: Prostor rovnoměrně.

    Výběr položky Centrum, rozmístíme součástky tak, aby jejich středy byly umístěny na stejné čáře vodorovně nebo svisle a bod Střed v okně přesune komponenty do středu okna, buď horizontálně nebo vertikálně.

    Ve stejné nabídce řádek Tab Ó objednat... způsobí zobrazení dialogového okna, které řídí pohyb kurzoru přes prvky rozhraní při stisku klávesy Tab. Když se formulář objeví na obrazovce, kurzor bude přirozeně na komponentě umístěné na prvním řádku dialogového okna. A pak se posune v seznamu dolů. V dialogovém okně dvě modré šipky „nahoru“ a „dolů“ ovládají polohu vybrané součásti. Vyberte požadovanou součást, pomocí šipek se přesuňte na požadovaný řádek v seznamu atd.

    Při výběru položky nabídky Ovládání -> Zobrazí se podnabídka se dvěma položkami:

    • Přenést do popředí
    • Odeslat nazpátek
    Jedná se o komponentní metody, které jsou dostupné i programově. Button1.SendToBack přesune tlačítko na "pozadí" a Button1.BringToFront- přivést na frontu“. To znamená, že pokud je jedna součást umístěna nad druhou, tyto metody je prohodí. Případy, kdy to může platit, jsou poměrně zřejmé.

    jen pro výsledky

    přísné dodržování termínů

    Průhlednost

    realizace projektu

    technická podpora jako dárek

    Programování, vylepšení, konzultace k 1C

    Jak pracujeme

    1. Problém probereme telefonicky. Pokud máte vzdálený přístup – zobrazte na obrazovce počítače.

    2. Hodnotíme práci v rublech, pokud je projekt velký, pokud ne - přibližný počet hodin.

    3. Dokončíme práci.

    4. Přijímáte práci ve svém programu, pokud jsou nedostatky, opravujeme je.

    5. Vystavíme fakturu, zaplatíte.

    Náklady na práci

    1. Všechny práce jsou rozděleny do 3 kategorií: konzultace, aktualizace typické konfigurace, vývoj nebo programování nové sestavy, zpracování, tlačítka atd.

    3. Pro práci nad 10 hodin je předem připraven technický úkol s popisem a cenou práce. Práce začíná po schválení TOR s vámi.

    Technická podpora

    1. Pokud v dříve přijatých pracích najdete nějaké chyby, do 3 měsíců je zdarma opravíme.

    2. U stálých zákazníků opravujeme do roka zdarma nedostatky v naší práci.

    Programy pro řízení vašeho podnikání.

    Koupit 1C:Enterprise

    Jsme oficiálním prodejcem 1C, můžete si u nás zakoupit různé softwarové produkty a licence. Kromě zakoupení „krabice“ vám pomůžeme program nastavit, poradit se a provést základní nastavení.

    • Účetnictví
    • Automatizace prodejny
    • Velkoobchod
    • Pomoc s instalací a počátečním nastavením je součástí balení!
    • Doladění konfigurací podle potřeb zákazníka, vývoj nových modulů při absenci potřebných funkcí ve standardní konfiguraci.
    1c účetnictví 1C: Řízení obchodu 1C: Maloobchod 1C: Řízení mezd a lidských zdrojů
    Od 3300 rublů. Od 6700 rublů. Od 3300 rublů. Od 7400 rublů.

    Poskytování serveru.

    Server pro okamžité nastavení + 1C.

    Žádný server? Nevadí, vybereme a rychle nastavíme server v "cloudu". Za malý poplatek získáte velmi spolehlivé řešení.

    • Dostupnost 24/7
    • Není třeba mít vlastního správce systému (úspory pokryjí náklady na váš server).
    • Rychlé nastavení a instalace 1C na server, za 3 dny již budete mít plně funkční systém.
    • Pokud vám řešení nevyhovuje, můžete se kdykoli přesunout na místní server.

    SMS z vašeho 1C

    Chcete, aby se zákazníci o akcích a slevách dozvěděli včas? Klienti se nevracejí? Nastavte si odesílání SMS přímo z 1C!

    Naše společnost bude moci rychle nastavit zasílání SMS vašim zákazníkům přímo z 1C. Příklady událostí, které lze automatizovat:

    • Vděčnost za nákup a načítání bonusů ihned po dalším nákupu.
    • Připisování bonusů ke kartě jako dárek k narozeninám/jinému významnému či svátku.
    • Oznámení o skladu.
    • Platnost dárkového poukazu.
    • Oznámení o přijetí platby předem a rezervaci zboží.
    • Adresa s nasměrováním do obchodu/kanceláře, telefonní čísla.
    • A tak dále.

    Nastavení v 1C mohou provést naši specialisté nebo naši zaměstnanci. S tarify se můžete seznámit na stránce SMS-tarify.

    • Garance doručení SMS, peníze jsou vybírány pouze za doručené SMS.
    • Samostatné účtování pro každou SMS.
    • Doplňování zůstatku různými způsoby.
    • Prohlédněte si kdykoliv historii všech odeslaných SMS.
    • Jméno odesílatele místo číselného čísla na telefonu příjemce.

    Mám problém s použitím třídy Delphi z kódu C++. delphi dll demo, které exportuje funkci, která vrací objekt.
    můj kód Delphi DLL vypadá takto:

    Knihovna DelphiTest; // používá část.... typ IMyObject = interface procedure DoThis(n: Integer); funkce DoThat: PWideChar; konec; TMyObject = class(TInterfacedObject,IMyObject) procedure DoThis(n: Integer); funkce DoThat: PChar; konec; // Implementace TMyObject přejděte sem ... procedure TMyObject.DoThis(n: Integer); begin showmessage("voláte metodu DoThis s "+intToStr(n) +"parametr"); konec; funkce TMyObject.DoThat: PChar; begin showmessage("voláte funkci DoThat"); Vysledek:= Pchar("Ahoj im Dothat"); konec;

    // export funkce DLL:

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

    v mém projektu C++ jsem deklaroval rozhraní IMyObject takto:

    Třída IMyObject ( public: IMyObject(); virtuální ~IMyObject(); virtuální void DoThis(int n) = 0; virtuální znak* DoThat() = 0; );

    a moje hlavní funkce je následující:

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

    v tomto příkladu jsem při pokusu o přístup k exportované funkci dostal runtime chybu. chyby v řádcích:
    IMyObject* objptr = pfnCreate();

    Můžete mi říct, co je na mém příkladu špatně?
    a pokud možno jakýkoli pracovní příklad pro přístup ke třídě Delphi (v DLL) z kódu C++.

    Řešení

    Prvním problémem je volání konvence metody. Rozhraní Delphi používá registr, což je konvence volání specifická pro Delphi. pomocí stdcall Například pro metody rozhraní.

    Další problém je v C++. Vaše rozhraní C++ musí být odvozeno z IUnknown a také nesmí deklarovat konstruktor nebo destruktor.

    Kromě toho váš kód Delphi exportuje PWideChar, který se nemapuje na char* . Mapuje se na wchar_t* .

    Když se podíváme dále, vrácení PChar zde funguje skvěle, protože vaše implementace vrací doslovný. Ale serióznější kód bude pravděpodobně chtít použít dynamicky alokovaný řetězec, v tomto okamžiku je váš návrh chybný.

    Abyste mohli vytvořit soubor v kořenovém adresáři systémové jednotky, musíte být se zvýšenými oprávněními. Takže toto je další potenciální bod selhání.

    Očekávám, že existují další chyby, ale to je vše, co jsem zatím našel.

    Tento článek je založen na otázkách na fórech: "Jak vrátím řetězec z knihovny DLL?", "Jak předám a vrátím pole záznamů?", "Jak předám formulář do knihovny DLL?".

    Abyste na to nestrávili půl života vymýšlením – v tomto článku vše přinesu na stříbrném podnose.

    Témata tohoto článku se v různé míře již v tomto blogu dotkla více než jednou, ale v tomto článku jsou shromážděna na hromadě, jsou uvedena odůvodnění. Stručně řečeno, odkaz na tento článek lze hodit těm, kteří vyvíjejí DLL.

    Důležitá poznámka: článek se musí přečíst postupně. Příklady kódu jsou poskytovány pouze jako příklady, v každém kroku (bodu) článku je doplněn kód příkladů s novými detaily. Například hned na začátku článku chybí ošetření chyb, jsou naznačeny "klasické" metody (jako je použití GetLastError , sdtcall konvence atd.), které jsou v průběhu článku nahrazovány adekvátnějšími. Děje se tak z toho důvodu, že "nové" ("neobvyklé") vzory nevyvolávají otázky. Jinak by se ke každému příkladu muselo vložit poznámku ve formuláři: "o tom se mluví v tom odstavci níže, ale o tom - v tomto zde." V každém případě je na konci článku odkaz na hotový kód napsaný s ohledem na vše, co je v článku uvedeno. Můžete to prostě vzít a použít. A článek vysvětluje proč a proč. Pokud vás „proč a proč“ nezajímá – přejděte na konec k závěru a odkazu ke stažení ukázky.

    Objektově orientované programování (OOP), kromě konceptu třídy, také poskytuje základní koncept rozhraní.

    Co je rozhraní a jaké jsou vlastnosti práce s ním v programovacím jazyce Delphi?

    Rozhraní je sémantický a syntaktický konstrukt v programovém kódu používaný ke specifikaci služeb poskytovaných třídou nebo komponentou (Wikipedie).

    Rozhraní ve skutečnosti definuje seznam vlastností a metod, které by měly být použity při práci s třídou, která toto rozhraní implementuje, a také jejich podpis (název, datový typ, akceptované parametry (pro procedury a funkce) atd.). Třída, která implementuje rozhraní, tedy musí nutně implementovat všechny jeho komponenty. Navíc v přísném souladu s tím, jak jsou v něm popsány.

    Velmi často se rozhraní porovnávají s abstraktními třídami, ale přes všechny podobnosti není toto srovnání zcela správné. V abstraktních třídách je k dispozici minimálně kontrola nad viditelností členů. Zároveň nejsou definovány rozsahy pro rozhraní.

    Rozhraní vám umožňují učinit architekturu flexibilnější, protože sjednocují přístup k té či oné funkcionalitě, a také vám umožňují vyhnout se řadě problémů spojených s dědičností tříd (rozhraní lze zdědit i jedno od druhého).

    Delphi používá klíčové slovo interface k deklaraci rozhraní. Toto je stejné klíčové slovo, které definuje sekci modulu, ke které lze přistupovat zvenčí (mezi klíčovými slovy rozhraní a implementace). Při deklaraci rozhraní se však používá jiná syntaxe, podobně jako při deklaraci tříd.

    Delphi/Pascal

    IMyNewInterface = procedura rozhraní InterfaceProc; konec;

    IMyNewInterface = rozhraní

    procedura InterfaceProc ;

    konec ;

    Samotná syntaxe deklarace rozhraní tedy nemá žádné zásadní rozdíly od jiných programovacích jazyků (funkce syntaxe založené na Pascalu se nepočítají). Implementace rozhraní má přitom řadu charakteristických rysů.

    Faktem je, že rozhraní Delphi byla původně představena pro podporu technologie COM. Proto rozhraní IInterface, které je v Delphi praotcem všech ostatních rozhraní (jakási obdoba TObject), již obsahuje tři základní metody pro práci s touto technologií: QueryInterface, _AddRef, _Release. V důsledku toho, pokud třída implementuje jakékoli rozhraní, pak musí implementovat také tyto metody. I když tato třída není navržena pro práci s COM.

    Díky této vlastnosti rozhraní IInterface vede v Delphi použití rozhraní ve většině případů k přidání zjevně nepoužívaných funkcí do třídy.

    Existuje knihovní třída TInterfaceObject, která již implementaci těchto metod obsahuje a při dědění z ní není potřeba je implementovat sami. Protože ale Delphi nepodporuje vícenásobnou dědičnost tříd, jeho použití často způsobuje pouze další složitost při návrhu a implementaci již požadované funkčnosti.

    To vše vedlo k tomu, že přes všechny možnosti, které rozhraní poskytují, jejich praktické využití v Delphi téměř nepřesáhlo rámec práce s COM.

    Protože jsou optimalizovány pro práci hlavně s touto technologií, rozhraní, respektive funkčnost a architektonická omezení, která bezesporu přidávají, se při řešení jiných problémů neospravedlňují.

    Mnoho programátorů Delphi je proto ve skutečnosti stále ochuzeno o výkonný a flexibilní nástroj pro vývoj aplikační architektury.