11. Komponenty NetMasters I

Komponenty firmy NetMasters jsou umφst∞ny na strßnce Internet palety komponent. Tyto komponenty je mo╛no rozd∞lit do nßsledujφcφch skupin:

Dal╣φ komponenty NetMasters budou popsßny v nßsledujφcφch kapitolßch.

Jednotka PSock

Jednotka PSock obsahuje komponentu TPowersock, zßkladnφ t°φdu pro FastNet Tools C++ Builderu a komponentu TNMGeneralServer, obecn² Internetovsk² server, kter² m∙╛e b²t pou╛it k odvozovßnφ sv²ch vlastnφch zßkaznick²ch server∙. TakΘ obsahuje n∞kolik funkcφ, kterΘ mohou b²t u╛iteΦnΘ pro v²voj Internetovsk²ch aplikacφ.
V jednotce jsou tyto komponenty: a tyto funkce:

Komponenta TPowersock

Komponenta TPowersock je zßkladnφ t°φda pro v∞t╣inu ostatnφch komponent v FastNet Tools. M∙╛e b²t pou╛ita jako zßklad pro vytvß°enφ ovladaΦ∙ kterΘ pracujφ s jin²mi protokoly nebo pro vytvß°enφ zßkaznick²ch protokol∙.
Komponenta TPowersock slou╛φ jako zßkladnφ t°φda pro TCP komunikace pou╛φvajφcφ r∙znΘ protokoly Internetu. M∙╛e b²t pou╛ita k vytvo°enφ novΘho protokolu, kter² obsluhuje protokoly nepodporovanΘ FastNet Tools nebo k vytvo°enφ novΘho protokolu k °e╣enφ zßkaznickΘho problΘmu.
Nep°edpoklßdß se, ╛e komponenta TPowersock bude pou╛φvßna jako samostatnß komponenta. Od komponenty TPowersock ale odvozujeme dal╣φ t°φdy. Kdy╛ ji╛ od TPowersock mßme odvozenou svoji komponentu, pak pokud mßme nastaveny vlastnosti Host a Port, klient se m∙╛e p°ipojit volßnφm metody Connect ke vzdßlenΘmu hostiteli. Data mohou b²t p°ijφmßna od vzdßlenΘho hostitele volßnφm metod read, ReadLn, CaptureFile, CaptureStream a CaprtureString. Data m∙╛eme zasφlat na vzdßlenΘho hostitele volßnφm metod write, writeln, SendFile a SendStream. Metoda Transaction zasφlß data na vzdßlenΘho hostitele a Φte odpov∞∩ ze serveru.
Pokud se chystßme vytvo°it novou komponentu odvozenφm od komponenty TPowersock, pak v jejφm zdrojovΘm k≤du nalezneme vφce detail∙ o vnit°nφ prßci TPowersock. Jestli╛e nemßme zdrojov² k≤d pro FastNet Tools pro C++ Builder, pak jej m∙╛eme zφskat na http://www.netmastersllc.com.
Komponenta mß nßsledujφcφ vlastnosti (komponenty NetMasters jsou zapsßny v Object Pascalu; deklarace uvedenΘ v tΘto a dal╣φch kapitolßch k popisovßnφ vlastnostφ, metod a udßlostφ komponent NetMasters, jsou takΘ zapsßny v Object Pascalu):
 
Deklarace Popis Rozsah Dostupnost
property BeenCanceled: boolean; Vlastnost mß hodnotu true, pokud souΦasnß operace mß b²t zru╣ena, a false jestli╛e souΦasnß operace nemß t²t zru╣ena. Public Runtime, Readonly
property BeenTimedOut: boolean; Vlastnost mß hodnotu true, pokud pro souΦasnou operaci vypr╣el Φas nebo false, jestli╛e Φas nevypr╣el. Public Runtime, Readonly
property BytesRecvd: longint; Vlastnost obsahuje poΦet slabik p°ijat²ch v souΦasnΘm p°enosu dat. Public Runtime, Readonly
property BytesSent: longint; Vlastnost obsahuje poΦet slabik odeslan²ch v pr∙b∞hu souΦasnΘ datovΘ transakce. Public Runtime, Readonly
property BytesTotal: longint; Vlastnost obsahuje celkov² poΦet slabik p°ijat²ch nebo odeslan²ch v souΦasnΘ datovΘ transakci. Public Runtime, Readonly
property Connected: boolean; Vlastnost mß hodnotu true pokud klient je p°ipojen na vzdßlenΘho hostitele a false pokud p°ipojen nenφ. Public Runtime, Readonly
property Handle: tSocket; Madlo soketu prßv∞ pou╛φvanΘho pro komunikaci WinSock. Pou╛φvßme p°i p°φmΘm volßnφ API WinSock. Public Runtime, Readonly
property Host: String; Vlastnost obsahuje jmΘno nebo teΦkovou IP adresu vzdßlenΘho hostitele pro p°ipojenφ. Published Runtime, Designtime
property LastErrorNo: integer; Vlastnost obsahuje poslednφ oznßmenou chybu soketu. Public Runtime
property LocalIP: string; Vlastnost obsahuje teΦkovou IP adresu lokßlnφho poΦφtaΦe. Je-li vφce ne╛ jedna IP adresa, pak je vracena pouze prvnφ. Public Runtime, Readonly
property Port: Integer; Vlastnost specifikuje Φφslo portu na vzdßlenΘm hostiteli, ke kterΘmu se p°ipojujeme nebo v p°φpad∞ serveru, Φφslo portu na kterΘm server naslouchß. Published Runtime*, Designtime
property RemoteIP: string; Vlastnost obsahuje teΦkovou IP adresu vzdßlenΘho hostitele. Vlastnost nenφ nastavena dokud klient nenφ p°ipojen na vzdßlenΘho hostitele. Public Runtime, Readonly
property ReplyNumber: Smallint; Vlastnost obsahuje Φφseln² v²sledek transakce (je-li). Public Runtime, Readonly
property ReportLevel: integer; Vlastnost °φdφ mno╛stvφ detail∙, kterΘ jsou oznamovßny udßlostφ OnStatus a vlastnostφ Status. Mo╛nΘ hodnoty jsou: Status_None = 0, Status_Informational = 1, Status_Basic = 2,  Status_Routines = 4, Status_Debug = 8 a Status_Trace = 16. Implicitnφ hodnota je Status_Informational Published DesignTime, RunTime
property Status: String; Vlastnost obsahuje poslednφ stavovou zprßvu, kterß byla p°edßna jako parametr stavu v udßlosti OnStatus. Public RunTime, ReadOnly
property TimeOut: Integer; Vlastnost specifikuje mno╛stvφ Φasu (v milisekundßch) Φekßnφ na odpov∞∩ od soketu p°ed generovßnφm v²jimky a zru╣enφm souΦasnΘ operace. Pokud TimeOut je 0, pak v²jimka nenφ nikdy generovßna a Φas operace nikdy nevypr╣φ. Implicitnφ hodnota: 0. Published Designtime, Runtime
property TransactionReply: String; Vlastnost obsahuje v²sledek od poslednφho p°φkazu zaslanΘho na server. Public Runtime, ReadOnly
property WSAInfo: TStringList; Vlastnost obsahuje informace o souΦasnΘ verzi Winsock (Φφslo verze a v²robce). Public Runtime, ReadOnly

* V p°φpad∞ TNMGeneralServer, vlastnost Port musφ b²t nastavena b∞hem nßvrhu.

Nßsleduje struΦn² popis metod komponenty. Je zde uvedena deklarace (v Object Pascalu), popis, popis parametr∙ a vracenß hodnota.

function Accept: Word; virtual;
Metoda akceptuje p°ipojenφ ze vzdßlenΘho poΦφtaΦe, kter² po╛aduje p°ipojenφ. Soket akceptujφcφ p°ipojenφ je nßvratovß hodnota. V²sledkem funkce je popis soketu pro p°ipojenφ klienta.

function read(value: word): string;
Metoda Φte specifikovan² poΦet slabik ze souΦasn∞ p°ipojenΘho soketu a vracφ jej jako °et∞zec. Parametr specifikuje poΦet slabik, kter² mß b²t p°eΦten ze soketu. Jestli╛e value = 0, pak jsou Φtena v╣echna data vracenß soketem.

function ReadLn: string;
Metoda Φte data ze soketu dokud nenφ nalezeno od°ßdkovßnφ a vracφ data jako °et∞zec.

function Transaction(const CommandString: String): String; virtual;
Metoda zasφlß p°φkaz vzdßlenΘmu hostiteli a vracφ odpov∞∩ od hostitele jako °et∞zec. Je takΘ nastavena vlastnost ReplyNumber na Φφselnou hodnotu odpov∞di (je-li). Parametr specifikuje p°φkaz zasφlan² na server.

procedure Abort; virtual;
Metoda ru╣φ souΦasnou operaci. Tato metoda je ve sv²ch potomcφch p°episovßna, proto╛e ka╛dß operace mß jinΘ po╛adavky na operaci zru╣enφ.

procedure Cancel;
Metoda ru╣φ souΦasnou vstupnφ nebo v²stupnφ operaci a odpojuje se od vzdßlenΘho hostitele. Kdy╛ je volßna metoda Cancel, pak je generovßna v²jimka.

procedure CaptureFile(FileName: String);
Metoda zabere v╣echna data ze soketu a ulo╛φ je v souboru specifikovanΘm parametrem. Data budou odebφrßna ze soketu, dokud soket nenφ uzav°en. Parametr musφ b²t p°φpustnß specifikace souboru (m∙╛e b²t uvedena i adresß°ovß cesta).

procedure CaptureStream(MainStream: TStream; Size: longint);
Metoda zabφrß data ze soketu dokud nenφ zφskßn specifikovan² poΦet slabik. Parametr MainStream specifikuje proud pou╛it² pro ulo╛enφ dat a parametr Size urΦuje poΦet Φten²ch slabik do proudu. Pokud Size je -1, pak data jsou Φtena do proudu dokud soket nenφ uzav°en.

procedure CaptureString(var AString: String; Size: longint);
Metoda p°ebφrß data specifikovanΘ velikosti ze soketu a uklßdß je do °et∞zce. Prvnφm parametrem je °et∞zcovß prom∞nnß do kterΘ jsou uklßdßna data, druh² parametr specifikuje poΦet Φten²ch slabik ze soketu do °et∞zce. Pokud Size je -1, pak data jsou Φtena do proudu dokud soket nenφ uzav°en.

procedure CertifyConnect;
Metoda testuje zda vidφ p°ipojenφ klienta ke vzdßlenΘmu hostiteli. Pokud p°ipojenφ neexistuje je generovßna udßlost OnConnectionRequired. Tato udßlost je v TPowersock chrßn∞nß, ale v jeho potomcφch je zve°ejn∞na.

procedure Connect; virtual;
Metoda p°ipojuje klienta ke vzdßlenΘmu hostiteli. P°ed volßnφm metody musφ b²t nastaveny vlastnosti Host a Port. V komponentßch specifick²ch protokol∙, potomcφch TPowersock vlastnost Port je ji╛ nastavena na standardnφ port protokolu. Pokud jmΘno hostitele je chybnΘ, pak je generovßna v²jimka, jestli╛e prom∞nnß Handled v udßlosti OnInvalidHost nenφ nastavena na true, nebo pokud udßlost OnInvalidHost nenastavuje chybnΘ jmΘno hostitele na p°φpustnΘ jmΘno hostitele. Pokud p°ipojenφ je ne·sp∞╣nΘ, pak vznikß udßlost OnConnectionFailed a je generovßna v²jimka.

procedure Disconnect; virtual;
Metoda odpojuje klienta od vzdßlenΘho hostitele. P°i ·sp∞╣nΘm odpojenφ vznikß udßlost OnDisconnect.

procedure FilterHeader(HeaderStream: TFileStream);
Metoda filtruje v²stup hlaviΦky MIME z dat zφskan²ch p°ipojen²m soketem a uklßdan²ch do HeaderStream. Parametr specifikuje souborov² proud k ulo╛enφ hlaviΦky MIME.

procedure Listen(sync: boolean);
Metoda naslouchß TCP p°ipojenφ na portu specifikovanΘm vlastnostφ Port. Pokud parametr je false, pak p°i navßzßnφ p°ipojenφ vznikß udßlost OnAccept, ve kterΘ p°ipojenφ m∙╛e b²t akceptovßno metodou Accept nebo m∙╛e b²t ignorovßno. Jestli╛e parametr je true, pak volßnφ Accept musφ b²t provedeno p°φmo po volßnφ Listen k akceptaci p°ipojenφ.

procedure RequestCloseSocket;
Metoda uzavφrß souΦasnΘ aktivnφ soket, ale neuvol≥uje jej.

procedure SendBuffer(value: PChar; buflen: word);
Metoda zasφlß data z vyrovnßvacφ pam∞ti na vzdßlenΘho hostitele. Prvnφ parametr specifikuje vyrovnßvacφ pam∞╗ s odesφlan²mi daty a druh² parametr urΦuje poΦet slabik, kterΘ budou odeslßny z vyrovnßvacφ pam∞ti.

procedure SendFile(FileName: String);
Metoda odesφlß obsah souboru na vzdßlenΘho hostitele. Parametr specifikuje jmΘno odesφlanΘho souboru (m∙╛e obsahovat i adresß°ovou cestu).

procedure SendStream(MainStream: TStream);
Metoda odesφlß obsah proudu na vzdßlenΘho hostitele. Parametr specifikuje proud obsahujφcφ odesφlanß data.

procedure write(value: String);
Metoda odesφlß °et∞zec na vzdßlenΘho hostitele. Odesφlan² °et∞zec je urΦen parametrem. Na konec p°enß╣enΘho °et∞zce nenφ p°ipojeno od°ßdkovßnφ.

procedure writeln(value: string);
Metoda odesφlß °et∞zec na vzdßlenΘho hostitele. Odesφlan² °et∞zec je urΦen parametrem. Na konec °et∞zce je p°ipojeno od°ßdkovßnφ.

Komponenta TPowersock mß tyto udßlosti:

property OnConnect: TNotifyEvent;
Udßlost vznikß, kdy╛ je z°φzeno p°ipojenφ na vzdßlenΘho hostitele. Odpovφdß zprßv∞ FD_CONNECT WinSock.

property OnHostResolved: TOnHostResolved;
Udßlost vznikß, kdy╛ adresa vzdßlenΘho hostitele je p°evedena na teΦkovou IP adresu. Pokud specifikovanΘ jmΘno hostitele nebo IP adresa je chybnß, pak nenφ generovßna udßlost OnHostResolved, ale udßlost OnInvalidHost.

property OnStatus: TOnStatus;
Udßlost vznikß, kdy╛ se zm∞nφ stav komponenty.

property OnConnectionFailed: TNotifyEvent;
Udßlost vznikß, kdy╛ nelze z°φdit p°ipojenφ na vzdßlenΘho hostitele.

property OnDisconnect: TNotifyEvent;
Udßlost vznikß p°i odpojenφ klienta od serveru. Odpovφdß zprßv∞ FD_CLOSE WinSock.

property OnInvalidHost: THandlerEvent;
Udßlost vznikß, kdy╛ hostitel specifikovan² vlastnostφ Host je nep°φpustn². Pokud parametr Handled je nastaven na true pak je zopakovßn pokus o p°ipojenφ. Kdy╛ Handled je false, pak je generovßna v²jimka.

property OnPacketRecvd: TNotifyEvent;
Udßlost nastßvß, kdy╛ data jsou p°ijmuta ze vzdßlenΘho hostitele. Pou╛φvßme spoleΦn∞ s vlastnostmi BytesRecvd a BytesTotal k monitorovßnφ pr∙b∞hu zpracovßnφ dat.

property OnPacketSent: TNotifyEvent;
Udßlost nastßvß, kdy╛ data jsou odeslßna na vzdßlenΘho hostitele. Pou╛φvßme spoleΦn∞ s vlastnostmi BytesSent a BytesTotal k monitorovßnφ pr∙b∞hu zpracovßnφ dat.

Komponenta TPowersock nenφ urΦena pro p°φmΘ pou╛itφ v na╣ich aplikacφch (i kdy╛ m∙╛e b²t pou╛ita). Nßsleduje n∞kolik p°φklad∙ objas≥ujφcφch v²znam a pou╛itφ jednotliv²ch metod, vlastnostφ a udßlostφ tΘto komponenty (n∞kdy je k demonstraci pou╛it n∞kter² potomek TPowersock).

P°φklad 1
K vytvo°enφ tohoto p°φkladu zaΦneme novou aplikaci a na formulß° vlo╛φme komponenty TButton, TMemo a TPowersock. Do obsluhy udßlosti OnClick tlaΦφtka vlo╛φme nßsledujφcφ k≤d:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Powersock1->Host = "www.netmastersllc.com";
  Powersock1->Port = 13;
  Powersock1->Connect();
}
Do obsluhy udßlosti OnConnect ovladaΦe TPowersock vlo╛φme k≤d:
void __fastcall TForm1::Powersock1Connect(TObject *Sender)
{
  Memo1->Liens->Add("Connected");
  Memo1->Lines->Add("Local Address: "+Powersock1->LocalIP);
  Memo1->Lines->Add("Remote Address: "+Powersock1->RemoteIP);
}
Obsluha udßlosti OnHostResolved ovladaΦe TPowersock vypadß takto:
void __fastcall TForm1::Powersock1HostResolved(TComponent *Sender)
{
  Memo1->Lines->Add("Host Resolved");
}
Vytvo°φme je╣t∞ obsluhu OnStatus ovladaΦe TPowersock s k≤dem:
void __fastcall TForm1::Powersock1Status(TComponent *Sender,
     AnsiString Status)
{
  Memo1->Lines->Add(Powersock1->Status);
  Memo1->Lines->Add("Last WinSock error: "+IntToStr(Powersock1->LastErrorNo));
  if (Powersock1->BeenCanceled)
    Memo1->Lines->Add("Input/ouput operation canceled");
  if (Powersock1->BeenTimedOut)
    Memo1->Lines->Add("Operation timed out");
}
Spustφme aplikaci a stiskneme tlaΦφtko. Po stisku tlaΦφtka je z°φzeno p°ipojenφ na www.netmastersllc.com na port 13. Po p°evedenφ www.netmastersllc.com na p°φpustnou IP adresu, pak obsluha OnHostResolved p°idß do komponenty Memo °ßdek Host Resolved. Kdy╛ je z°φzeno p°ipojenφ pak OnConnect aktualizuje Memo k informovßnφ u╛ivatele, ╛e p°ipojenφ bylo z°φzeno. Jsou takΘ vypsßny teΦkovΘ IP adresy lokßlnφho poΦφtaΦe (vlastnost LocalIP) a vzdßlenΘho poΦφtaΦe (vlastnost RemoteIP). Jak jsou dostupnΘ stavovΘ zprßvy, pak do Memo jsou p°idßny dal╣φ °ßdky, stejn∞ jako poslednφ zji╣t∞nß chyba Winsock. Pokud souΦasnß operace mß b²t zru╣ena, pak vlastnost BeenCanceled je true a pokud pro souΦasnou operaci vypr╣el Φas, pak vlastnost BeenTimedOut mß hodnotu true.

P°φklad 2
Pro vytvo°enφ dal╣φho p°φkladu zaΦneme novou aplikacφ. Na formulß° vlo╛φme komponenty TStatusBar, TButton a TNMHTTP a nastavφme vlastnost SimplePanel komponenty stavovΘho °ßdku na true.
Vytvo°φme obsluhu udßlosti OnPacketRecvd komponenty TNMHTTP s nßsledujφcφm p°φkazem:
void __fastcall TForm1::NMHTTP1PacketRecvd(TObject *Sender)
{
  StatusBar1->SimpleText = IntToStr(NMHTTP1->BytesRecvd)+
       " bytes out of "+IntToStr(NMHTTP1->BytesTotal)+" transferred";
}
Obsluha stisku tlaΦφtka bude:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  NMHTTP1->Get("http://www.netmastersllc.com");
}
Spustφme aplikaci a stiskneme tlaΦφtko. Stavov² °ßdek je aktualizovßn podle p°ijatΘho dokumentu. Udßlost OnPacketRecvd aktualizuje stavov² °ßdek, kdy╛ data p°ijdou, zobrazenφm celkovΘho poΦtu p°enß╣en²ch slabik a poΦtu slabik p°ijat²ch klientem.

P°φklad 3
Op∞t zaΦneme novou aplikacφ. Na formulß° umφstφme komponenty TStatusBar, TButton, 3x TEdit a TNMSMTP a nastavφme vlastnost SimplePanel stavovΘho °ßdku na true.
Vytvo°φme obsluhu udßlosti OnPacketSent komponenty TNMSMTP s tφmto obsahem:
void __fastcall TForm1::NMSMTP1PacketSent(TObject *Sender)
{
  StatusBar1->SimpleText = IntToStr(NMSMTP1->BytesSent)+
        " bytes out of "+IntToStr(NMSMTP1->BytesTotal)+" transferred";
}
Obsluha OnConnect komponenty TNMSMTP bude vypadat takto:
void __fastcall TForm1::NMSMTP1Connect(TObject *Sender)
{
  NMSMTP1->SendMail();
}
Pokuste se sami vytvo°it obsluhu udßlosti OnSuccess komponenty TNMSMTP informujφcφ na stavovΘm °ßdku o ·sp∞╣nosti operace. Dßle vytvo°φme obsluhu stisku tlaΦφtka s tφmto obsahem:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int I;
  NMSMTP1->Host = Edit1->Text;
  NMSMTP1->UserID = Edit2->Text;
  NMSMTP1->PostMessage->FromAddress = Edit3->Text;
  NMSMTP1->PostMessage->ToAddress->Text = Edit3->Text;
  NMSMTP1->PostMessage->Subject = "Testing BytesSent";
  for (I = 1; I <= 10; I++)
    NMSMTP1->PostMessage->Body->Add("Test line "+IntToStr(I));
  NMSMTP1->Connect();
}
Spustφme aplikaci. Do Edit1 zapφ╣eme jmΘno nebo IP adresu na╣eho SMTP serveru. Do Edit2 zapφ╣eme ID u╛ivatele pro SMTP server. Do Edit3 zapφ╣eme na╣i e-mail adresu. Kdy╛ stiskneme tlaΦφtko, pak si sami sob∞ za╣leme mail a kdy╛ paket je odeslßn (v tomto p°φpad∞ je pouze jeden), pak stavov² °ßdek zobrazuje poΦet odeslan²ch slabik.

P°φklad 4
ZaΦneme op∞t novou aplikaci. Na formulß° umφstφme 2x TButton, TNMSMTP, 3x TEdit a TMemo. Obsluha stisku prvnφho tlaΦφtka bude tvo°ena:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  NMSMTP1->Host = Edit1->Text;
  NMSMTP1->UserID = Edit2->Text;
  NMSMTP1->PostMessage->ToAddress->Text = Edit3->Text;
  NMSMTP1->PostMessage->FromAddress = Edit3->Text;
  NMSMTP1->PostMessage->Subject = "Test message";
  NMSMTP1->PostMessage->Body->Add("This is a test message");
  NMSMTP1->PostMessage->Body->Add
    ("If this message is delivered, the Cancel button (Button2) wasn't pressed fast enough");
  NMSMTP1->Connect();
}
Obsluha OnConnect komponenty TNMSMTP je tvo°ena:
void __fastcall TForm1::NMSMTP1Connect(TObject *Sender)
{
  Memo1->Lines->Add("Connected, sending message");
  NMSMTP1->SendMail();
}
a obsluhu OnSuccess stejnΘ komponenty tvo°φ:
void __fastcall TForm1::NMSMTP1Success(TObject *Sender)
{
  Memo1->Lines->Add("Success, you didn't press Button2 fast enough");
  if (NMSMTP1->Connected)
    NMSMTP1->Disconnect();
}
Obsluhu stisku druhΘho tlaΦφtka tvo°φ k≤d:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Powersock1->Cancel();
}
Zb²vß je╣t∞ vytvo°it obsluhu udßlosti OnDisconnect komponenty TNMSMTP:
void __fastcall TForm1::NMSMTP1Disconnect(TObject *Sender)
{
  Memo1->Lines->Add("Disconnected");
}
Spustφme aplikaci. Do Edit3 zapφ╣eme na╣i e-mail adresu. Zapφ╣eme jmΘno hostitele nebo IP adresu na╣eho SMTP serveru do Edit1. Pokud p°i p°ihla╣ovßnφ k na╣emu SMTP serveru je po╛adovßno ID u╛ivatele, pak je zadßme do Edit2 (nebo jej ponechßme prßzdn²).
Nynφ stiskneme prvnφ tlaΦφtko. Kdy╛ v Memo se objevφ Connected, sending message, pak stiskneme druhΘ tlaΦφtko. Po jeho stisku je generovßna v²jimka a je volßna obsluha OnDisconnect, kterß oznamuje u╛ivateli odpojenφ.
Pokud druhΘ tlaΦφtko nestiskneme p°ed ·sp∞╣n²m odeslßnφm zprßvy, pak obsluha OnSuccess p°idß do Memo oznßmenφ, ╛e u╛ivatel tlaΦφtko nestisknul a je volßna metoda Disconnect k odpojenφ od vzdßlenΘho hostitele, pokud klient je stßle p°ipojen (je oznßmeno vlastnostφ Connected).

P°φklad 5
D°φve ne╛ m∙╛eme pou╛φt udßlost OnRead, musφme:

V na╣em p°φklad∞ pou╛ijeme druhou mo╛nost. ZaΦneme v²voj novΘ aplikace. Na formulß° umφstφme TButton a TPowersock. Obsluhu stisku tlaΦφtka bude tvo°it:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Powersock1->Host = "www.netmastersllc.com";
  Powersock1->Port = 13;
  Powersock1->ReportLevel = 1;
  Powersock1->TimeOut = 5000;
  Powersock1->Connect();
}
Na konec souboru UNIT1.CPP zapφ╣eme nßsledujφcφ k≤d:
// Tato metoda bude p°i°azena k udßlosti OnRead
void __fastcall TForm1::ReadEvent(TObject *Sender)
{
  ShowMessage(Powersock1->ReadLn());
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Powersock1->OnRead = ReadEvent;
}
P°idßme metodu ReadEvent k definici t°φdy formulß°e do hlaviΦkovΘho souboru takto:
class TForm1 : public TForm
{
__published: // IDE-managed Components
    TButton *Button1;
    TPowersock *Powersock1;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public:  // User declarations
    __fastcall TForm1(TComponent* Owner);
    void __fastcall ReadEvent(TObject *Sender);
};
Kdy╛ stiskneme tlaΦφtko, pak vlastnost TimeOut je nastavena na 5000 (5 sekund) a tak v p°φpad∞ chybnΘho hostitele nebo chyb∞jφcφ reakce v uvedenΘm Φase, pokus o p°ipojenφ ukonΦφ. Vlastnost ReportLevel je nastavena na 1 a tak budou zasφlßny pouze zßkladnφ informaΦnφ zprßvy. Je z°φzeno p°ipojenφ na specifikovanΘho hostitele, v na╣em p°φpad∞ na www.netmastersllc.com,  port 13. Port 13 je standardnφm portem pro protokol DayTime. Kdy╛ vzdßlen² hostitel za╣le datum a Φas, nastane udßlost OnRead, kterß zobrazφ datum a Φas pomocφ ShowMessage.

Komponenta TNMGeneralServer

Komponenta TNMGeneralServer je poskytnuta pro pou╛itφ jako zßkladnφ t°φda pro v²voj vφcevlßknov²ch Internetovsk²ch server∙ (zßkaznick²ch server∙ nebo server∙ podporujφcφch standard RFC). Komponenta TNMGeneralServer nenφ urΦena k pou╛itφ jako samostatnß komponenta, i kdy╛ takto m∙╛e b²t pou╛ita. Komponenta je odvozena od TPowersock.
Vytvß°enφm potomk∙ t°φdy TNMGeneralServer a p°episovßnφm metody Serve, m∙╛eme p°izp∙sobit reagovßnφ serveru na klientskΘ p°ipojenφ. Interakce s klientem je provßd∞na pomocφ Φtecφch a zßpisov²ch metod zd∞d∞n²ch od TPowersock.
Poznßmka: Vlastnost Port musφ b²t nastavena b∞hem nßvrhu.

Metoda Serve je virtußlnφ metoda, kterß ve t°φdßch potomk∙ b²vß p°edefinovßna. Metoda Serve je metoda, kterß je volßna v╛dy, kdy╛ se klient p°ipojφ na server. Metoda Serve je provßd∞na v jinΘm vlßkn∞ a tak objekty a metody VCL nemohou b²t pou╛ity v tΘto metod∞.
Poznßmka: Metoda Serve ned∞lß nic, kdy╛ je volßna p°φmo ze t°φdy TNMGeneralServer. Musφ b²t pou╛φvßna (p°epsanß) ve t°φdßch odvozen²ch od TNMGeneralServer.
Kdy╛ pou╛ijeme metodu Serve v odvozenΘ t°φd∞, pak musφme volat zd∞d∞nou metodu Serve. Kdy╛ metoda Serve skonΦφ, pak klient je odpojen od serveru.
Udßlost
property OnClientContact: TNotifyEvent;
nastßvß v╛dy, kdy╛ klient se p°ipojuje na server.

Funkce NthPos

Funkce vracφ pozici specifikovanΘho v²skytu specifikovanΘho odd∞lovaΦe v °et∞zci. Prvnφ parametr obsahuje rozklßdan² °et∞zec, druh² parametr urΦuje znak pou╛it² jako odd∞lovaΦ a t°etφ parametr urΦuje kolikßt² odd∞lovaΦ hledßme.
Poznßmka: Pou╛itφ tΘto funkce nevy╛aduje pou╛φt n∞jakou komponentu FastNet v aplikaci, postaΦuje aby hlaviΦkov² soubor Psock.hpp byl vlo╛en do jednotky pou╛φvajφcφ tuto funkci.
S pou╛itφm se seznßmφme na p°φklad∞. ZaΦneme v²voj novΘ aplikace a na formulß° vlo╛φme tlaΦφtko a Φty°i editaΦnφ ovladaΦe. Do jednotky za °ßdek
#include <Forms.hpp>
vlo╛φme:
#include <Psock.hpp>
Vytvo°φme obsluhu stisku tlaΦφtka:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Edit4->Text = IntToStr(NthPos(Edit1->Text, Edit2->Text[1],
     StrToIntDef(Edit3->Text,2)));
}
Po spu╣t∞nφ aplikace do prvnφho editaΦnφho ovladaΦe zapφ╣eme prohledßvan² °et∞zec. Vlo╛φme sem nap°. This*is*very*informative. Do druhΘho editaΦnφho ovladaΦe zapφ╣eme odd∞lovaΦ. V na╣em p°φpad∞ pou╛ijeme *. Do t°etφho editaΦnφho ovladaΦe zapφ╣eme kolikßt² v²skyt hv∞zdiΦky hledßme (zapφ╣eme nap°. 3). Po stisku tlaΦφtka se pozice hledanΘho odd∞lovaΦe zobrazφ v poslednφm editaΦnφm ovladaΦi.

Funkce NthWord

Funkce vracφ slovo z °et∞zce. Prvnφ parametr specifikuje prohledßvan² °et∞zec, druh² parametr specifikuje znak odd∞lujφcφ slova a t°etφ parametr urΦuje kolikßtΘ slovo mß b²t vrßceno.
Poznßmka: Pou╛itφ tΘto funkce nevy╛aduje pou╛φt n∞jakou komponentu FastNet v aplikaci, postaΦuje aby hlaviΦkov² soubor Psock.hpp byl vlo╛en do jednotky pou╛φvajφcφ tuto funkci.

Funkce StreamLn

Metoda p°idßvß °et∞zec do proudu. Prvnφ parametr specifikuje proud, ke kterΘmu p°idßvßme °et∞zec a druh² parametr specifikuje p°idßvan² °et∞zec.
Poznßmka: Pou╛itφ tΘto funkce nevy╛aduje pou╛φt n∞jakou komponentu FastNet v aplikaci, postaΦuje aby hlaviΦkov² soubor Psock.hpp byl vlo╛en do jednotky pou╛φvajφcφ tuto funkci.

Komponenta TNMDayTime

Komponenta je pou╛φvßna pro zφskßvßnφ datumu a Φasu ze slu╛by daytime Internetu, jak je popsßno v RFC 867. Komponenta je odvozena od TPowersock. Vy╛aduje WSOCK32.DLL.
D°φve ne╛ m∙╛eme zφskat datum a Φas z internetovskΘ slu╛by daytime, musφme nejprve znßt jmΘno hostitele nebo teΦkovou IP adresu hostitele datumu a Φasu a p°i°adit tuto hodnotu vlastnosti Host.
Po nastavenφ Host pouze Φteme hodnotu vlastnosti DayTimeStr, Φφm╛ zφskßme datum a Φas od specifikovanΘho hostitele.
 
property DayTimeStr: string; Vlastnost obsahuje datum a Φas zφskanΘ od vzdßlenΘho hostitele. Formßt datumu a Φasu zßvisφ na dotazovanΘm serveru. Public RunTime, ReadOnly

Pozor: Volßnφ zd∞d∞nΘ metody Connect zp∙sobφ chybu.


Komponenta TNMEcho

Komponenta je pou╛φvßna k zasφlßnφ textu na Internetovskou slu╛bu echo a op∞tovn∞ oΦekßvß p°ijetφ tohoto textu, jak je popsßno v RFC 862. Je Φasto pou╛φvßna pro testovßnφ integrity a p°enosovΘ rychlosti sφt∞. P°ed odeslßnφm textu na server musφ b²t z°φzeno propojenφ. Z°φzenφ propojenφ je dokonΦeno nastavenφm vlastnosti Host na p°φpustn² internetovsk² server echo a vlastnost Port na odpovφdajφcφ port. Server Echo obvykle naslouchß na portu 7. Odeslßnφ textu na server je provedeno metodou Echo.
 
property ElapsedTime: single; Vlastnost urΦuje Φas pot°ebn² k vrßcenφ zaslanΘho textu zp∞t klientovi. Public RunTime, ReadOnly

Poznßmka:  Toto vlastnost nenφ nastavena dokud metoda Echo nenφ volßna, a obsahuje v²sledek z poslednφho volßnφ.

function Echo(EchoString: string): string;
Metoda zasφlß text p°edan² v parametru na vzdßlen² server. Tento text je vracen zp∞t a tvo°φ nßvratovou hodnotu metody (k p∙vodnφmu textu je p°ipojeno od°ßdkovßnφ).
Poznßmka: P°ed volßnφm tΘto metody musφme b²t p°ipojeni na vzdßlenΘho hostitele. Pokud nejsme p°ipojeni vznikß udßlost OnConnectionRequired.


Komponenta TNMFinger

Komponenta je pou╛φvßna k zφskßvßnφ informacφ o u╛ivateli z InternetovskΘho serveru finger, pomocφ protokolu Finger popsanΘho v RFC 1288.
D°φve ne╛ m∙╛eme zφskat informace o u╛ivateli z vlastnosti FingerStr, musφme nastavit vlastnost Host na existujφcφ server Finger. Vlastnost Port normßln∞ nenφ nutno m∞nit, nebo╗ v∞t╣ina server∙ Finger naslouchß na portu 79.
 
property FingerStr: string; Vlastnost obsahuje informaci (je-li) o specifikovanΘm u╛ivateli. Public RunTime, ReadOnly
property User: string; Vlastnost specifikuje u╛ivatele k zφskßnφ informacφ o n∞m. Published DesignTime, RunTime

Poznßmka: Pokud server nenalezne informaci o u╛ivateli, pak vlastnost FingerStr obsahuje User Not Found.
Varovßnφ: Vlastnost Host musφ b²t nastavena na p°φpustn² server Finger a vlastnost User musφ b²t nastavena p°ed p°φstupem ve vlastnosti FingerStr.


Jednotka NMFtp

Jednotka TNMFTP obsahuje komponentu TNMFTP a typy a t°φdy, kterΘ vyu╛φvß. Jsou zde t°φdy: a typy:

T°φda TFTPDirectoryList

T°φda je zßkladnφ t°φdou pro v╣echny ostatnφ rozklßdajφcφ t°φdy adresß°ov²ch seznam∙ FTP. Pokud nalezneme hostitele FTP, kter² neodpovφdß n∞kterΘmu ze souΦasn∞ dostupn²ch p°eddefinovan²ch objekt∙, pak od tΘto t°φdy m∙╛eme odvodit sv∙j vlastnφ rozkladaΦ seznamu.
V╣echny vlastnosti tΘto t°φdy jsou typu TStringList. Indexy ka╛dΘ vlastnosti odpovφdajφ stejnΘmu indexu v ka╛dΘ ostatnφ vlastnosti. name[1] a Attribute[1] obsahujφ jmΘno a tributy pro druh² (indexy zaΦφnajφ od 0) prvek v seznamu. Jsou zde tyto vlastnosti: T°φda mß dv∞ metody:

procedure Clear;
Metoda vyprazd≥uje vlastnosti objektu seznamu. Po jejφm volßnφ, ka╛d² objekt TStringList je prßzdn².

procedure ParseLine(Line: string); virtual;
Metoda rozklßdß °ßdek seznamu a odd∞luje jmΘna, velikosti, datum modifikace a atributy souboru do jejich samostatn²ch vlastnostφ v objektu.

Typ TCmdType

TCmdType = (cmdChangeDir, cmdMakeDir, cmdDelete, cmdRemoveDir, cmdList,
  cmdRename, cmdUpRestore, cmdDownRestore, cmdDownload, cmdUpload,
  cmdAppend, cmdReInit, cmdAllocate, cmdNList, cmdDoCommand, cmdCurrentDir);
Typ poskytuje jednoduch² zp∙sob odkazovßnφ se na dostupnΘ p°φkazy komponenty TNMFTP. V²Φtov² typ uvßdφ jednotlivΘ p°φkazy FTP.

Typ TFailureEvent

TFailureEvent = procedure(var Handled: Boolean; Trans_Type: TCmdType)
   of object;
Typ je pou╛φvßn pro udßlost OnFailure. Parametr Handled urΦuje zda implicitnφ akce byla provedena nebo ne. Parametr Trans_Type specifikuje chybujφcφ p°φkaz.

Typ TNMListItem

TNMListItem = procedure(Listing: string) of object;
Typ udßlosti je pou╛it pro p°edßvßnφ prvk∙ °et∞zce po jednom udßlosti. To je u╛iteΦnΘ v udßlosti OnListItem, kterß vracφ seznam z metod List a NList. Parametr Listing obsahuje souΦasn² prvek, kter² mß b²t p°edßn.

Typ TSuccessEvent

TSuccessEvent = procedure(Trans_Type: TCmdType) of object;
Typ udßlosti je pou╛it udßlostφ OnSuccess, kdy╛ p°φkaz je proveden ·sp∞╣n∞. Parametr specifikuje p°φkaz, kter² byl proveden ·sp∞╣n∞.

Typ TUnsupportedEvent

TUnsupportedEvent = procedure(Trans_Type: TCmdType) of object;
Typ udßlosti TUnsupportedEvent je pou╛it v udßlosti OnUnSupportedFunction. To p°edßvß nepodporovan² p°φkaz.

Komponenta TNMFTP

V²znam komponenty TNMFTP je pro p°enß╣enφ soubor∙ na  a z Internet/Intranet FTP server prost°ednictvφm protokolu FTP popsanΘho v RFC 959. Pou╛itφ tΘto komponenty vy╛aduje WSOCK32.DLL, kter² m∙╛e b²t zφskßn od r∙zn²ch dodavatel∙.
D°φve ne╛ m∙╛eme pou╛φt komponentu TNMFTP pro p°enos soubor∙ na nebo ze vzdßlenΘho hostitele, se musφme p°ipojit. To je zaji╣t∞no nastavenφm vlastnostφ Host a Port na p°φpustn² FTP server. Pak nastavφme vlastnosti UserID a Password na identifikaci a heslo u╛ivatele tohoto serveru. Mnoho server∙ akceptuje Anonymous jako identifikaci u╛ivatele a na╣i e-mail adresu jako heslo. Po nastavenφ t∞chto vlastnostφ volßme metodu Connect pro p°ipojenφ na server.
Kdy╛ ji╛ jsme p°ipojeni na server, pak m∙╛eme zφskat seznam soubor∙ a adresß°∙ volßnφm metody List a zßpisem obsluhy udßlosti pro udßlost OnListItem. M∙╛eme zm∞nit souΦasn² adresß° (naz²van² "pracovnφ" adresß°) volßnφm metody ChangeDir, specifikujφcφ p°φpustnΘ jmΘno novΘho pracovnφho adresß°e.
Ulo╛enφ soubor∙ do souΦasnΘho adresß°e na vzdßlenΘm hostiteli provedeme volßnφm metody Upload. Metoda Upload p°ebφrß jmΘno souboru na na╣em lokßlnφm poΦφtaΦi a jmΘno k ulo╛enφ na vzdßlenΘm poΦφtaΦi jako parametr. Nem∙╛eme uklßdat soubory na hostitele FTP, pokud k tomu nemßme pot°ebnß prßva. To je Φasto povoleno v adresß°i nazvanΘm incoming. Pokud soubor existuje na serveru pod stejn²m jmΘnem jako je specifikovßno v metod∞ Upload, pak soubor je p°epsßn.
K nata╛enφ soubor∙ ze vzdßlenΘho hostitele, nejd°φve volßme metodu List k zji╣t∞nφ dostupn²ch soubor∙ ke sta╛enφ. Pak volßme metodu Download, s p°edßnφm jmΘna souboru, kter² chceme stßhnout a cesty a jmΘna k ulo╛enφ na na╣em poΦφtaΦi jako parametr∙. Obecn∞, m∙╛eme mφt umo╛n∞no stahovat soubory z adresß°e nazvanΘho pub. Pokud soubor se stejn²m jmΘnem existuje na na╣em poΦφtaΦi, pak je p°epsßn.
K vytvo°enφ adresß°e na vzdßlenΘm hostiteli musφme mφt p°φslu╣nß prßva. Obecn∞ b²vß povoleno vytvß°et podadresß°e v adresß°i incoming na hostiteli FTP. K vytvo°enφ adresß°e volßme MakeDirectory a p°edßme jmΘno vytvß°enΘho adresß°e jako parametr.
K odstran∞nφ adresß°e ze vzdßlenΘho hostitele musφme mφt p°φslu╣nß prßva. Pokud je mßme, pak volßme metodu RemoveDir, kterΘ p°edßme jmΘno ru╣enΘho adresß°e jako parametr.
Komponenta mß nßsledujφcφ vlastnosti:
 
property CurrentDir: string; Vlastnost obsahuje jmΘno souΦasnΘho adresß°e na vzdßlenΘm systΘmu. Po volßnφ ChangeDir se m∙╛e zm∞nit. Public RunTime, ReadOnly
property FTPDirectoryList: TFTPDirectoryList; Vlastnost je pou╛φvßna pouze pokud vlastnost ParseList je nastavena na true. FTPDirecxtoryList obsahuje seznam zφskan² z metody List, kde jednotlivΘ prvky jsou rozd∞leny do vlastnostφ.
property ParseList: boolean; Vlastnost urΦuje zda rozklßdat adresß°ov² seznam do vlastnosti FTPDirectoryList nebo ne. P°i nastavenφ na false, adresß°ov² seznam rozklßdßn nenφ a musφ b²t zpracovßvßn udßlostφ OnListItem. Published Runtime, Designtime
property Password: string; Vlastnost specifikuje heslo pou╛itΘ p°i p°ihla╣ovßnφ na vzdßlenΘho hostitele FTP. Pokud specifikovanΘ heslo je chybnΘ, pak je generovßna udßlost OnAuthenticationFailed. Kdy╛ heslo nenφ zadßno vznikß udßlost OnAuthenticationNeeded. Published Runtime, Designtime
property UserID: string; Vlastnost specifikuje ID u╛ivatele pou╛itΘ p°i p°ihla╣ovßnφ na vzdßlenΘho hostitele FTP. Published Runtime, designtime
property Vendor: integer; Vlastnost specifikuje typ hostitele FTP, ke kterΘmu se p°ipojujeme. To umo╛≥uje rozlo╛it adresß°ov² seznam hostitele sprßvn²m zp∙sobem. Implicitnφ hodnota: NMOS_AUTO. Mo╛nΘ hodnoty jsou: NMOS_UNIX, NMOS_WINDOWS, NMOS_VM, NMOS_BULL, NMOS_MAC, NMOS_TOPS20, NMOS_VMS, NMOS_OS2, NMOS_MVS_IBM, NMOS_MVS_INTERLINK, NMOS_OTHER, NMOS_AUTO, NMOS_NT, NMOS_TANDEM, NMOS_AS400, NMOS_OS9 a NMOS_NETWARE.

Komponenta mß nßsledujφcφ metody:

procedure Allocate(FileSize: Integer);
Metoda se pou╛φvß pro alokovßnφ mφsta na vzdßlenΘm hostiteli pro uklßdan² soubor. Parametr specifikuje poΦet alokovan²ch slabik pro p°ichßzejφcφ soubor. Tato metoda nenφ po╛adovßna Φasto. Poskytuje podporu pro servery, kterΘ vy╛adujφ alokovßnφ diskovΘho prostoru d°φve ne╛ uklßdßnφ souboru m∙╛e b²t provedeno.

procedure ChangeDir(DirName: string);
Metoda m∞nφ aktußlnφ adresß° na vzdßlenΘm hostiteli. Parametr specifikuje jmΘno novΘho aktußlnφho adresß°e. M∙╛e to b²t adresß° umφst∞n² v aktußlnφm adresß°i nebo ·plnß cesta. P°i zm∞n∞ adresß°e se zm∞nφ i vlastnost CurrentDir. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdChangeDir.

procedure Delete(Filename: string);
Metoda ru╣φ soubor ze vzdßlenΘho hostitele. Parametr specifikuje ru╣en² soubor na vzdßlenΘm hostiteli. M∙╛e to b²t soubor v souΦasnΘm pracovnφm adresß°i nebo adresß°ovß cesta se jmΘnem souboru n∞kde na vzdßlenΘm systΘmu. Pro ru╣enφ souboru musφme mφt zßpisovß privilegia. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdDelete.

procedure DoCommand(CommandStr: string);
Metoda se pou╛φvß pro zasφlßnφ p°φkaz∙ na vzdßlenΘho hostitele FTP. Tato metoda je u╛iteΦnß pro pou╛itφ s u╛ivatelsk²mi hostiteli FTP, kterΘ majφ nestandardnφ p°φkazy nebo pro podporu neimplementovan²ch p°φkaz∙. Parametr je p°φkaz, kter² bude odeslßn na server. M∙╛e b²t jednoduch² jako pwd (p°φkaz pro zφskßnφ jmΘna aktußlnφho adresß°e) nebo slo╛itΘ jako zavßd∞nφ vφce soubor∙.

procedure Download(RemoteFile, LocalFile: string);
Metoda je pou╛φvßna pro zavßd∞nφ soubor∙ ze vzdßlenΘho hostitele FTP na lokßlnφ poΦφtaΦ. Parametr RemoteFile specifikuje jmΘno souboru v souΦasnΘm pracovnφm adresß°i na vzdßlenΘm hostiteli k zavedenφ. Parametr LocalFile specifikuje jmΘno pod kter²m soubor mß b²t ulo╛en na lokßlnφm poΦφtaΦi. Pokud soubor se stejn²m jmΘnem ji╛ existuje, pak je p°epsßn. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdDownload.

procedure DownloadRestore(RemoteFile, LocalFile: string);
Metoda zavßdφ soubor ze vzdßlenΘho hostitele, pokraΦovßnφm p°enosu, kter² byl d°φve p°eru╣en. Parametr RemoteFile specifikuje jmΘno zavßd∞nΘho vzdßlenΘho souboru. Parametr LocalFile specifikuje jmΘno pro ulo╛enφ souboru na lokßlnφ disk. Je to jmΘno souboru, kter² ji╛ existuje a je Φßstφ souboru d°φve zavßd∞nΘho. Tuto metodu nepodporujφ v╣echny hostitelΘ.

procedure List;
Metoda je pou╛φvßna pro zφskßvßnφ seznamu soubor∙ a adresß°∙ ze vzdßlenΘho hostitele. Seznam je zφskßvßn ze souΦasnΘho pracovnφho adresß°e. Pro ka╛d² uveden² prvek je generovßna udßlost OnListItem. Pokud ParseList je nastavena na true, pak vlastnost FTPDirectoryList obsahuje prvky obsa╛enΘ v seznamu, vΦetn∞ jmen, velikostφ a atribut∙. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdList.

procedure MakeDirectory(DirectoryName: string);
Metoda vytvß°φ adresß° v souΦasnΘm pracovnφm adresß°i na vzdßlenΘm hostiteli FTP. Parametr specifikuje jmΘno vytvß°enΘho adresß°e. M∙╛e to b²t samotnΘ jmΘno adresß°e nebo ·plnß adresß°ovß cesta. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdMakeDir.

procedure Mode(TheMode: Integer);
Metoda m∞nφ p°enosov² re╛im souboru pou╛it² pro p°enos soubor∙ mezi vzdßlen²m hostitelem a lokßlnφm poΦφtaΦem. Parametr specifikuje p°enosov² re╛im. Jsou mo╛nΘ tyto hodnoty:

procedure Nlist;
Metoda je pou╛ita k zφskßnφ seznamu pouze jmen soubor∙ a adresß°∙ ze souΦasnΘho pracovnφho adresß°e. Pro ka╛d² zφskan² prvek je generovßna udßlost OnListItem. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdNList.

procedure Reinitialize;
Metoda je pou╛ita k op∞tovnΘmu nastavenφ p°ipojenφ k serveru. To umo╛≥uje p°ipojenφ ke vzdßlenΘmu hostiteli p°ed provedenφm autentizace (UserID a Password). Po volßnφ metody Reinitialize je p°ipojenφ v nepou╛itelnΘm stavu. P°ed provßd∞nφm budoucφch FTP transakcφ, musφme op∞tovn∞ zaslat identifikaci u╛ivatele a heslo. Jinak p°φkazy jsou neproveditelnΘ.

procedure RemoveDir(DirectoryName: string);
Metoda je pou╛φvßna k odstra≥ovßnφ adresß°e za vzdßlenΘho hostitele FTP. Parametr specifikuje jmΘno odstra≥ovanΘho adresß°e. M∙╛e to b²t jmΘno adresß°e umφst∞nΘho v souΦasnΘm pracovnφm adresß°i nebo ·plnß adresß°ovß cesta. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdRemoveDir.

procedure Rename(Filename, FileName2: string);
Metoda je pou╛φvßna pro p°ejmenovßnφ souboru v souΦasnΘm pracovnφm adresß°i na vzdßlenΘm hostiteli FTP. Parametr FileName specifikuje jmΘno p°ejmenovßvanΘho souboru. Parametr FileName2 urΦuje novΘ jmΘno souboru. Tyto parametry mohou b²t jmΘno souboru v souΦasnΘm pracovnφm adresß°i nebo cesta a jmΘno souboru umφst∞nΘho kdekoliv v systΘmu. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdRename.

procedure Upload(LocalFile, RemoteFile: string);
Metoda je pou╛φvßna pro odeslßnφ souboru z lokßlnφho poΦφtaΦe na vzdßlenΘho hostitele. Parametr LocalFile specifikuje jmΘno souboru na lokßlnφm poΦφtaΦi, kter² bude odeslßn na vzdßlenΘho hostitele. Parametr RemoteFile specifikuje jmΘno, kterΘ bude mφt odeslan² soubor na vzdßlenΘm hostiteli. Pokud soubor stejnΘho jmΘna ji╛ na vzdßlenΘm hostiteli existuje, pak je p°epsßn. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdUpload.

procedure UploadAppend(LocalFile, RemoteFile: string);
Metoda je pou╛φvßna pro odeslßnφ souboru z lokßlnφho poΦφtaΦe na vzdßlenΘho hostitele. Pokud soubor stejnΘho jmΘna ji╛ existuje, pak nov² soubor je p°ipojen na konec existujφcφho souboru. Parametr LocalFile specifikuje jmΘno souboru na lokßlnφm poΦφtaΦi, kter² bude odeslßn na vzdßlenΘho hostitele. Parametr RemoteFile specifikuje jmΘno, kterΘ bude mφt odeslan² soubor na vzdßlenΘm hostiteli. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdAppend.

procedure UploadRestore(LocalFile, RemoteFile: string; Position: Integer);
Metoda je pou╛φvßna pro pokraΦovßnφ v odesφlßnφ souboru z lokßlnφho poΦφtaΦe na vzdßlenΘho hostitele FTP. Parametr LocalFile specifikuje jmΘno souboru na lokßlnφm poΦφtaΦi, kter² bude odeslßn na vzdßlenΘho hostitele. Parametr RemoteFile specifikuje jmΘno, kterΘ bude mφt odeslan² soubor na vzdßlenΘm hostiteli. P°i pou╛itφ tΘto metody soubor ji╛ musφ na vzdßlenΘm hostiteli existovat. Parametr Position specifikuje od jakΘ pozice soubor bude p°enß╣en. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdAUpRestore.

procedure UploadUnique(LocalFile: string);
Metoda je pou╛φvßna pro odeslßnφ souboru z lokßlnφho poΦφtaΦe na vzdßlenΘho hostitele. JmΘno souboru na lokßlnφm poΦφtaΦi je pou╛ito jako jmΘno souboru na vzdßlenΘm hostiteli. Pokud soubor tohoto jmΘna ji╛ existuje, pak pro soubor je pou╛ito unikßtnφ jmΘno. Parametr LocalFile specifikuje jmΘno souboru na lokßlnφm poΦφtaΦi, kter² bude odeslßn na vzdßlenΘho hostitele. Pokud p°φkaz je ·sp∞╣n², pak je generovßna udßlost OnSuccess, jinak udßlost OnFailure. V obou p°φpadech jako parametr Trans_Type udßlosti je p°edßno cmdAUpload.

Komponenta TNMFTP pou╛φvß nßsledujφcφ udßlosti:

property OnAuthenticationFailed: THandlerEvent;
Udßlost vznikß, kdy╛ vlastnost UserID nebo vlastnost Password je nep°φpustnß. Pokud parametr Handled je nastaven na true, pak autentizace prob∞hne znova k dokonΦenφ p°ihlß╣enφ na vzdßlenΘho hostitele. Pokud parametr Handled je false (implicitn∞), nebo pokud druh² pokus o p°ihlß╣enφ je ne·sp∞╣n², pak je generovßna v²jimka.

property OnAuthenticationNeeded: THandlerEvent;
Vlastnost vznikß, kdy╛ udßlosti UserID a Password jsou prßzdnΘ. Pokud parametr Handled je false, pak je generovßna v²jimka. Jestli╛e Handled nastavφme na true a poskytneme UserID a/nebo Password, pak autentizace prob∞hne znova. Pokud podruhΘ je ne·sp∞╣nß, pak je generovßna v²jimka a p°ipojenφ je zru╣eno. Tato udßlost obvykle nastßvß, kdy╛ je volßna metoda Connect a identifikace u╛ivatele nebo heslo nenφ zadßno.

property OnFailure: TFailureEvent;
Udßlost je generovßna, pokud provßd∞n² FTP p°φkaz je ne·sp∞╣n². Pokud parametr Handled je nastaven na true, pak v²jimka nenφ generovßna. Mß-li hodnotu false, pak bude v²jimka generovßna podruhΘ k chybujφcφmu p°φkazu. Parametr Trans_Type specifikuje chybujφcφ p°φkaz.

property OnListItem: TNMListItem;
Udßlost je generovßna pro ka╛d² prvek p°i rozklßdßnφ seznamu soubor∙. Udßlost je generovßna metodami List a NList.

property OnSuccess: TSuccessEvent;
Udßlost je generovßna, kdy╛ p°φkaz je ·sp∞╣n∞ dokonΦen. Parametr Trans_Type specifikuje dokonΦen² p°φkaz.

property OnTransactionStart: TNotifyEvent;
Udßlost je generovßna v╛dy, kdy╛ data jsou odesφlßna ze vzdßlenΘho hostitele na lokßlnφ poΦφtaΦ pomocφ datovΘho soketu. Tuto udßlost generujφ nßsledujφcφ metody: List, Download, UploadUnique, Upload, NList, DownloadRestore, UploadAppend a UploadRestore.

property OnTransactionStop: TNotifyEvent;
Udßlost je generovßna v╛dy, kdy╛ p°enos dat ze vzdßlenΘho hostitele na lokßlnφ poΦφtaΦ je dokonΦen. Tuto udßlost generujφ nßsledujφcφ metody: List, Download, UploadUnique, Upload, NList, DownloadRestore, UploadAppend a UploadRestore.

property OnUnSupportedFunction: TUnsupportedEvent;
Tato udßlost nastßvß, kdy╛ provßd∞n² p°φkaz FTP je ne·sp∞╣n², proto╛e na vzdßlenΘm hostiteli nenφ implementovßn. Parametr Trans_Type specifikuje tento p°φkaz.


Komponenta TNMURL

V²znamem komponenty TNMURL je zak≤dovat °et∞zec formßtu URL pro p°enosy HTTP a dek≤dovat data URL do Φiteln²ch °et∞zc∙. Tato komponenta nenφ odvozena od TPowersock, ale od TComponent.
Pou╛itφ komponenty je snadnΘ. Jednodu╣e nastavφme vlastnost InputString a potom vlastnost Encode bude obsahovat zak≤dovan² °et∞zec URL a vlastnost Decode bude obsahovat dek≤dovan² °et∞zec. Pokud nastane chyba, pak vznikne udßlost OnError.
Komponenta mß nßsledujφcφ vlastnosti:
 
property Decode: String; Vlastnost obsahuje dek≤dovan² °et∞zec, na zßklad∞ zak≤dovanΘho °et∞zce ve vlastnosti InputString. Pokud InputString nenφ zak≤dovanΘ URL, pak Decode je stejnΘ jako InputString. Public RunTime, ReadOnly
property Encode: String; Vlastnost obsahuje zak≤dovanou kopii URL z vlastnosti InputString. Public RunTime, ReadOnly
property InputString: String; Vlastnost obsahuje zak≤dovanß data k dek≤dovßnφ nebo standardnφ °et∞zec k zak≤dovßnφ.

  1. Pou╛itφ komponenty TNMDayTime si ukß╛eme na p°φklad∞. ZaΦneme v²voj novΘ aplikace. Na formulß° umφstφme tlaΦφtko, TLabel a TNMDayTime. Obsluhu stisku tlaΦφtka budou tvo°it p°φkazy:

  2. void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      NMDayTime1->ReportLevel = Status_Basic;
      NMDayTime1->TimeOut = 5000;
      NMDayTime1->Host = "www.netmastersllc.com";
      Label1->Caption = NMDayTime1->DayTimeStr;
    }
    V tomto p°φklad∞ vlastnost ReportLevel je nastavena na Status_Basic, pro oznamovßnφ zßkladnφho stavu. Vlastnost TimeOut je nastavena na 5000. Vlastnost Host je nastavena na www.netmastersllc.com, kde je spu╣t∞na slu╛ba DayTime. Zφskan² datum a Φas je zobrazen v komponent∞ TLabel.
  3. Ji╛ hotovou aplikaci pou╛φvajφcφ komponentu TNMDayTime nalezneme v adresß°i Program Files\Borland\CBuilder\Examples\Interner\DayTime. ProhlΘdn∞te si tuto aplikaci a sna╛te se pochopit, jak pracuje.
  4. Zahßjφme v²voj novΘ aplikace a na formulß° vlo╛φme TEdit, 2x TLabel, 3x TButton a TNMEcho. Obsluha stisku prvnφho tlaΦφtka je tvo°ena p°φkazem:

  5. void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      NMEcho1->Host = "www.netmastersllc.com";
      NMEcho1->Connect();
    }
    Obsluhu stisku druhΘho tlaΦφtka tvo°φ:
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      NMEcho1->Disconnect();
    }
    a obsluha stisku t°etφho tlaΦφtka:
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
      Label1->Caption = NMEcho1->Echo(Edit1->Text);
      Label2->Caption = FloatToStr(NMEcho1->ElapsedTime);
    }
    Po spu╣t∞nφ aplikace stiskem prvnφho tlaΦφtka se p°ipojφme ke vzdßlenΘmu hostiteli (na╣em p°φpad∞ k www.netmastersllc.com). DruhΘ tlaΦφtko pou╛φvßme k odpojenφ od vzdßlenΘho hostitele po ukonΦenφ prßce. T°etφ tlaΦφtko ode╣le text z editaΦnφho ovladaΦe a vrßcen² text je zobrazen v Label1. Label2 obsahuje kolik Φasu (v milisekundßch) uplynulo do vrßcenφ dat.
  6. Ji╛ hotovou aplikaci pou╛φvajφcφ komponentu TNMEcho nalezneme v adresß°i Program Files\Borland\CBuilder\Examples\Interner\Echo. ProhlΘdn∞te si tuto aplikaci a sna╛te se pochopit, jak pracuje.
  7. Pou╛itφ TNMFinger si ukß╛eme na p°φklad∞, kde na formulß° umφstφme TButton, TMemo a TNMFinger. Obsluhu tlaΦφtka tvo°φ:

  8. void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      NMFinger1->User = "netmasters";
      NMFinger1->Host = "inc-net.com";
      Memo1->Text = NMFinger1->FingerStr;
    }
    Kdy╛ ve spu╣t∞nΘ aplikaci stiskneme tlaΦφtko, pak vlastnost User je nastavena na NetMasters, u╛ivatele pro kterΘho hledßme informace. Host je nastaven na inc-net.com, kde m∙╛eme nalΘzt tyto informace. ZφskanΘ informace jsou zobrazeny v Memo1.
  9. Ji╛ hotovou aplikaci pou╛φvajφcφ komponentu TNMFinger nalezneme v adresß°i Program Files\Borland\CBuilder\Examples\Interner\Finger. ProhlΘdn∞te si tuto aplikaci a sna╛te se pochopit, jak pracuje.
  10. Pou╛itφ komponenty TNMFTP si ukß╛eme na p°φklad∞. ZaΦneme novou aplikacφ a na formulß° umφstφme 3x TEdit, 10x TButton, TMemo, TStringGrid, TStatusBar a TNMFTP. V²znam komponent je tento:
  11. Obsluha stisku prvnφho tlaΦφtka bude tvo°ena p°φkazy:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      if (NMFTP1->Connected)
        NMFTP1->Disconnect();
      else
        {
          NMFTP1->Vendor = NMOS_AUTO;
          NMFTP1->Host = Edit1->Text;
          NMFTP1->UserID = Edit2->Text;
          NMFTP1->Password = Edit3->Text;
          NMFTP1->Connect();
        }
    }
    P°i stisku prvnφho tlaΦφtka, pokud p°ipojenφ je ji╛ z°φzeno, pak metoda Disconnect je pou╛ita k uzav°enφ p°ipojenφ. Pokud p°ipojenφ zatφm z°φzeno nenφ, pak vlastnost Vendor je nastavena na NMOS_AUTO, co╛ zp∙sobuje autodetekci dodavatele FTP (je-li to mo╛nΘ). Vlastnost Host je nastavena na jmΘno hostitele nebo jeho IP adresu zadanou v Edit1. Vlastnost UserID je nastavena na jmΘno u╛ivatele zadanΘ v Edit2. Vlastnost Password je nastavena na hodnotu z Edit3 a metodou Connect je z°φzeno p°ipojenφ.
    Obsluha stisku druhΘho tlaΦφtka je:
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      NMFTP1->List();
    }
    P°i stisku tlaΦφtka je provedena metoda List k zφskßnφ seznamu soubor∙ a adresß°∙ v aktußlnφm adresß°i. Jeliko╛ vlastnost ParseList byla nastavena na true, adresß°ov² seznam je rozlo╛en a umφst∞n do polo╛ek vlastnosti FTPDirectoryList.
    Obsluha stisku t°etφho tlaΦφtka je tvo°ena p°φkazem:
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
      AnsiString TheDir;
      if (InputQuery("Change Directory", "Which directory?", TheDir))
        NMFTP1->ChangeDir(TheDir);
    }
    P°i stisku tlaΦφtka funkce InputQuery je pou╛ita k zφskßnφ jmΘna adresß°e. Kdy╛ stiskneme tlaΦφtko OK, pak metoda ChangeDir se pokusφ zm∞nit aktußlnφ adresß° na specifikovan² adresß°.
    Obsluha stisku ΦtvrtΘho tlaΦφtka je tvo°ena p°φkazem (podobß se p°edchozφ obsluze):
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
      AnsiString TheDir;
      if (InputQuery("Make Directory", "Directory name?", TheDir))
        NMFTP1->MakeDirectory(TheDir);
    }
    Obsluhy stisku pßtΘho a ╣estΘho tlaΦφtka jsou op∞t podobnΘ:
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
      AnsiString TheDir;
      if (InputQuery("Remove Directory", "Directory name?", TheDir))
        NMFTP1->RemoveDir(TheDir);
    }
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
      AnsiString TheFile;
      if (InputQuery("Delete File", "File name?", TheFile))
        NMFTP1->Delete(TheFile);
    }
    Obsluhu sedmΘho tlaΦφtka tvo°φ:
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
      AnsiString OldFile, NewFile;
      if (InputQuery("Rename file", "File to rename?", OldFile))
        if (InputQuery("Rename file", "New file name?", NewFile))
          NMFTP1->Rename(OldFile, NewFile);
    }
    Zde je funkce InputQuery volßna dvakrßt. PoprvΘ zadßvßme jmΘno p°ejmenovßvanΘho souboru a podruhΘ novΘ jmΘno souboru.
    Obsluha stisku osmΘho tlaΦφtka je tvo°ena p°φkazy:
    void __fastcall TForm1::Button8Click(TObject *Sender)
    {
      ShowMessage("After reinitilizing, you must click the authenticate button");
      NMFTP1->Reinitialize();
    }
    Funkce ShowMessage je pou╛ita k zobrazenφ varovßnφ, ╛e po reinicializaci je po╛adovßna autentizace. Obsluha stisku dal╣φho tlaΦφtka je tvo°ena p°φkazy:
    void __fastcall TForm1::Button9Click(TObject *Sender)
    {
      AnsiString AnID, APass;
      if (InputQuery("Authentication needed", "Enter User ID", AnID))
        if (InputQuery("Authentication needed", "Enter Password", APass))
          {
            NMFTP1->DoCommand("USER "+AnID);
            NMFTP1->DoCommand("PASS "+APass);
          }
    }
    Zde funkce InputQuery je op∞t volßna dvakrßt. Prvnφm volßnφm zφskßme identifikaci u╛ivatele a podruhΘ heslo. Dßle je metoda DoCommand pou╛ita k odeslßnφ p°φkazu USER a p°φkazu PASS na vzdßlenΘho hostitele, Φφm╛ se p°ihlßsφme k hostiteli. Toto je jedinß mo╛nost pokraΦovßnφ sezenφ FTP po volßnφ metody Reinitialize.
    Obsluha stisku poslednφho tlaΦφtka je tvo°e p°φkazem:
    void __fastcall TForm1::Button10Click(TObject *Sender)
    {
      ShowMessage(NMFTP1->CurrentDir);
    }
    Zde pouze funkcφ ShowMessage zobrazφme souΦasn² pracovnφ adresß° na vzdßlenΘm hostiteli.
    Nßsleduje obsluha udßlosti OnAuthenticationFailed komponenty NMFTP1:
    void __fastcall TForm1::NMFTP1AuthenticationFailed(bool &Handled)
    {
      AnsiString ThePass, TheID;
      if (MessageDlg("Authentication Failed. Retry?", mtConfirmation,
        TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)
        {
          ThePass = NMFTP1->Password;
          TheID = NMFTP1->UserID;
          InputQuery("Reauthenticate", "Enter User ID", TheID);
          InputQuery("Reauthenticate", "Enter Password", ThePass);
          NMFTP1->Password = ThePass;
          NMFTP1->UserID = TheID;
          Handled = TRUE;
        }
    }
    Kdy╛ autentizace na vzdßlenΘm hostiteli je ne·sp∞╣nß, pak prost°ednictvφm volßnφ funkce InputQuery m∙╛eme zadat novou hodnotu identifikace u╛ivatele a hesla a nastavenφm Handled na true umo╛nφme zopakovßnφ procesu autentizace.
    Obsluha udßlosti OnAuthenticationNeeded °e╣φ nezadßnφ identifikace u╛ivatele nebo hesla a je tvo°ena p°φkazy:
    void __fastcall TForm1::NMFTP1AuthenticationNeeded(bool &Handled)
    {
      AnsiString APass, AnID;
      if (NMFTP1->Password == "")
        if (InputQuery("Password needed", "Enter password: ", APass))
          {
            NMFTP1->Password = APass;
            Handled = TRUE;
          }
        else
          Handled = FALSE;
      if (NMFTP1->UserID == "")
        if (InputQuery("User ID needed", "Enter User ID: ", AnID))
          {
            NMFTP1->UserID = AnID;
            Handled = TRUE;
          }
        else
          Handled = FALSE;
    }
    Obsluhy OnConnect a OnDisconnect jsou jednoduchΘ:
    void __fastcall TForm1::NMFTP1Connect(TObject *Sender)
    {
      Memo1->Lines->Add("Connected");
      Button1->Caption = "Disconnect";
    }
    void __fastcall TForm1::NMFTP1Disconnect(TObject *Sender)
    {
      Memo1->Lines->Add("Disconnected");
      Button1->Caption = "Connect";
    }
    Obsluhu udßlosti OnFailure tvo°φ p°φkazy (do komponenty Memo je p°idßna informace o chybujφcφm p°φkazu):
    void __fastcall TForm1::NMFTP1Failure(bool &Handled, TCmdType Trans_Type)
    {
      switch(Trans_Type)
      {
        case cmdChangeDir: Memo1->Lines->Add("ChangeDir failed");
        case cmdMakeDir: Memo1->Lines->Add("MakeDir failed");
        case cmdDelete: Memo1->Lines->Add("Delete failed");
        case cmdRemoveDir: Memo1->Lines->Add("RemoveDir failed");
        case cmdList: Memo1->Lines->Add("List failed");
        case cmdRename: Memo1->Lines->Add("Rename failed");
        case cmdUpRestore: Memo1->Lines->Add("UploadRestore failed");
        case cmdDownRestore: Memo1->Lines->Add("DownloadRestore failed");
        case cmdDownload: Memo1->Lines->Add("Download failed");
        case cmdUpload: Memo1->Lines->Add("Upload failed");
        case cmdAppend: Memo1->Lines->Add("UploadAppend failed");
        case cmdReInit: Memo1->Lines->Add("Reinitialize failed");
        case cmdAllocate: Memo1->Lines->Add("Allocate failed");
        case cmdNList: Memo1->Lines->Add("NList failed");
        case cmdDoCommand: Memo1->Lines->Add("DoCommand failed");
        case cmdCurrentDir: Memo1->Lines->Add("CurrentDir failed");
      }
    }
    Nßsleduje n∞kolik udßlosti informujφcφch o poΦtu p°enesen²ch slabik a zahßjenφ nebo ukonΦenφ prßce:
    void __fastcall TForm1::NMFTP1PacketRecvd(TObject *Sender)
    {
      StatusBar1->SimpleText = "Received "+IntToStr(NMFTP1->BytesRecvd)+" bytes of
            "+IntToStr(NMFTP1->BytesTotal)+" total";
    }
    void __fastcall TForm1::NMFTP1PacketSent(TObject *Sender)
    {
      StatusBar1->SimpleText = "Sent "+IntToStr(NMFTP1->BytesSent)+" bytes of
            "+IntToStr(NMFTP1->BytesTotal)+" total";
    }
    void __fastcall TForm1::NMFTP1TransactionStart(TObject *Sender)
    {
      Memo1->Lines->Add("Data transfer start");
    }
    void __fastcall TForm1::NMFTP1TransactionStop(TObject *Sender)
    {
      Memo1->Lines->Add("Data transfer end");
    }
    Obsluhu udßlosti OnSuccess tvo°φ:
    void __fastcall TForm1::NMFTP1Success(TCmdType Trans_Type)
    {
      int I;
      switch(Trans_Type)
      {
        case cmdList:
        {
          for (I = 0; I <= (StringGrid1->ColCount - 1);I++)
            StringGrid1->Cols[I]->Clear();
          StringGrid1->RowCount = NMFTP1->FTPDirectoryList->name->Count;
          StringGrid1->ColCount = 4;
          StringGrid1->Cells[0][0] = "Filename";
          StringGrid1->Cells[1][0] = "File Size";
          StringGrid1->Cells[2][0] = "Modified Date";
          StringGrid1->Cells[3][0] = "Attributes";
          for (I = 0; I <= (NMFTP1->FTPDirectoryList->name->Count - 1); I++)
          {
            StringGrid1->Cells[0][I+1] = NMFTP1->FTPDirectoryList->name->Strings[I];
            StringGrid1->Cells[1][I+1] = NMFTP1->FTPDirectoryList->Size->Strings[I];
            StringGrid1->Cells[2][I+1] = NMFTP1->FTPDirectoryList->ModifDate->Strings[I];
            StringGrid1->Cells[3][I+1] = NMFTP1->FTPDirectoryList->Attribute->Strings[I];
          }
        }
        case cmdChangeDir:
        {
          Memo1->Lines->Add("ChangeDir successful");
          NMFTP1->List();
        }
        case cmdMakeDir: Memo1->Lines->Add("MakeDir successful");
        case cmdRemoveDir: Memo1->Lines->Add("RemoveDir successful");
        case cmdDelete: Memo1->Lines->Add("Delete successful");
        case cmdRename: Memo1->Lines->Add("Rename successful");
        case cmdReInit: Memo1->Lines->Add("Reinitialize successful");
        case cmdCurrentDir: Memo1->Lines->Add("CurrentDir successful");
      }
    }
    Poslednφ obsluhou udßlosti je OnUnSupportedFunction:
    void __fastcall TForm1::NMFTP1UnSupportedFunction(TCmdType Trans_Type)
    {
      switch(Trans_Type)
        {
          case cmdChangeDir: Memo1->Lines->Add("ChangeDir not supported by this server");
          case cmdMakeDir: Memo1->Lines->Add("MakeDir not supported by this server");
          case cmdDelete: Memo1->Lines->Add("Delete not supported by this server");
          case cmdRemoveDir: Memo1->Lines->Add("RemoveDir not supported by this server");
          case cmdList: Memo1->Lines->Add("List not supported by this server");
          case cmdRename: Memo1->Lines->Add("Rename not supported by this server");
          case cmdUpRestore: Memo1->Lines->Add("UploadRestore not supported by this server");
          case cmdDownRestore: Memo1->Lines->Add("DownloadRestore not supported by this server");
          case cmdDownload: Memo1->Lines->Add("Download not supported by this server");
          case cmdUpload: Memo1->Lines->Add("Upload not supported by this server");
          case cmdAppend: Memo1->Lines->Add("UploadAppend not supported by this server");
          case cmdReInit: Memo1->Lines->Add("Reinitialize not supported by this server");
          case cmdAllocate: Memo1->Lines->Add("Allocate not supported by this server");
          case cmdNList: Memo1->Lines->Add("NList not supported by this server");
          case cmdDoCommand: Memo1->Lines->Add("DoCommand not supported by this server");
          case cmdCurrentDir: Memo1->Lines->Add("CurrentDir not supported by this server");
      }
    }
    Tφm je aplikace hotova a m∙╛eme ji vyzkou╣et.
  12. Ji╛ hotovou aplikaci pou╛φvajφcφ komponentu TNMFTP nalezneme v adresß°i Program Files\Borland\CBuilder\Examples\Interner\Ftp. ProhlΘdn∞te si tuto aplikaci a sna╛te se pochopit, jak pracuje.
  13. ZaΦneme v²voj novΘ aplikace. Na formulß° umφstφme komponenty 2x TEdit, 2x TButton a TNMURL. Obsluha stisku prvnφho tlaΦφtka je tvo°ena p°φkazy (dek≤dovßnφ):

  14. void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      NMURL1->InputString = Edit1->Text;
      Edit2->Text = NMURL1->Encode;
    }
    P°i stisku tlaΦφtka je text z Edit1 ulo╛en do vlastnosti InputString, je zak≤dovßn a ulo╛en do Edit2. Obsluhu stisku druhΘho tlaΦφtka tvo°φ:
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      NMURL1->InputString = Edit1->Text;
      Edit2->Text = NMURL1->Decode;
    }
    Obsluha pracuje podobn∞ jako p°edchozφ obsluha, pouze mφsto zak≤dovßnφ provßdφ dek≤dovßnφ. Pro komponentu TNMURL vytvo°φme je╣t∞ obsluhu OnError:
    void __fastcall TForm1::NMURL1Error(TObject *Sender,
         AnsiString Operation, AnsiString ErrMsg)
    {
      ShowMessage(Operation+": "+ErrMsg);
    }
    Chyba nastßvß, pokud zak≤dovßnφ nebo dek≤dovßnφ °et∞zce nelze provΘst. Obsluha chyby zobrazuje chybovou zprßvu.
  15. Ji╛ hotovou aplikaci pou╛φvajφcφ komponentu TNMURL nalezneme v adresß°i Program Files\Borland\CBuilder\Examples\Interner\Url. ProhlΘdn∞te si tuto aplikaci a sna╛te se pochopit, jak pracuje.
11. Komponenty NetMasters I