[ Pobierz całość w formacie PDF ]
.W naszymprzyk³adzie katalogi odró¿niane s¹ od plików na podstawie indeksu ImageIndex,przy czym tak siê szczêœliwie sk³ada, i¿ katalogi, maj¹ce pierwszeñstwo przedplikami maj¹ jednoczeœnie wiêksz¹ wartoœæ tego indeksu.Zatem obs³uga zdarzeniaOnCompare rozpoczyna siê od porównania wspomnianego indeksu u obydwu wêz³Ã³w idopiero gdy porównanie to nie jest rozstrzygaj¹ce, porównywane s¹ nazwy obydwuwêz³Ã³w.Kolejnym zagadnieniem jest oprogramowanie dwukrotnego klikniêcia w któr¹œ zwyœwietlanych pozycji listy MyTree.Mo¿liwe s¹ trzy nastêpuj¹ce przypadki:je¿eli pozycja reprezentuje plik, nale¿y rozpocz¹æ jego œci¹ganie;je¿eli pozycja reprezentuje katalog, którego zawartoœæ nie znajduje siêaktualnie w pamiêci listy, nale¿y zawartoœæ tê pobraæ;je¿eli pozycja reprezentuje „za³adowany” katalog, nale¿y „rozwin¹æ” (expand)jego zawartoœæ.Standardow¹ reakcj¹ listy na dwukrotne klikniêcie jest rozwijanie wskazanejpozycji do listy jej wêz³Ã³w potomnych, zatem jedynie trzeci z wymienionychprzypadków nie wymaga³by oprogramowania; by uwzglêdniæ wszystkie trzyprzypadki, nale¿y wiêc oprogramowaæ zdarzenie OnDblClick w sposób pokazany nawydruku 12.7.Wydruk 12.7 Obs³uga dwukrotnego klikniêcia w pozycjê listy MyTreevoid __fastcall TForm1::MyTreeDblClick(TObject *Sender){if(MyTree->Selected->ImageIndex == 0){if(MyTree->Selected->Count == 0){MyFtp->ChangeDir(GetPath());DoList();}}else{AnsiString RemoteFile;RemoteFile = GetPath();SaveDialog->FileName = MyTree->Selected->Text;if(SaveDialog->Execute())MyFtp->Download(RemoteFile, SaveDialog->FileName);}}Pierwsza z instrukcji if sprawdza, czy mamy do czynienia z katalogiem — je¿elitak, to wykonywany jest kolejny test: sprawdza siê mianowicie liczbê wêz³Ã³wpotomnych wybranej pozycji i je¿eli liczba ta równa jest zero, byæ mo¿eistniej¹ nieza³adowane jeszcze jej pozycje potomne, nale¿y wiêc pobraæzawartoœæ reprezentowanego przez ni¹ katalogu.Je¿eli wybrana pozycja reprezentuje plik, inicjuje siê jego œci¹ganie, pouprzednim ustaleniu docelowej nazwy, pod któr¹ ma zostaæ zapisany.Œci¹gniêcie pliku — lub pobranie zawartoœci katalogu — reprezentowanego przezwybran¹ pozycjê listy nie by³oby niczym niezwyk³ym, gdyby nie fakt, i¿ pozycjelisty s¹ wyodrêbnionymi nazwami plików (katalogów), tymczasem metoda DownLoad()wymaga okreœlenia pe³nej œcie¿ki dostêpu (tak przynajmniej jest bezpieczniej,bowiem nazwy „relatywne” odnoszone s¹ do bie¿¹cego katalogu).Utworzeniekompletnej œcie¿ki dla danej pozycji listy realizowane jest przez metodêGetPath() formularza o treœci prezentowanej na wydruku 12.8.Deklaracjê tejmetody (w postaci AnsiString __fastcall GetPath();) nale¿y dopisaæ dopublicznej czêœci deklaracji formularza w pliku Unit1.h.Wydruk 12.8 Tworzenie kompletnej œcie¿ki dla wybranej pozycji listyAnsiString __fastcall TForm1::GetPath(){TTreeNode *Base, *Temp;TStringList *TempList = new TStringList();int i;AnsiString ToReturn;Base = MyTree->Selected;TempList->Add(Base->Text);Temp = Base->Parent;while(Temp){TempList->Add(Temp->Text);Temp = Temp->Parent;}for(i=TempList->Count-1;i>-1;i--){ToReturn += "/" + TempList->Strings[i];}return ToReturn;}Poczynaj¹c od wybranej pozycji, pod¹¿a siê tu „w górê” hierarchii wêz³Ã³w —nazwa ka¿dego napotkanego wêz³a stanowi kolejny cz³on œcie¿ki, oddzielanyznakiem „/”.Zamykanie sesji oraz przesy³anie plikówZakoñczenie po³¹czenia z serwerem FTP nastêpuje w wyniku klikniêcia w przycisk„Stop”:void __fastcall TForm1::StopButtonClick(TObject *Sender){MyFtp->Disconnect();StartButton->Enabled = true;StopButton->Enabled = false;}Po zamkniêciu po³¹czenia za pomoc¹ metody Disconnect() nastêpuje zablokowanieprzycisku „Stop” i odblokowanie przycisku „Start”.Przesy³anie pliku (upload) jest czynnoœci¹ zgo³a nieskomplikowan¹ i nastêpuje wwyniku klikniêcia w przycisk „Przeœlij”:void __fastcall TForm1::UploadButtonClick(TObject *Sender){if(OpenDialog1->Execute()){MyFtp->Upload(OpenDialog1->FileName,ExtractFileName(OpenDialog1->FileName));}}Plik do przes³ania wybierany jest tutaj za pomoc¹ standardowego dialoguotwarcia pliku.Jego specyfikacja znajduje siê pod w³aœciwoœci¹ FileName tego¿dialogu.Zwróæ uwagê, i¿ plik zapisywany jest na serwerze pod swoj¹ oryginaln¹nazw¹ w bie¿¹cym katalogu — funkcja ExtractFileName() usuwa ze specyfikacjipliku ewentualn¹ œcie¿kê dostêpu.PodsumowanieNiniejszy rozdzia³ stanowi kolejne œwiadectwo niezwyk³ej u¿ytecznoœci narzêdziatypu RAD jakim jest C++Builder; skomplikowane poniek¹d technologie internetowedostêpne s¹ dla programisty niemal na wyci¹gniêcie rêki, a to za spraw¹komponentów udostêpniaj¹cych funkcjonalnoœæ podstawowych protoko³Ã³wkomunikacyjnych
[ Pobierz całość w formacie PDF ]