12. Komponenty NetMasters II

V této kapitole pokračuje popis komponent NetMasters. Jsou zde popsány:


Jednotka NMHttp

Jednotka NMHttp obsahuje komponentu TNMHTTP a třídu a typy, které komponenta používá. Je zde používána třída THeaderInfo a typy:

Třída THeaderInfo

Třída je poskytnuta k usnadnění používání rozhraní pro přidávání nejobecnějších prvků hlavičky HTTP. Tyto prvky jsou nepovinné a jsou používány z různých důvodů.
Třída má následující vlastnosti:
 
property Cookie: string; Vlastnost obsahuje odcházející Cookie, který bude odeslán na vzdáleného hostitele, když děláme požadavek HTTP. Toto je užitečné pro návrat Cookie dříve zaslaného na stejného hostitele. 
property LocalMailAddress: string; Vlastnost specifikuje e-mail adresu lokálního uživatele, vytvářející požadavek HTTP. 
property LocalProgram: string; Vlastnost specifikuje jméno lokální aplikace zasílající požadavek HTTP.
property Password: string; Vlastnost specifikuje heslo, pokud pro přístup k dokumentu na WWW je požadováno. Poskytnuté heslo musí odpovídat uživateli zadanému ve vlastnosti UserID.
property Referer: string; Vlastnost specifikuje adresu místa, které ukazuje klientu na požadovaný dokument. Aplikace tuto vlastnost získá z kliknutí na nějaké vazbě na stránce, kterou stránka používá k odkazování na stránku požadovanou vazbou.
property UserId: string; Vlastnost specifikuje identifikaci uživatele, pokud pro přístup k dokumentu WWW je požadováno. Identifikace uživatele musí odpovídat heslu uvedenému ve vlastnosti Password

Typ CmdType

CmdType = (CmdGET, CmdOPTIONS, CmdHEAD, CmdPOST, CmdPUT, CmdPATCH, CmdCOPY,
          CmdMOVE, CmdDELETE, CmdLINK, CmdUNLINK, CmdTRACE, CmdWRAPPED);
Typ CmdType je používán jako typ prováděného příkazu HTTP.

Typ TResultEvent

TResultEvent = procedure(Cmd: CmdType) of object;
Typ události je použit, když událost potřebuje specifikovat příkaz HTTP, který je prováděn.

Komponenta TNMHTTP

Komponenta TNMHTTP je používána pro provádění přenosů HTTP ve WWW. Tato komponenta odpovídá verzi 1.1 HTTP.
Pomocí metody Get, dokument může být získán z WWW serveru, metodou Post můžeme dokument odeslat na WWW server, metodou Put dokument může být vytvořen na WWW serveru, metodou Delete dokument může být odstraněn z WWW serveru, metodou Trace můžeme zobrazit data a hlavičku odeslané na vzdálený server a metodou Option můžeme získat příkazy podporované serverem a specifikovaným dokumentem.
Komponenta má tyto vlastnosti:
 
property Body: string; Vlastnost může být použita jedním ze dvou způsobů: Pokud InputFileMode je true, pak vlastnost Body musí být nastavena na cestu a jméno souboru pro uložení získaného dokumentu. Po volání některé metody, která získává dokument z Internetu pomocí HTTP, soubor specifikovaný touto vlastností bude obsahovat tělo získaného dokumentu. Tato metoda je užitečná, když získáváme binární dokumenty, jako soubory WAV, soubory obrázků a pod. 
Jestliže InputFileMode je false, pak Body bude obsahovat tělo dokumentu získaného některou z metod, které získávají dokumenty pomocí HTTP. Tato možnost je užitečná, když získáváme HTML nebo jiné textové dokumenty z Internetu pro rozkládání.
Published Runtime, designtime
property CookieIn: string; Vlastnost obsahuje Cookie zaslaný ze vzdáleného hostitele, pokud byl zaslán. Vlastnost je nastavována pouze po získání dokumentu ze sítě. Runtime, Read-Only
property Header: string; Vlastnost může být podobně jako Body používána dvojím způsobem. Místo těla dokumentu, ale pojednává o hlavičce dokumentu. Published Runtime, designtime
property HeaderInfo: THeaderInfo; Vlastnost specifikuje hlavičkové informace, které jsou zaslány na HTTP server, když děláme požadavek pro dokument. Hlavička zasílaná na vzdáleného hostitele, když je požadován dokument pomocí HTTP může být modifikována před odesláním vložením dalších položek modifikací vlastnosti SendHeader v obsluze OnAboutToSend Published Runtime, Designtime
property InputFileMode: boolean; Vlastnost určuje, jak budou zpracovány přicházející dokumenty a jejich hlavičky. Viz vlastnosti Body a Header.
property OutputFileMode: boolean; Vlastnost specifikuje jak budou zpracovány odcházející data použitá metodami Post, Put a Trace. Při nastavení na true, data pro tyto metody budou získány z lokálních souborů. Při nastavení na false, data pro tyto metody jsou předána jako parametr.
property SendHeader: TExStringList; Vlastnost obsahuje hlavičkové informace zasílané na vzdáleného hostitele, když požadujeme dokument pomocí HTTP. Vlastnost může být modifikována v OnAboutToSend přidáním hlavičkových informací uživatele. Public Runtime only

Komponenta má následující metody:

procedure Delete(URL: string); virtual;
Metoda zruší parametrem specifikovaný dokument. Parametr musí být úplně kvalifikované URL, včetně části http://, aby tato metoda pracovala správně. Musíme mít přístup k modifikaci (zápisu) souborů na místě, kde soubor chceme zrušit. Pokud metoda je úspěšná, pak je generována událost OnSuccess s parametrem Cmd s hodnotou CmdDELETE. Když metoda je neúspěšná, pak je generovaná událost OnFailure s hodnotou parametru CmdDELETE. Vlastnost Body bude obsahovat chybný příkaz (když dokument nebyl zrušen) nebo potvrzení (když soubor byl zrušen).

procedure Get(URL: string); virtual;
Metoda získá dokument specifikovaný parametrem. Pokud InputFileMode je true, pak dokument získávaný metodou Get je uložen do souboru, který je specifikován vlastností Body a hlavička je uložena do souboru specifikovaného vlastností Header. Pokud InputFileMode je false, pak dokument získaný metodou Get je uložen ve vlastnosti Body jako řetězec a jeho hlavička je uložena do vlastnosti Header jako řetězec. Pokud metoda je úspěšná, pak je generována událost OnSuccess s parametrem Cmd s hodnotou CmdGET. Když metoda je neúspěšná, pak je generovaná událost OnFailure s hodnotou parametru CmdGET.

procedure Head(URL: string); virtual;
Metoda získává hlavičku dokumentu specifikovaného parametrem URL. Pokud InputFileMode je true, pak získaná hlavička je uložena do souboru specifikovaného vlastností Header, když je false, pak hlavička je uložena do vlastnosti Header jako řetězec. Pokud metoda je úspěšná, pak je generována událost OnSuccess s parametrem Cmd s hodnotou CmdHEAD. Když metoda je neúspěšná, pak je generovaná událost OnFailure s hodnotou parametru CmdHEAD.

procedure Options(URL: string); virtual;
Metoda vrací příkazy podporované serverem HTTP a dotazovaným dokumentem. Parametr URL specifikuje místo k získání voleb. Podporované příkazy jsou specifikovány ve vlastnosti Header. Prvek hlavičky Public specifikuje příkazy podporované serverem HTTP. Prvek hlavičky Allow specifikuje příkazy podporované dokumentem specifikovaným parametrem URL. Pokud metoda je úspěšná, pak je generována událost OnSuccess s parametrem Cmd s hodnotou CmdOPTIONS. Když metoda je neúspěšná, pak je generovaná událost OnFailure s hodnotou parametru CmdOPTIONS.

procedure Post(URL, PostData: string); virtual;
Metoda odesílá informace specifikované parametrem PostData na dokument specifikovaný parametrem URL. Pokud vlastnost OutputFileMode je true, pak parametr PostData specifikuje cestu a jméno souboru, který obsahuje odesílaná data. Jestliže OutputFileMode je false, pak parametr PostData musí obsahovat odesílaná data. Pokud metoda je úspěšná, pak je generována událost OnSuccess s parametrem Cmd s hodnotou CmdPOST. Když metoda je neúspěšná, pak je generovaná událost OnFailure s hodnotou parametru CmdPOST.

procedure Put(URL, PutData: string); virtual;
Metoda je používána k vytvoření dokumentu na HTTP serveru. Parametr URL specifikuje vytvářený dokument na vzdáleném HTTP serveru. Pokud vlastnost OutputFileMode je true, pak parametr PutData specifikuje cestu a jméno souboru, který obsahuje data vytvářeného dokumentu. Jestliže OutputFileMode je false, pak parametr PutData musí obsahovat data vytvářeného dokumentu. Aby metoda mohla správně pracovat musíme mít zápisová práva na hostiteli, kde dokument vytváříme. Pokud metoda je úspěšná, pak je generována událost OnSuccess s parametrem Cmd s hodnotou CmdPUT. Když metoda je neúspěšná, pak je generovaná událost OnFailure s hodnotou parametru CmdPUT.

procedure Trace(URL, TraceData: string); virtual;
Metoda vrací hlavičku požadavku zaslanou klientem jako tělo dokumentu mimo návratu dat zaslaných v parametru TraceData. Metoda se často používá při ladění a hledání problémů s hostitelem HTTP. Parametr URL specifikuje dokument, který byl požadován. Pokud vlastnost OutputFileMode je true, pak parametr TraceData specifikuje cestu a jméno souboru k použití jako odeslaných dat. Jestliže OutputFileMode je false, pak parametr TraceData musí obsahovat data odeslaná na vzdáleného hostitele jako řetězec. Pokud metoda je úspěšná, pak je generována událost OnSuccess s parametrem Cmd s hodnotou CmdTRACE. Když metoda je neúspěšná, pak je generovaná událost OnFailure s hodnotou parametru CmdTRACE.

Komponenta má následující události:

property OnAboutToSend: TNotifyEvent;
Událost vzniká před odesláním požadavku na vzdáleného hostitele. Umožňuje modifikovat hlavičku požadavku obsaženou ve vlatnosti SendHeader vložením položek hlaviček uživatele. Událost je generována libovolnou metodou získávající nebo zasílající data na vzdáleného hostitele.

property OnAuthenticationNeeded: TNotifyEvent;
Událost vzniká, když přístup k dokumentu vyžaduje autentizaci. Je nutno nastavit vlastnosti Password a UserID vlastnosti HeaderInfo.

property OnFailure: TResultEvent;
Událost nastává, když operace je neúspěšná. Parametr Cmd specifikuje chybující příkaz. Možné hodnoty jsou: CmdGET, CmdOPTIONS, CmdHEAD, CmdPOST, CmdPUT a CmdDELETE.

property OnRedirect: THandlerEvent;
Událost nastává, když dokument přesměruje klienta na jiný dokument a to na stejném nebo jiném hostiteli. Pokud parametr Handled je nastaven na true, pak komponenta neprovede automaticky přesměrování. Je-li parametr nastaven na false (implicitně), pak přesměrovaný dokument je získáván.

property OnSuccess: TResultEvent;
Událost nastává, když operace je dokončena úspěšně.  Parametr Cmd specifikuje dokončený příkaz. Možné hodnoty jsou: CmdGET, CmdOPTIONS, CmdHEAD, CmdPOST, CmdPUT a CmdDELETE.


Jednotka NMMSG

Tato jednotka obsahuje komponentu TNMMsg pro zasílání jednoduchých zpráv po Internetu nebo Intranetu a komponentu TNMMsgServ, která je používána pro příjem zpráv odeslaných komponentou TNMMsg. Obě komponenty jsou odvozeny od TPowersock (a TNMMsgServ od TNMGeneralServer).
Hlavním významem komponent v této jednotce je poskytnutí příkladu, který můžeme použít jako základní třídy pro řešení problémů se zákaznickými protokoly Internetu.
Je zde také definován typ TMSGEvent.

Typ TMSGEvent

type TMSGEvent = procedure(Sender: TComponent; const sFrom, sMsg: string) of object;
Typ je použit pro událost OnMSG. Parametr sFrom specifikuje od koho zpráva pochází a parametr sMsg je zpráva samotná.

Komponenta TNMMsg

Komponenta je používána pro zasílání jednoduchých textových zpráv v Internetu nebo Intranetu pomocí protokolu TCP/IP. Hostitel, kterému zpráva bude zaslána musí být běžící server vytvořený z komponenty TNMGeneralServer.
K poskytnutí obousměrné komunikace musíme TNMMsg párovat s komponentou TNMMsgServ. Použití těchto komponent vyžaduje WSOCK32.DLL.
Dříve než můžeme odeslat zprávu, musíme nejprve nastavit vlastnost Host na vzdáleného hostitele, kterému budeme zasílat zprávu. Musíme také nastavit vlastnost Port na hodnotu odpovídající port vzdáleného hostitele. Nastavením vlastnosti FromName zajistíme, že příjemce zprávy se dozví od koho zpráva pochází. Po nastavení těchto vlastností, můžeme zaslat zprávu voláním metody PostIt.
Komponenta má vlastnost
 
property FromName: string; Vlastnost oznamuje příjemci od koho zpráva pochází. Published DesignTime, RunTime

metodu

function PostIt(const sMsg: string): string;
Metoda zasílá zprávu specifikovanou parametrem na vzdáleného hostitele. Od serveru je vráceno OK, pokud odeslání je úspěšné. Pokud zpráva je odeslána úspěšně, pak vzniká událost OnMesageSent.
Vzdálený hostitel musí akceptovat připojení, přijmout zprávu a vrátit OK aby klient se mohl odpojit.

a událost

property OnMessageSent: TNotifyEvent;
Událost vzniká při úspěšném odeslání zprávy na vzdáleného hostitele.

Komponenta TNMMsgServ

Komponenta je používána pro příjem zpráv od komponenty TNMMsg. Místo používání komponent TNMMsg a TNMMsgServ se můžeme pokusit o vytvoření svého vlastního zákaznického protokolu k řešení našeho problému. Pro použití komponenty musíme používat WSOCK32.DLL.
Při vývoji naší aplikace nastavíme vlastnost Port na port, kde náš server bude naslouchat (pokud se liší od implicitního). Pro příjem a zpracování zprávy, zapíšeme obsluhu události OnMSG.

Jednotka NMNNTP

Jednotka obsahuje komponentu TNMNNTP a svázanou třídu a typy. Třída je TPostRecordType a typy:

Typ TCacheMode

TCacheMode = (cmMixed, cmRemote, cmLocal);
Typ je použit k určení stylu článku, který bude použit.

Typ TGroupRetrievedCacheEvent

TGroupRetrievedCacheEvent = procedure(var Handled: boolean; name: string;
       FirstArticle, LastArticle: integer; Posting: boolean) of object;
Typ je určen pro použití událostí OnGrouplistCacheUpdate. Parametr Handled specifikuje zda implicitní odkládací akce komponenty má být provedena. Parametr name specifikuje jméno diskusní skupiny. Parametr FirstArticle specifikuje číslo prvního článku v diskusní skupině. Není to vždy 1. Parametr LastArticle specifikuje číslo posledního článku v diskusní skupině. Parametr Posting určuje zda odeslaný článek je poskytnut této diskusní skupině.

Typ TGroupRetrievedEvent

TGroupRetrievedEvent = procedure(name: string; FirstArticle,
      LastArticle: integer; Posting: boolean) of object;
Typ je používán událostí OnGrouplistUpdate. Parametr name specifikuje jméno diskusní skupiny. Parametr FirstArticle specifikuje číslo prvního článku v diskusní skupině. Není to vždy 1. Parametr LastArticle specifikuje číslo posledního článku v diskusní skupině. Parametr Posting určuje zda odeslaný článek je poskytnut této diskusní skupině.

Typ THeaderCacheEvent

THeaderCacheEvent = procedure(var Handled: boolean; IdNo: integer;
   From, Subject, MsgId, Date: string; ArticleNo: integer) of object;
Typ je použit událostí OnHeaderCacheUpdate. Parametr Handled specifikuje zda implicitní odkládací akce komponenty má být provedena. Parametr IdNo specifikuje identifikační číslo článku získané hlavičkou. Parametr From specifikuje osobu, která odeslala článek na hostitele news. Parametr Subject specifikuje řádek subjektu článku. Parametr MsgId specifikuje identifikaci článku. Parametr Date určuje datum odeslání článku novému hostiteli.  Parametr ArticleNo specifikuje číslo článku.

Třída TPostRecordType

Typ je používán pro ukládání hlavičkových informací NNTP. Není nutný pro odeslání zpráv, ale pro přijímání zpráv.
Třída má následující vlastnosti:
 
property PrAppName: string; Vlastnost specifikuje jméno aplikace, která odeslala článek. Published Runtime, designtime
property PrArticleId: integer; Vlastnost obsahuje identifikační číslo aktuálního článku. Published Runtime, read-only
property PrDistribution: string; Vlastnost je používána ke změně distribučního rozsahu článku. Je to čárkami oddělený seznam podobající se řádku "Newsgroup". Předplatitelé jsou stále řízeny "Newsgroups", ale článek je také zaslán na všechny systémy určené řádkem "Distribution".  Published Runtime, designtime
property PrFromAddress: string; Vlastnost specifikuje e-mail adresu osoby, která odeslala současný nový článek. Published Runtime, designtime
property PrNewsGroups: string; Vlastnost specifikuje diskusní skupinu, které je současný článek odeslán. Published Runtime, designtime
property PrReplyTo: string; Vlastnost obsahuje e-mail adresu, která může být použita k odpovědi osobě, která odeslala současný článek. Published Runtime, designtime
property PrSubject: string; Vlastnost obsahuje řádek subject ze článku. Published Runtime, designtime
property PrTimeDate: string; Vlastnost obsahuje datum a čas odeslání článku. Published Runtime, designtime

Komponenta TNMNNTP

Komponenta TNMNNTP je používána pro čtení a odesílání internetovských zpráv na serverech news pomocí Network News Transfer Protocol (RFC 977). Použití komponenty požaduje WSOCK32.DLL.
Dříve než můžeme provádět klíčové funkce komponenty TNMNNTP, musíme se nejprve připojit na server news. To provedeme nastavením vlastnosti Host na přípustný server news a voláme metodu Connect.
Seznam diskusních skupin na daném serveru můžeme získat voláním metody GetGroupList. K výběru diskusní skupiny pro čtení článku voláme metodu SetGroup a jako parametr předáme jméno požadované diskusní skupiny. Po nastavení diskusní skupiny můžeme získat článek voláním GetArticle. Článek pak můžeme nalézt ve vlastnostech Body a Header. Odeslání článku provedeme voláním metody PostArticle po naplnění vlastností PostBody (tělo zprávy) a PostHeader (hlavička zprávy).
Komponenta má následující vlastnosti:
 
property AttachFilePath: string; Vlastnost specifikuje umístění pro uložení souborů připojených k článku, které jsou uvedeny ve vlastnosti Attachments. Implicitní hodnota této vlastnosti je prázdná; soubory jsou ukládány do adresáře aplikace. Soubory jsou ukládány pouze, pokud vlastnost ParseAttachments je true. Published Runtime, designtime
property Attachments: TStringList; Vlastnost je seznam souborů připojených k současnému článku, který byl získán ze vzdáleného hostitele. Tyto soubory jsou pouze dekódovány a uloženy na disk do adresáře specifikovaného vlastností AttachFilePath, pokud vlastnost ParseAttachment je true. Vlastnost je nastavena po volání metody GetArticle. Public Runtime, Read-Only
property Body: TExStringList; Vlastnost obsahuje tělo současného článku získaného ze vzdáleného hostitele. Vlastnost je nastavena po volání metody GetArticle nebo GetArticleBody. Pokud je volána metoda GetArticleBody, pak když vlastnost ParseAttachment je nastavena na true, libovolné soubory připojené k článku nejsou rozloženy a jsou vráceny v těle článku. Public Runtime, Read-only
property CacheMode: TCacheMode; Vlastnost specifikuje typ použitého odkládání článku. Možné hodnoty jsou definované typem TCacheMode: cmMixed - Když články, seznamy skupin, hlavičky nebo seznamy hlaviček jsou požadovány, pak jsou zavedeny ze vzdáleného hostitele. V tomto režimu jsou také uloženy na disk. cmLocal - Když články, seznamy skupin, hlavičky nebo seznamy hlaviček jsou požadovány, pak jsou zavedeny z lokálního disku. Jestliže na disku neexistují, pak vzniká událost OnInvalilidArticle, stejně jako když článek neexistuje na vzdáleném hostiteli. cmRemote - Když články, seznamy skupin, hlavičky nebo seznamy hlaviček jsou požadovány, pak jsou zavedeny ze vzdáleného hostitele a nejsou ukládány na disk. Implicitně: cmMised
property CurrentArticle: integer; Vlastnost specifikuje poslední článek, který byl zaveden z hostitele. Je to obvykle číslo článku, který je obsažen ve vlastnostech Body a Header. Tato vlastnost se mění po úspěšném volání metod: GetArticle, GetArticleBody a GetArticleHeader. Public Runtime, Read-Only
property GroupList: TStringList; Vlastnost obsahuje seznam diskusních skupin na současném hostiteli. Vlastnost je nastavena po volání metody GetGroupList. Public Runtime, Read-Only
property Header: TExStringList; Vlastnost obsahuje hlavičku současného článku získaného z hostitele. Vlastnost je nastavena po úspěšném volání GetArticle, GetArticleHeader nebo GetArticleList. Public Runtime, Read-Only
property HeaderRecord: TPostRecordType; Vlastnost obsahuje informace obsažené v hlavičce článku. Public Runtime Only
property HiMessage: integer; Vlastnost specifikuje index nejaktuálnější zprávy (číslo), která je dostupná v současné diskusní skupině.  Public Run-time, Read-only
property LoMessage: integer; Vlastnost specifikuje index nejméně aktuální zprávy (číslo), která je dostupná v současné diskusní skupině.  Public Run-time, Read-only
property NewsDir: string; Vlastnost specifikuje jméno adresáře do kterého odkládáme ukládané články a hlavičky. V současné verzi FastNet, odkládací služby TNMNNTP jsou zakázány.
property ParseAttachments: boolean; Vlastnost určuje zda soubory připojené ke zprávám budou dekódovány a uloženy na disk nebo ne. Při hodnotě true, soubory jsou odděleny od těla zprávy, dekódovány a uloženy na disk. Při hodnotě false zůstávají v těle zprávy. Published Runtime, Designtime
property Password: string; Vlastnost je používána, když při přihlašování na vzdáleného hostitele je vyžadována autentizace. Vlastnost UserID musí být nastavena na odpovídajícího uživatele. Při chybném heslu vzniká událost OnAuthenticationFailed. Pokud není zadána identifikace uživatele nebo heslo a autentizace je vyžadována, pak vzniká událost OnAuthenticationNeeded. Published Runtime, Designtime
property PostAttachments: TStringList; Vlastnost je používána pro uložení jmen souborů, které jsou připojeny k odcházející zprávě. Je nutno vkládat vždy pouze jedno jméno souboru na řádek. Published Runtime, Designtime
property PostBody: TExStringList; Vlastnost  specifikuje tělo článku k odeslání. Published Runtime, Designtime
property PostHeader: TExStringList; Vlastnost specifikuje hlavičku pro odesílaný článek na vzdáleného hostitele NNTP. Zákaznické položky hlavičky mohou být přidávány k odcházející hlavičce zprávy zpřístupněním vlastnosti Values PostHeader. Published Runtime, Designtime
property Posting: boolean; Vlastnost specifikuje zda článek může být odeslán v současné diskusní skupině. Public Runtime, Read-Only
property PostRecord: TPostRecordType; Vlastnost specifikuje nejobecnější položky hlavičky použité při odeslání článku na hostitele NNTP. Published Runtime, Designtime
property SelectedGroup: string; Vlastnost specifikuje jméno současné diskusní skupiny. Vlastnost se mění voláním metody SetGroup. Public Runtime, Read-Only
property UserId: string; Vlastnost specifikuje identifikaci uživatele, pokud je požadována autentizace při přihlašování na vzdáleného hostitele. Vlastnost Password musí být nastavena na heslo odpovídajícího uživatele. Při chybném heslu vzniká událost OnAuthenticationFailed. Pokud není zadána identifikace uživatele nebo heslo a autentizace je vyžadována, pak vyniká událost OnAuthenticationNeeded. Published Runtime, Designtime

Komponenta má následující metody:

procedure GetArticle(Ref: integer);
Metoda získává specifiovaný článek ze vzdáleného hostitele NNTP. Parametr specifikuje index získávaného článku od hostitele NNTP. Pokud parametr není přípustným číslem článku, pak vzniká událost OnInvalidArticle. Po úspěšném získání článku vzniká OnArticle. Pokud je povoleno odkládání zpráv, pak vzniká OnArticleCacheUpdate. Po úspěšném volání této metody jsou aktualizovány vlastnosti Header, Body a HeaderRecord. Pokud jsou připojeny nějaké soubory, pak jsou uvedeny ve vlastnosti Attachments.

procedure GetArticleBody(Ref: integer);
Metoda získává tělo specifikovaného článku. Parametr specifikuje index článku ze kterého získáváme tělo. Po získání těla ze vzdáleného hostitele NNTP vzniká událost OnBody. Ne všechny servery podporují tuto metodu.

procedure GetArticleHeader(Ref: integer);
Metoda získává hlavičku specifikovaného článku. Parametr specifikuje index článku ze kterého získáváme hlavičku. Po získání hlavičky ze vzdáleného hostitele NNTP vzniká událost OnHeader.

procedure GetArticleList(All: boolean; ArticleNumber: integer);
Metoda získává seznam článků v současné diskusní skupině. Parametr All specifikuje zda chceme získat seznam všech články v diskusní skupině (true) nebo pouze částečný seznam. Parametr ArticleNumber specifikuje počet článků obsažených v seznamu. Pro každý článek v seznamu vzniká událost OnHeaderList.

procedure GetGroupList;
Metoda získává seznam dostupných diskusních skupin ze vzdáleného hostitele. Pro každý prvek seznamu vzniká událost OnGroupListUpdate.

procedure PostArticle;
Metoda odesílá článek v současně vybrané diskusní skupině. Odeslaný článek je definován vlastnostmi PostRecord, PostBody, PostHeader a PostAttachments. Pokud zpráva je odeslána úspěšně, pak vzniká událost OnPosted. Jestliže odeslání je neúspěšné, pak vzniká OnPostFailed.

procedure SetGroup(Group: string);
Metoda nastavuje současnou aktivní diskusní skupinu na parametrem specifikovanou skupinu. Pokud skupina existuje, pak je vzniká událost OnGroupSelect. Při úspěšném volání metody se změní vlastnost SelectedGroup.

Komponenta má také několik událostí:

property OnAbort: TNotifyEvent;
Událost nastává, když je volána metoda Abort.

property OnArticle: TNotifyEvent;
Událost nastává, když je úspěšně volána metoda GetArticle. Přijatý článek může být zpřístupněn vlastnostmi Body, Header a Attachment.

property OnArticleCacheUpdate: THeaderCacheEvent;
Událost nastává, když článek je získán ze vzdáleného hostitele a odkládání je povoleno. Odkládání není dostupné, pokud vlastnost CacheMode není nastavena správně.

property OnAuthenticationFailed: TNotifyEvent;
Událost nastává, když identifikace uživatele nebo heslo jsou chybné.

property OnAuthenticationNeeded: THandlerEvent;
Událost nastává, když není zadána identifikace uživatele a heslo a vzdálený hostitel vyžaduje autentizaci při přihlašování.

property OnBody: TNotifyEvent;
Událost nastává, když metoda GetArticleBody je provedena úspěšně.

property OnBodyCacheUpdate: THandlerEvent;
Událost nastává, když metoda GetArticleBody je provedena úspěšně a odkládání je povoleno. Záleží zde na vlastnosti CacheMode.

property OnGroupListCacheUpdate: TGroupRetrievedCacheEvent;
Událost nastává, když metoda GetGroupList je provedena úspěšně a odkládání je povoleno. Tato událost je generována pro každou skupinu v seznamu. Záleží zde na vlastnosti CacheMode.

property OnGroupListUpdate: TGroupRetrievedEvent;
Událost nastává, když metoda GetGroupList je provedena úspěšně. Je generována pro každou skupinu v seznamu.

property OnGroupSelect: TNotifyEvent;
Událost nastává, když metoda SetGroup je provedena úspěšně.

property OnGroupSelectRequired: THandlerEvent;
Událost nastává, když je volána metoda, která vyžaduje výběr skupiny. Metody GetArticle, GetArticleBody, GetArticleHeader, GetArticleList a PostArticle vyžadují výběr diskusní skupiny metodou SetGroup dříve než mohou být použity.

property OnHeader: TNotifyEvent;
Událost nastává, když hlavička článku je získána metodou GetArticleHeader.

property OnHeaderCacheUpdate: THeaderCacheEvent;
Událost nastává, když hlavička článku je získána metodou GetArticleHeader a odkládání je povoleno. Odkládání závisí na vlastnosti CacheMode.

property OnHeaderList: TNotifyEvent;
Událost je volána pro každý článek v seznamu, když metoda GetArticleList je úspěšně provedena. V této události musí být čteny události Header a HeaderRecord, protože se při každém generování události mění.

property OnHeaderListCacheUpdate: THandlerEvent;
Událost je volána pro každý článek v seznamu, když metoda GetArticleList je úspěšně provedena a odkládání je povoleno.

property OnInvalidArticle: TNotifyEvent;
Událost nastává, když identifikační číslo článku předané metodám GetArticle, GetArticleBody nebo GetArticleHeader neexistuje nebo je chybné.

property OnPosted: TNotifyEvent;
Událost nastane, když metoda PostArticle úspěšně odešle článek na vzdáleného hostitele. Při neúspěchu vzniká OnPostFailed.

property OnPostFailed: TOnErrorEvent;
Událost nastane, když metoda PostArticle neúspěšně odešle článek na vzdáleného hostitele. Při úspěchu vzniká OnPosted.


Komponenta TNMTime

Komponenta je používána pro získávání času z Internetovského serveru time, jak je popsáno v RFC 868. Komponenta vyžaduje WSOCK32.DLL. Dříve než můžeme získat čas z Internetovského serveru time, musíme znát jméno hostitele nebo tečkovou IP adresu hostitele time a přiřadit tuto hodnotu vlastnosti Host. Normálně vlastnost Port nemusíme modifikovat, pokud hostitel nenaslouchá na nestandardním portu. Po nastavení hostitele čteme pouze hodnotu vlastnosti TimeStr, a tím získáme čas ze specifikovaného hostitele.
Komponenta má tyto vlastnosti:
 
property TimeInt: longint; Vlastnost vrací počet sekund od půlnoci 1. 1. 1900. Dříve než tuto vlastnost můžeme číst, musí být nastavena vlastnost Host na přípustný server time. Public Runtime, Readonly
property TimeStr: string; Vlastnost vrací čas ze vzdáleného hostitele jako řetězec. Dříve než tuto vlastnost můžeme číst, musí být nastavena vlastnost Host na přípustný server time. Public Runtime, Readonly

  1. Použití komponenty TNMHTTP si ukážeme ná příkladě. Začneme vývoj nové aplikace. Na formulář umístíme tyto komponenty: 4x TMemo, TEdit, TOpenDialog, TNMHTTP a 7x TButton. Význam komponent je tento:
  2. Obsluhy stisku tlačítek vypadají takto:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      NMHTTP1->Get(Edit1->Text);
    }
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      NMHTTP1->Head(Edit1->Text);
    }
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
      NMHTTP1->Options(Edit1->Text);
    }
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
      AnsiString S;
      if(InputQuery("Trace Data Required","Input data to send as trace",S))
        NMHTTP1->Trace(Edit1->Text, S);
    }
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
      if (OpenDialog1->Execute())
        {
          NMHTTP1->OutputFileMode = TRUE;
          NMHTTP1->Put(Edit1->Text, OpenDialog1->FileName);
          NMHTTP1->OutputFileMode = FALSE;
        }
    }
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
      AnsiString S;
      if (InputQuery("Post Data Required", "Input data to Post", S))
        NMHTTP1->Post(Edit1->Text, S);
    }
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
      NMHTTP1->Delete(Edit1->Text);
    }
    Je zapotřebí vytvořit ještě několik obsluhu událostí komponenty TNMHTTP. Obsluha OnAuthenticationNeeded vypadá takto:
    void __fastcall TForm1::NMHTTP1AuthenticationNeeded(TObject *Sender)
    {
      AnsiString AnID, APass;
      InputQuery("Authentication required", "Enter a user ID", AnID);
      InputQuery("Authentication required", "Enter a password", APass);
      NMHTTP1->HeaderInfo->UserId = AnID;
      NMHTTP1->HeaderInfo->Password = APass;
      ShowMessage("Authentication information in place, please retry the previous command");
    }
    Událost vzniká, když dokument specifikovaný adresou v Edit1 vyžaduje autentizaci. Obsluha OnFailure vypadá takto:
    void __fastcall TForm1::NMHTTP1Failure(CmdType Cmd)
    {
      Memo1->Text = NMHTTP1->Header;
      Memo2->Text = NMHTTP1->Body;
      switch(Cmd)
        {
          case CmdGET: Memo3->Lines->Add("HTTP GET Failed");
          case CmdPOST: Memo3->Lines->Add("HTTP Post Failed");
          case CmdHEAD: Memo3->Lines->Add("HTTP HEAD Failed");
          case CmdOPTIONS: Memo3->Lines->Add("HTTP OPTIONS Failed");
          case CmdTRACE: Memo3->Lines->Add("HTTP TRACE Failed");
          case CmdPUT: Memo3->Lines->Add("HTTP PUT Failed");
          case CmdDELETE: Memo3->Lines->Add("HTTP Delete Failed");
        }
    }
    Obsluhu OnRedirect tvoří příkaz:
    void __fastcall TForm1::NMHTTP1Redirect(bool &Handled)
    {
      if (MessageDlg("This site is redirecting you to another site. Allow redirect?",
          mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0) == mrNo)
        Handled = TRUE;
    }
    Poslední obsluha (OnSuccess) vypadá takto:
    void __fastcall TForm1::NMHTTP1Success(CmdType Cmd)
    {
      if (NMHTTP1->CookieIn != "")
        Memo4->Text = NMHTTP1->CookieIn;
      Memo1->Text = NMHTTP1->Header;
      Memo2->Text = NMHTTP1->Body;
      switch(Cmd)
        {
          case CmdGET: Memo3->Lines->Add("HTTP GET Successful");
          case CmdPOST: Memo3->Lines->Add("HTTP POST Successful");
          case CmdHEAD: Memo3->Lines->Add("HTTP HEAD Successful");
          case CmdOPTIONS: Memo3->Lines->Add("HTTP OPTIONS Successful");
          case CmdTRACE: Memo3->Lines->Add("HTTP TRACE Successful");
          case CmdPUT: Memo3->Lines->Add("HTTP PUT Successful");
          case CmdDELETE: Memo3->Lines->Add("HTTP DELETE Successful");
        }
    }
    Tím je aplikace hotova. Pokuste se pochopit jak TNMHTTP pracuje.
  3. Podívejme se ještě na jeden příklad použití TNMHTTP. Začneme vývoj nové aplikace a na formulář vložíme 7x TEdit, 3x TMemo, TButton a TNMHTTP. Význam komponent je tento:
  4. Obsluhu stisku tlačítka tvoří:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      NMHTTP1->HeaderInfo->LocalMailAddress = Edit3->Text;
      NMHTTP1->HeaderInfo->LocalProgram = Edit4->Text;
      NMHTTP1->HeaderInfo->Cookie = Edit2->Text;
      NMHTTP1->HeaderInfo->Referer = Edit7->Text;
      NMHTTP1->HeaderInfo->UserId = Edit5->Text;
      NMHTTP1->HeaderInfo->Password = Edit6->Text;
      NMHTTP1->InputFileMode = TRUE;
      NMHTTP1->Header = ".\head.txt";
      NMHTTP1->Body = ".\Body.txt";
      NMHTTP1->Get(Edit1->Text);
    }
    Při stisku tlačítka jsou naplněny vlastnosti HeaderInfo z editačních ovladačů. Vlastnost InputFileMode je nastavena na true a tak získaný dokument bude uložen v souborech. Vlastnost Header je nastavena na soubor head.txt v aktuálním adresáři a vlastnost Body na soubor body.txt. Dokument specifikovaný v Edit1 je získán metodou Get.
    Obsluhu události OnAboutToSend komponenty TNMHTTP vypadá takto:
    void __fastcall TForm1::NMHTTP1AboutToSend(TObject *Sender)
    {
      NMHTTP1->SendHeader->Values["If-Modified-Since"] =
         "Wed, 09 Sep 1998 10:49:15 GMT";
      Memo3->Text = NMHTTP1->SendHeader->Text;
    }
    Obsluha k odcházející hlavičce přidá prvek If-Modified-Since. Zbývá ještě obsluha události OnSuccess:
    void __fastcall TForm1::NMHTTP1Success(CmdType Cmd)
    {
      if (Cmd == CmdGET)
        {
          Memo1->Lines->LoadFromFile(".\head.txt");
          Memo2->Lines->LoadFromFile(".\Body.txt");
        }
    }
    Aplikaci si prostupujte.
  5. Již hotovou aplikaci používající komponentu TNMHTTP nalezneme v adresáři Program Files\Borland\CBuilder\Examples\Interner\Http. Prohlédněte si tuto aplikaci a snažte se pochopit, jak pracuje.
  6. Použití komponet TNMMsg a TNMMsgServ si ukážeme na příkladě. Začneme vývoj nové aplikace a na formulář umístíme komponenty: 2x TEdit, 2x TMemo, TNMMsg a TNMMsgServ. Nastavíme vlastnost Host komponenty TNMMsg na 127.0.0.1. Je to IP adresa pro lokálního hostitele. Pokud budeme chtít později otestovat tuto aplikaci mezi počítači, pak nastavíme vlastnost Host na IP adresu počítače se kterým chceme komunikovat. Obsluha události OnKeyPress prvního editačního ovladače je tvořena:

  7. void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
    {
      if (Key == 0x0D)
        {
          NMMsg1->FromName = Edit2->Text;
          NMMsg1->PostIt(Edit1->Text);
        }
    }
    Když stiskneme klávesu Enter, pak vlastnost FromName TNMMsg nastavíme na hodnotu druhého editačního ovladače a zpráva zadaná do prvního editačního ovladače je odeslána na vzdáleného hostitele pomocí metody PostIt.
    Komponenta TNMMsg má ještě obsluhu události OnMessageSent:
    void __fastcall TForm1::NMMsg1MessageSent(TObject *Sender)
    {
      Memo2->Lines->Add("Message Sent");
    }
    Komponenta TNMMsgServ má pouze obsluhu OnMSG. Když je přijata zpráva, pak je přidána do Memo1 a do Memo2 je přidána informace od koho zpráva pochází.
    void __fastcall TForm1::NMMSGServ1MSG(TComponent *Sender,
          const AnsiString sFrom, const AnsiString sMsg)
    {
      Memo2->Lines->Add("Incoming message from "+sFrom);
      Memo1->Lines->Add("["+sFrom+"] "+sMsg);
    }
    Po spuštění aplikace, zapíšeme svoje jméno do Edit2. Naši zprávu zapíšeme do Edit1 a stiskneme Enter. Zpráva bude zobrazena v Memo1.
  8. Již hotovou aplikaci používající tyto komponenty nalezneme v adresáři Program Files\Borland\CBuilder\Examples\Interner\MsgDemo. Prohlédněte si tuto aplikaci a snažte se pochopit, jak pracuje.
  9. S komponentou TNMNNTP se seznámíme v této aplikaci. Začneme vývoj nové aplikace a na formulář umístíme tyto komponenty. 5x TEdit, 3x TButton, 2x TListBox, TMemo, TOpenDialog, TStatusBar a TNMNNTP. Význam komponent je tento:
  10. Obsluha stisku prvního tlačítka je tvořena příkazy:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      if (NMNNTP1->Connected)
        NMNNTP12->Disconnect()
      else
        {
          if (Edit1->Text != "")
            {
              NMNNTP1->UserID = Edit1->Text;
              NMNNTP1->Password = Edit2->Text;
            }
          NMNNTP1->Host = Edit3->Text;
          NMNNTP1->Connect();
        }
    }
    Obsluhu OnConnect komponenty TNMNNTP tvoří:
    void __fastcall TForm1::NMNNTP1Connect(TObject *Sender)
    {
      StatusBar1->SimpleText = "Connected";
      NMNNTP1->GetGroupList();
    }
    Po zřízení připojení je o tom informován uživatel na stavovém řádku. Dále je metodou GetGroupList získán seznamu diskusních skupin z hostitele na kterého jsme připojeni. Seznam je vložen do ListBox1.
    Obsluhu OnClick komponenty ListBox1 tvoří příkazy:
    void __fastcall TForm1::ListBox1Click(TObject *Sender)
    {
      if (ListBox1->ItemIndex != -1)
      {
        ListBox2->Clear();
        NMNNTP1->SetGroup(ListBox1->Items[ListBox1->ItemIndex]);
        Caption = "Reading - "+NMNNTP1->SelectedGroup+" Lo: "
          +IntToStr(NMNNTP1->LoMessage)+" Hi: "+IntToStr(NMNNTP1->HiMessage);
      }
    }
    Když myší klikneme v tomto seznamu, pak vybraný prvek seznamu je předán metodě SetGroup k nastavení současné diskusní skupiny na vybranou skupinu. Obsluhu události OnGroupSelect komponenty TNMNNTP tvoří:
    void __fastcall TForm1::NMNNTP1GroupSelect(TObject *Sender)
    {
      Caption = "Posting - "+NMNNTP1->SelectedGroup;
      if (NMNNTP1->Posting)
        Caption = Caption + "(Posting allowed)";
      else
        Caption = Caption + "(Posting prohibited)";
    }
    Když je vybrána nová skupina vzniká událost OnGroupSelect. Titulek aplikace je nastaven na zobrazení vlastnosti SelectedGroup plus informace o možnosti odesílat do současné skupiny. Obsluhu události OnGroupListUpdate stejné komponenty tvoří:
    void __fastcall TForm1::NMNNTP1GroupListUpdate(AnsiString name;
         int FirstArticle, LastArticle; bool Posting)
    {
      ListBox1->Items->Add(name);
    }
    Když je získán seznam diskusních skupin, pak tato událost je volána pro každou skupinu v seznamu. Obsluhu OnDisconnect tvoří:
    void __fastcall TForm1::NMNNTP1Disconnect(TObject *Sender)
    {
      StatusBar1->SimpleText = "Disconnected";
    }
    Obsluhu stisku druhého tlačítka tvoří:
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      if (OpenDialog1->Execute())
        ListBox2->Items->Add(OpenDialog1->FileName);
    }
    Když toto tlačítko stiskneme, pak můžeme v dialogovém okně otevírání souboru vybrat soubor, který je přidán do ListBox2. Obsluhu stisku třetího tlačítka tvoří:
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
      NMNNTP1->PostAttachments->Text = ListBox2->Items->Text;
      NMNNTP1->PostBody->Text = Memo1->Text;
      NMNNTP1->PostRecord->PrFromAddress = Edit4->Text;
      NMNNTP1->PostRecord->PrReplyTo = Edit4->Text;
      NMNNTP1->PostRecord->PrSubject = Edit5->Text;
      NMNNTP1->PostRecord->PrAppName = "Netmasters Example News Posting";
      NMNNTP1->PostRecord->PrNewsGroups = NMNNTP1->SelectedGroup;
      NMNNTP1->PostHeader->Values["Organization"] = "Our Organization";
      NMNNTP1->PostArticle();
    }
    Při stisku třetího tlačítka, vlastnost PostAttachments je nastavena na seznam zobrazený v ListBox2. Vlastnost PostBody je nastavena na text zadaný do Memo1 a je zaplněna vlastnost PostRecord. Vlastnost PostHeader má přidanou hodnotu nazvanou Organization pro specifikaci organizace odesilatele a pro odeslání článku je volána metoda PostArticle. Obsluhy OnPosted a OnPostFailed jsou tvořeny:
    void __fastcall TForm1::NMNNTP1Posted(TObject *Sender)
    {
      StatusBar1->SimpleText = "Article Posted Successfully";
    }
    void __fastcall TForm1.NMNNTP1PostFailed(TComponent *Sender;
           word Errno; AnsiString Errmsg)
    {
      ShowMessage("Posting Failed: "+Errmsg+" Error number "+IntToStr(Errno));
    }
    Komponenta TNMNNTP má ještě několik obsluh událostí:
    void __fastcall TForm1::NMNNTP1GroupSelectRequired(&bool Handled)
    {
      AnsiString S;
      if (InputQuery("Group selection required", "Enter the name of a group:", S))
        {
          NMNNTP1->SetGroup(S);
          Handled = TRUE;
        }
    }
    void __fastcall TForm1.NMNNTP1AuthenticationFailed(Sender: TObject);
    {
      ShowMessage("Authentication failed");
    }
    void __fastcall TForm1::NMNNTP1AuthenticationNeeded(bool &Handled)
    {
      AnsiString AnID, APass;
      if (NMNNTP1->UserID = "")
          if (InputQuery("Authentication Required", "Enter User ID", AnID))
            {
              NMNNTP1->UserId = AnID;
              Handled = TRUE;
            }
      if (NMNNTP1->Password = "")
          if (InputQuery("Authentication Required", "Enter Password", APass))
            {
              NMNNTP1->Password = APass;
              Handled = TRUE;
            }
    }
    Událost OnGroupSelectRequired je volána, když při odesílání článku není vybrána diskusní skupina. Další dvě obsluhy nepotřebují vysvětlení. Aplikaci si prostudujte.
  11. Začneme vývoj nové aplikace. Na formulář umístíme 4x TEdit, 7x Button, 3x TMemo, 2x TListBox, 2x TLabel, TCheckBox, TStatusBar a TNMNNTP. Komponenty mají tento význam:
  12. Do jednotky vložíme hlavičkový soubor filectrl.h. Obsluha stisku prvního tlačítka a několik datších obsluh vypadá takto:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      if (NMNNTP1->Connected)
        NMNNTP1.Disconnect();
      else
        {
          NMNNTP1->Host = Edit1->Text;
          NMNNTP1->Connect();
        }
    }
    void __fastcall TForm1::NMNNTP1Connect(TObject *Sender)
    {
      int I;
      StatusBar1->SimpleText = "Connected";
      NMNNTP1->GetGroupList();
      for (I = 0; I <= (NMNNTP1->GroupList->Count -1); I++)
        ListBox1->Items->Add(NthWord(NMNNTP1->GroupList->Strings[I], ' ', 1));
    }
    void __fastcall TForm1::ListBox1Click(TObject *Sender)
    {
      if (ListBox1->ItemIndex != -1)
      {
        ListBox2->Clear();
        NMNNTP1->SetGroup(ListBox1->Items[ListBox1->ItemIndex]);
        Caption = "Reading - "+NMNNTP1->SelectedGroup+
          " Lo: "+IntToStr(NMNNTP1->LoMessage)+" Hi: "+IntToStr(NMNNTP1->HiMessage);
      }
    }
    void __fastcall TForm1::NMNNTP1Disconnect(TObject *Sender)
    {
      StatusBar1->SimpleText = "Disconnected";
    }
    Tyto obsluhy nepotřebují vysvětlení. Obsluhu události stisku pátého tlačítka tvoří:
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
      NMNNTP1->GetArticleList(true, 0);
    }
    Metoda GetArticleList získává seznam článků současné diskusní skupiny. Jelikož první parametr má hodnotu true jsou získány v seznamu všechny články. Obsluhu události OnHeaderList tvoří (je volána pro každou hlavičku v seznamu):
    void __fastcall TForm1::NMNNTP1HeaderList(TObject *Sender)
    {
      ListBox2->Items->Add("["+IntToStr(NMNNTP1->HeaderRecord->PrArticleId)+"]Subject: "
           +NMNNTP1->HeaderRecord->PrSubject);
    }
    Následujících několik obsluh opět nepotřebuje vysvětlení:
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
      NMNNTP1->Abort();
    }
    void __fastcall TForm1::NMNNTP1Abort(TObject *Sender)
    {
      ShowMessage("Aborted");
    }
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
      AnsiStirng S;
      if (SelectDirectory(S, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 0))
        {
          Label1->Caption = S;
          NMNNTP1->AttachFilePath = S;
        }
    }
    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
    {
      if (CheckBox1->Checked)
        NMNNTP1->ParseAttachments = TRUE;
      else
        NMNNTP1->ParseAttachments = FALSE;
    }
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
      AnsiString S;
      int I;
      if (InputQuery("Retrieve article header", "Which article header to retrieve", S)
        {
          I = StrToIntDef(S, -1);
          if (I != -1)
            NMNNTP1->GetArticleHeader(I);
        }
    }
    void __fastcall TForm1::NMNNTP1Header(TObject *Sender)
    {
      Memo2->Text = NMNNTP1->Header->Text;
      Edit2->Text = NMNNTP1->HeaderRecord->PrFromAddress;
      Edit3->Text = NMNNTP1->HeaderRecord->PrSubject;
      Edit4->Text = NMNNTP1->HeaderRecord->PrTimeDate;
    }
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      AnsiString S;
      int I;
      if (InputQuery("Retrieve article", "Which article to retrieve", S))
        {
          I = StrToIntDef(S, -1);
          if (I != -1)
            NMNNTP1->GetArticle(I);
        }
    }
    void __fastcall TForm1::NMNNTP1InvalidArticle(TObject *Sender)
    {
      ShowMessage("Invalid article number");
    }
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
      AnsiString S;
      int I;
      if (InputQuery("Retrieve article body", "Which article body to retrieve", S))
        {
          I = StrToIntDef(S, -1);
          if (I != -1)
            NMNNTP1->GetArticleBody(I);
        }
    }
    void __fastcall TForm1::NMNNTP1Article(TObject *Sender)
    {
      Memo3->Text = NMNNTP1->Body->Text;
      Memo2->Text = NMNNTP1->Header->Text;
      Memo1->Text = NMNNTP1->Attachments->Text;
      Edit2->Text = NMNNTP1->HeaderRecord->PrFromAddress;
      Edit3->Text = NMNNTP1->HeaderRecord->PrSubject;
      Edit4->Text = NMNNTP1->HeaderRecord->PrTimeDate;
      Label2->Caption = IntToStr(NMNNTP1->CurrentArticle);
    }
    void __fastcall TForm1::NMNNTP1Body(TObject *Sender)
    {
      Memo2->Text = NMNNTP1->Body->Text;
      Memo1->Text = NMNNTP1->Attachments->Text;
    }
    void __fastcall TForm1::NMNNTP1GroupSelectRequired(bool &Handled)
    {
      AnsiString S;
      if (InputQuery("Group selection required", "Newsgroup: ", S))
        {
          NMNNTP1->SetGroup(S);
          Handled = TRUE;
        }
    }
    Aplikace je hotova, pokuste se pochopit jak pracuje.
  13. Již hotovou aplikaci používající komponentu TNMNNTP nalezneme v adresáři Program Files\Borland\CBuilder\Examples\Interner\Nntp. Prohlédněte si tuto aplikaci a snažte se pochopit, jak pracuje.
  14. S použitím komponenty TNMTime se seznáme v další aplikací. Začneme vývoj nové aplikace a na formulář umístíme TNMTime, 2x TEdit a TButton. Obsluhu stisku tlačítka tvoří:

  15. void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      NMTime1->Host = "tmc.edu";
      NMTime1->Timeout = 5000;
      Edit1->Text = NMTime1->TimeStr;
      Edit2->Text = IntToStr(NMTime1->TimeInt);
    }
    Při stisku tlačítka je vlastnost Host nastavena na tmc.edu, což je přípustný server času. Vlastnost Timeout je nastavena na 5 sekend. Editační ovladače zobrazí vlastnosti TimeStr a TimeInt.
  16. Již hotovou aplikaci používající komponentu TNMTime nalezneme v adresáři Program Files\Borland\CBuilder\Examples\Interner\Time. Prohlédněte si tuto aplikaci a snažte se pochopit, jak pracuje.
12. Komponenty NetMasters II