Umíme to s Delphi, 61. díl – nebojte se DDE, vytváříme server

V minulém dílu seriálu jsme si uvedli základní informace o mechanismu dynamické datové výměny (DDE). Kromě toho jsme společně vytvořili ukázkový DDE server a DDE klienta. Dnes nás čeká další přísun informací o navazování, udržování a využívání DDE spojení prostřednictvím komponent Delphi.

DDE v Delphi – 4 základní komponenty

Jak jsme si uvedli před týdnem, DDE je mechanismus pro posílání dat jiným aplikacím a přijímání dat od jiných aplikací. V Delphi je podpora DDE přizpůsobena především pro výměnu textových informací (textových řetězců), jak jsme si to konečně ukázali v minulém dílu. V rámci DDE je ovšem možné posílat i příkazy či makra, jejichž provedení od jiných aplikací vyžadujeme. Jinak řečeno – DDE je další technologií, která umožňuje ovládat jiné aplikace z „naší“ aplikace.

Typický způsob používání DDE v Delphi je následující: naváže se spojení („rozhovor“) mezi dvěma aplikacemi (nezáleží příliš na tom, zda jsme obě vytvářeli svépomocí nebo zda je jedna z nich cizí). Jakmile je rozhovor navázán, aplikace si dokáží automaticky posílat (textová) data. Změní-li se příslušný text v jedné aplikaci, DDE automaticky aktualizuje tentýž text ve druhé z nich.

Nejprve si zopakujeme základní tři pojmy DDE komunikace (a zdůrazníme jejich specifičnost při práci v Delphi):

  • služba (service) – název aplikace serveru, při programování v Delphi je název spustitelné (výsledné) aplikace shodný s názvem jejího projektu (soubor *.dpr).
  • téma (topic) – jemnější identifikace komunikace, např. datový soubor nebo název okna obsahující požadované údaje; při programování v Delphi bývá tématem obvykle hodnota vlastnosti Caption příslušného formuláře (obsahující data, jež mají být předmětem komunikace), případně jméno (vlastnost Name) konverzační komponenty serveru (DdeServerConv).
  • položka (item) – konkrétní datová položka, kterou server poskytuje (nebo klient požaduje). Při programování v Delphi bývá názvem položky název položkové komponenty serveru (DdeServerItem).

DDE v Delphi používáme v případě, že potřebujeme vyměňovat odlišné textové řetězce. Pokud např. ve vytvářené aplikaci potřebujeme znát obsah nějaké buňky z tabulkového procesoru (Excel), je řešením vytvořit DDE spojení mezi touto buňkou a (klientskou) aplikací vytvářenou v Delphi. Obsah buňky je následně možné zobrazit v nějakém editačním poli nebo v nápisu. DDE zároveň chrání (originální) data v tabulkovém procesoru, neboť uživatel klientské aplikace nemůže změnit jejich hodnotu přímo v aplikaci serveru.

Jak už bylo řečeno, DDE je starší technologií, která je v současnosti nahrazena mechanismem OLE Automation, případně jinými technologiemi COM. DDE se tak používá spíše v případě, kdy potřebujeme přistupovat ke starším (serverovým) aplikacím, jež nepodporují nové technologie, disponují však podporou DDE.

Pro práci s DDE ve vytvářené aplikaci nabízí Delphi 4 základní komponenty. Při vytváření serveru používáme serverové komponenty (komunikační a položkovou), při programování klienta naopak klientské (komunikační a položkovou). Připomeňme, že všechny čtyři nalezneme na paletě System. V následujících podkapitolách si je podrobně popíšeme.

Komponenta DdeServerConv – téma serveru

Tato komponenta reprezentuje téma (topic) DDE rozhovoru. V naší jednoduché aplikaci před týdnem jsme tuto komponentu vůbec nepoužili – a v takovém případě je pro klienty tématem např. jméno okna. Je-li komponenta DdeServerConv použita, klienti se mohou na téma odkazovat prostřednictvím jejího jména. Abychom si to předvedli, rozšíříme aplikaci z minulého týdne právě o tuto komponentu: přidejte ji na formulář serverové aplikace. Nyní je nutné nastavit toto téma jako vlastnost ServerConv komponenty DdeServerItem (položka musí vědět, ke kterému náleží tématu).

V klientské aplikaci nyní nemusíme zadávat jako jméno tématu název okna serveru, můžeme zadat přímo jméno příslušné komponenty DdeServerConv (tedy např. DdeServerConv1).

Vytváříme-li serverovou aplikaci, která obsahuje více témat (je schopna poskytovat data týkající se více témat), je samozřejmě možné umístit do ní více komponent DdeServerConv s tím, že každé téma je reprezentováno jednou z nich.

Téma je však stále ještě abstraktní pojem (neznamená žádná fyzická data). Vlastní data jsou obsažena až v položkách (items) každého tématu. K reprezentaci položek používáme komponentu DdeServerItem (viz dále). Každé téma může obsahovat více položek (tedy více komponent DdeServerItem). Pro každou položku (pro každou komponentu DdeServerItem) musíme nastavit téma, ke kterému se vztahuje (což se provádí nastavením vlastnosti ServerConv jednotlivých komponent DdeServerItem).

Jak už jsme si předváděli (a uváděli), používání komponent DdeServerConv není povinné. Pokud ji do aplikace nezařadíme, klienti mohou stále ještě přistupovat k serveru přímo prostřednictvím jednotlivých položek serveru (komponent DdeServerItem). Téma je přitom možné identifikovat např. názvem okna. Komponentu DdeServerConv je však nutno použít v případě, že klienti chtějí serveru posílat makra či příkazy.

Ještě jednou tedy zopakujme, že z hlediska klientů je jménem tématu buď název (vlastnost Name) komponenty DdeServerConv a nebo název okna (vlastnost Caption), které příslušná data poskytuje. Druhá varianta platí i pro ty položky serveru, které nejsou přiřazeny k žádnému tématu (k žádné komponentě DdeServerConv). Komponentu DdeServerConv tedy používáme, pokud:

  • server hodlá poskytovat více témat v rámci jednoho formuláře, nebo
  • titulek formuláře (Caption) není jednoznačným identifikátorem (existuje více formulářů s tímtéž titulkem), nebo
  • titulek formuláře není za běhu aplikace konstantní, nebo
  • chceme pracovat i s příkazy či makry.

Komponenta DdeServerConv nemá žádné „vlastní“ vlastnosti, všechny zdědila od svého předka – TComponent. Důležitý je prakticky jen její název (vlastnost Name), a to k identifikaci tématu pro klienty.

DdeServerConv má tři metody: Create se používá (jako u všech jiných komponent) pro její vytvoření (vytváříme-li ji za běhu programu, nikoliv v návrhové fázi). Naopak metoda Destroy způsobí zrušení komponenty a uvolnění paměti. Destroy by neměla být volána přímo, doporučuje se zavolat místo ní metodu Free, která zaručí bezpečné uvolnění. Uvolněním dojde k odebrání tématu, nicméně nikoliv k ukončení kterékoliv probíhající konverzace (rozhovoru). Položky (DdeServerItem), které byly asociovány s rušeným tématem, budou nadále asociovány s příslušným formulářem (jeho názvem).

Poslední metodou je ExecuteMacro, která slouží k reagování na makro zaslané klientem. ExecuteMacro je zavolána v okamžiku, kdy DDE klient pošle prostřednictvím DDE makro. V parametru metody je předán handle na DDE data, která obsahují makro. ExecuteMacro získá textový řetězec z těchto dat a vyvolá událost OnExecuteMacro. Pokud obsluha této události neexistuje, makro je ignorováno.

DdeServerConv obsahuje také tři události: OnClose se objeví, ukončí-li klient rozhovor. V obsluze této události by se samozřejmě měly objevit nutné akce, jež je nutné v takovém případě provést. Parametrem Sender této události je příslušná komponenta DdeServerConv, nikoliv klient.

Událost OnExecuteMacro je vyvolána, když klient pošle serveru makro. V obsluze této události tedy programujeme odpověď na takové makro. Parametr Sender identifikuje DdeServerConv komponentu, parametr Msg obsahuje vlastní text makra.

Příklad na použití makra si uvedeme později, až poznáme odpovídající klientskou „protistranu“ mince.

Poslední událostí je OnOpen, která je vyvolána ihned poté, co je vytvořeno spojení. Parametr Sender identifikuje DdeServerConv komponentu, nikoliv klienta.

Komponenta DdeServerItem – položka tématu serveru

Komponenta DdeServerItem definuje položku komunikace příslušného tématu. DdeServerItem může zajistit sama (příp. ve spolupráci s komponentou DdeServerConv) funkci aplikace jako DDE serveru. DDE klienti se připojují k jednotlivým serverům DDE serverům tak, že vytvoří spojení na základě požadované datové položky (item). Komponenta DdeServerItem vystupuje v serverové aplikaci právě jako jednotlivá položka, takže klienti používají její název – vlastnost Name.

Nejprve si popíšeme vlastnosti této komponenty. Existují čtyři základní (viz následující tabulka:

Vlastnost Popis
Fmt Read-only vlastnost, která indikuje, v jakém formátu jsou data příslušné položky vzhledem ke schránce systému Windows (schránkou a jejími formáty jsme se zabývali v 28. a 29. díle seriálu) v případě, že tato data nejsou textová. Data posílaná klientovi obsahují tuto informaci o formátu, takže klient je může korektně interpretovat.
Lines Obsahuje (textová) data, která jsou předmětem DDE konverzace. Typ této vlastnosti je TStrings. Po změně (nastavení) hodnoty vlastnosti Lines dojde nejprve k vyvolání události OnChange příslušné položky a vzápětí je nová hodnota této vlastnosti poslána klientovi. Vlastnost Lines obvykle obsahuje textová data, takže odpovídající formát (vlastnost Fmt) je nastaven na CF_TEXT. Pravdou ovšem je, že řetězce Delphi mohou obsahovat i netextová data, v takovém případě musí být Fmt změněna v obsluze události OnChange. Poslední poznámka může spočívat v tom, že vlastnost Lines koresponduje s vlastností Text (která obsahuje data nikoli ve formátu TStrings, ale jako jeden řetězec). Změní-li se hodnota jedné z vlastností Lines nebo Text, druhá vlastnost je automaticky aktualizována.
ServerConv Udává téma, které je s touto položkou asociováno (tedy jméno příslušné komponenty DdeServerConv). Je asi zbytečné dodávat, že pokud není tato vlastnost nastavena, je tématem aktuální položky název (Caption) formuláře, na němž leží komponenta DdeServerItem.
Text Obsahuje – podobně jako Lines – data určená k DDE komunikaci. Další podrobnosti viz popis vlastnosti Lines.

Jak vytvořit DDE Server – shrnutí

Pojďme si na závěr popisu „serverových“ komponent shrnout, jak se vytvoří aplikace fungující jako server DDE:

  • Chceme-li reagovat také na makra zasílaná klienty, použijeme obě komponenty DdeServerItem a DdeServerConv (stejně postupujeme i v dalších případech popsaných výše).
  • V obsluze události OnExecuteMacro makro zpracujeme (příklad serveru zpracovávajícího makra si uvedeme v následujícím dílu seriálu).
  • Obě komponenty použijeme také v případě, že chceme využívat jméno komponenty DdeServerConv jako název tématu pro DDE komunikaci.
  • Použijeme-li jen komponentu DdeServerItem, je názvem tématu titulek formuláře obsahující tuto komponentu DdeServerItem.

Při použití obou komponent nastavíme jméno (vlastnost Name) komponenty DdeServerConv do vlastnosti ServerConv komponenty DdeServerItem. Toto nastavení můžeme provést dvěma způsoby:

  • v návrhové fázi zvolíme hodnotu jednoduše ze seznamu u příslušné vlastnosti v Object Inspectoru;
  • za běhu programu je samozřejmě nutné napsat programový kód, který toto nastavení provede.

Na závěr

Nyní již máme všechny potřebné informace, které nám umožní vytvářet jednodušší servery DDE. Je vidět, že vytvoření DE serveru je v Delphi otázkou nejvýše několika minut. Za týden si stejně podrobně ukážeme, jak vytvořit klienta – což je neznatelně složitější. To však nebude všechno: začneme společně vytvářet rozsáhlejší aplikaci sloužící jako demonstrace možností DDE.
Diskuze (3) Další článek: PCtuning: Thoroughbred v naši laboratoři

Témata článku: Software, Programování, Klient, Odpovídající formát, Item, Jednotlivé položky, Jednotlivá buňka, Poslední poznámka, Konverzace, Díl, Následující aplikace, DEL, Typický způsob, Destroy, Textový řetězec, Makro, Delphi, Základní popis, Položka, Jednotlivý díl, Komponenta, Jednotlivé komponenty, Lines


Určitě si přečtěte

Dostali jste nový počítač? Tohle s ním udělejte, než ho začnete používat

Dostali jste nový počítač? Tohle s ním udělejte, než ho začnete používat

** Každý nový počítač si zaslouží počáteční péči ** Odinstalujte bloatware a nezapomeňte na vhodné nastavení ** Poradíme, jak se o počítač s Windows 10 postarat

David Polesný, Stanislav Janů | 75

David PolesnýStanislav Janů
PočítačeNotebooky
Nová volitelná aktualizace opravuje více než 40 chyb v operačním systému Windows 10
Karel Kilián
Windows UpdateAktualizaceWindows 10
Kudy proudí doprava? Na mapách můžete sledovat autobusy, vlaky, letadla i lodě

Kudy proudí doprava? Na mapách můžete sledovat autobusy, vlaky, letadla i lodě

Současná situace cestování zrovna dvakrát nepřeje, kvůli covidu můžeme jezdit leda tak prstem po mapě. A nebo můžeme prsty nechat volné a koukat, jak po mapě cestuje někdo jiný. Díky otevřeným datům dopravních či přepravních společností je to hračka.

Lukáš Václavík | 12

Lukáš Václavík
Doprava
Pozor na tyto doplňky pro Chrome a Edge. Mohou obsahovat malware, varuje Avast
Jakub Čížek
MalwareProhlížeče
Finanční správa tento měsíc spustí Moje Daně. Přiznání má být hračka
Lukáš Václavík
eIdentitaČeskoeGovernment
Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

** Testujeme Apple Macbook Air s procesorem M1 ** Zajímá nás nejen výkon, ale zejména kompatibilita aplikací ** Článek je průběžně doplňován na základě vašich dotazů

Jiří Kuruc | 209

Jiří Kuruc
Apple