|
|
Ответов: 0
|
25-02-12 07:01
|
|
|
|
Ответов: 0
|
16-01-12 20:13
|
|
|
|
Ответов: 1
|
09-01-12 11:23
|
|
   Web - программирование
|
|
|
   Программирование под ОС
|
|
|
   Web - технологии
|
|
|
   Базы Данных
|
|
|
|
Программирование под ОС / C - C++ /
| |
| | |
Возможно вас заинтересует
|
|
FTP клиент своими руками
Здраствуй, сечас я покажу, как в CBuilder можно создать свой простой FTP-клиент, похожий пример можно найти в документации C++Builder Developnet's Guilde.
Для этого нам понадобиться компонент NMFTP (со вкладки FastNet), кинь его на форму и для удобства дай ему имя MyFtp (хотя, в принципе, это на твое усмотрение). Нам еще будут нужны OpenDialog; SaveDialog; ImageList; - тоже кинь их на форму. Для ввода логина и пароля, а так же адреса сервера нам пригодиться три TextEdit.
Не забудь, так же, про три стандартные кнопки - Конект (дай имя StartButton); Стоп (присвой имя StopButton); Загрузка (задай имя - UploadButton).
Кроме этого нам надо будет где-то отображать файлы, которые находяться на сервере, для этого лучше всего подойдет TreeView (его найдешь на вкладке Win32) и также дадим ему свое имя, предположим - MyTree.
Задаем имена для компонентов - мы только ради удобства, если же тебе удобней использовать стандартные-длинные имена, то можешь использовать их (только не забудь, что в моем коде будут имена не стандартные). Интерфейс программы, у меня вышел такой:
Просто, но со вкусом =) . Компоненту Panel, на котором у меня разместились кнопки и TextEdit'ы, я присвоил значение Align=alTop. А для компонента TreeView Align=alClient.
Итак, первое что мы сделаем - это напишим событие onClick для кнопки конект:
MyFtp->Host = Edit3->Text; // Отправляем адрес сервера
MyFtp->UserID = Edit1->Text; //Отправляем логина
MyFtp->Password = Edit2->Text; //Отправляем пароль
MyFtp->Connect(); // И конект... пошло соединение...
StartButton->Enabled = false; //Запрещаем повторное нажатие кнопки конект
StopButton->Enabled = true; //Разрешаем нажатие кнопки стоп
MyTree->Items->Clear(); //Очищаем список файлов...
DoList(); //Запускаем функцию получения файлов и их отображания, ее мы рассмотрим ниже:
void __fastcall TForm1::DoList() //Итак, поехали:
{
TTreeNode *Temp, *Root;
int i;
TCursor Save_Cursor = Screen->Cursor;
Screen->Cursor = crHourGlass; // Запускаем песочные часики
Root = MyTree->Selected; //Находим директорию
MyFtp->List();
MyTree->Items->BeginUpdate(); //Получаем наличие папок и файлов:
for(i=0;i<MyFtp->FTPDirectoryList->Attribute->Count;i++)
{
Temp =MyTree->Items->AddChild (Root,MyFtp->FTPDirectoryList->name->Strings[i]);
if((MyFtp->FTPDirectoryList->Attribute->Strings[i])[1] == 'd')
{
//Папки:
Temp->ImageIndex = 0;
Temp->SelectedIndex = 0;
}
else
{
//Файлы:
Temp->ImageIndex = 1;
Temp->SelectedIndex = 1;
}
}
MyTree->AlphaSort();
MyTree->Items->EndUpdate(); //Заканчиваем обонвление списка
if(Root)
Root->Expand(true);
Screen->Cursor = Save_Cursor;
}
Создадим событие для кнопки СТОП:
MyFtp->Disconnect(); //Разъединение
StartButton->Enabled = true; //Кнопка Конект сного доступна
StopButton->Enabled = false; //Кнопка Стоп запрещена
Кнопка Загрузка:
if(OpenDialog1->Execute()) //Открываем диалог и ищем файл для закачки
{
MyFtp->Upload (OpenDialog1->FileName,ExtractFileName(OpenDialog1->FileName)); // И, собственно, загружаем файл.
}
Наверно, тебя мучает вопрос (если нет, то задай его): на кой бес, на форме компонент ImageList ?!
Отвечаю - он-то и поможет нам визуально разобрать - где на MyTree файл, а где папка.
Необходимо в ImageList подгрузить два изображения, первый это картинка папки, второй картинка файла. После этих нехитрых манипуляций, выраем наш MyTree (TreeView) и в Events->Image->Укажите ImageList с изображениями. (вообще-то ImageList у нас один, так что не запутаетесь).
Далее мы проработаем интересную штуку - во время двойного клика на TreeView (MyTree) мы начнем сохранять выбраный файл, создайте событие OnDblClick и начнем:
if(MyTree->Selected->ImageIndex == 0) //Если выбрана папка - то меняем диреторию:
{
if(MyTree->Selected->Count == 0)
{
MyFtp->ChangeDir(GetPath()); //Смена директрий, тут встречается еще одна функция - GetPath, она будет рассмотрена ниже
DoList(); //Отображаем файлы новой директории
}
}
else //Если файл, то сохраним его:
{
AnsiString RemoteFile; //Объявляем переменную RemoteFile
RemoteFile = GetPath(); //погоди.. мы рассмотрим эту функцию ниже
SaveDialog->FileName = MyTree->Selected->Text; //Даем имя файлу
if(SaveDialog->Execute()) //Запукаем диалог и ищем путь, куда сохранять файл
MyFtp->Download(RemoteFile, SaveDialog->FileName); //Сохранено
}
И как писалось в комментариях, функция GetPath(), комментировать я его не буду, ибо тут и все и без меня понятно:
AnsiString __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;
}
Так, теперь мы должны проработать изменение картинок MyTree. Давай создаим новое событие OnCompare :
if(Node1->ImageIndex > Node2->ImageIndex) //Просто меняем картинки:
Compare = 1;
else
if(Node1->ImageIndex == Node2->ImageIndex)
Compare = CompareStr(Node1->Text, Node2->Text);
else
Compare = -1;
Ну, что, вот почти и готово, единственно - осталось рассписать все ошибки, что лишний раз не доводить пользователя до сердечного приступа. Для этого создадим для MyFtp (NMFTP) событие OnFailure (что в переводе с англ. - неспособность):
switch(Trans_Type)
{
case cmdChangeDir: ShowMessage("ChangeDir failed");
case cmdMakeDir: ShowMessage("MakeDir failed");
case cmdDelete: ShowMessage("Delete failed");
case cmdRemoveDir: ShowMessage("RemoveDir failed");
case cmdList: ShowMessage("List failed");
case cmdRename: ShowMessage("Rename failed");
case cmdUpRestore: ShowMessage("UploadRestore failed");
case cmdDownRestore: ShowMessage("DownloadRestore failed");
case cmdDownload: ShowMessage("Download failed");
case cmdUpload: ShowMessage("Upload failed");
case cmdAppend: ShowMessage("UploadAppend failed");
case cmdReInit: ShowMessage("Reinitialize failed");
case cmdAllocate: ShowMessage("Allocate failed");
case cmdNList: ShowMessage("NList failed");
case cmdDoCommand: ShowMessage("DoCommand failed");
case cmdCurrentDir: ShowMessage("CurrentDir failed");
}
Если будет время и желание можно перевести на русский, но по-мойму так лучше (или мне просто лень переводить самому). Так или иначе - клиент готов, его можно запускать и тестить. Только если чесно - скорость работы такого стандартного FTP клиента оставляют желать лучшего. Если возникнут какие либо вопросы - милости просим на наш форум.
Последние статьи: Программирование под ОС / C - C++ /
| |
| | |
Сейчас я покажу как можно написать простой проигрыватель CD дисков. Для начала разместим все нужные компоненты на форме (см. рисунок)... подробнее
|
Кол. просмотров: общее - 5921 сегодня - 1
|
|
Продолжаю тему клонирования программ darkamstera на Delphi в С++Builder. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке всеми-любимого InternetExplorer. Наш зверь сможет ходить по URL... подробнее
|
Кол. просмотров: общее - 4628 сегодня - 1
|
|
Выводим информацию о нашей родненькой системе. Для получения большей части информации мы будем использовать обширные функции, это не так сложно, как может показатся с первого взгляда и вообще код довольно простой и примитивный, так что покапавшись в нем пару минут - можно в легкостью разобраться что к чему, зачем и как... подробнее
|
Кол. просмотров: общее - 4426 сегодня - 1
|
|
Здраствуй, сечас я покажу, как в CBuilder можно создать свой простой FTP-клиент, похожий пример можно найти в документации C++Builder Developnets Guilde... подробнее
|
Кол. просмотров: общее - 5762 сегодня - 1
|
|
Здраствуй, в этой статье я расскажу про способы получения e-mail писем и их прочтения.
Для начала давайте составим интерфейс будущей программы Вот, что у меня вышло... подробнее
|
Кол. просмотров: общее - 4489 сегодня - 1
|
|
|
|