Разработка приложений для Internet

       

Метод OnDblclkFtpList


В списке IDC_FTP_LIST показываются имена файлов и каталогов сервера FTP. Файлы выделяются пиктограммой

, а каталоги пиктограммой
 и строкой Dir в столбце Length. Чтобы вы имели возможность просмотра не только того каталога, с которым вас по умолчанию соединил сервер FTP, но также и других вложенных каталогов, мы предусмотрели метод OnDblclkFtpList.

¨ Наше приложение не меняет текущий каталог сервера FTP. Для этого предназначен метод SetCurrentDirectory класса CFtpConnection. Изменяется только каталог, в котором осуществляется поиск файлов и других каталогов

Метод OnDblclkFtpList вызывается когда пользователь выполняет двойной щелчок левой клавишей мыши по имени каталога или имени файла. В качестве параметров методу OnDblclkFtpList передаются указатель pNMHDR на структуру типа NMHDR и указатель pResult на переменную типа LRESULT.

Рассмотрим метод OnDblclkFtpList более подробно. Сначала он блокирует список IDC_FTP_LIST, вызывая метод EnableWindow с параметром FALSE:

CString   sSelItem;     // Название каталога

// Блокируем список IDC_FTP_LIST

m_FtpList.EnableWindow(FALSE);

Затем с помощью метода GetItemCount мы определяем количество элементов в списке IDC_FTP_LIST и записываем его во временную переменную iTotalNumber типа int:

iTotalNumber = m_FtpList.GetItemCount();

Далее мы пытаемся определить элемент, который выбран из списка. К сожалению мы не обнаружили простого способа выполнить эту задачу. Поэтому последовательно проверяем все элементы списка до тех пор, пока не найдем элемент, у которого установлен атрибут LVIS_SELECTED, означающий, что он выбран.

Для определения атрибутов элемента списка вызываем метод GetItemState. В качестве первого параметра методу GetItemState указывается индекс элемента, атрибуты которого надо определить, а в качестве второго - комбинацию атрибутов состояние которых нужно узнать. В нашем случае в качестве второго параметра фигурирует только константа LVIS_SELECTED, так как нас интересует только выбран данный элемент или нет:


// Определяем, какой объект списка выбран



for(int i = 0; i < iTotalNumber; i++)

{

  if(LVIS_SELECTED == m_FtpList.GetItemState(i,LVIS_SELECTED))

  {

     . . .

     break;

  }

}

Если метод m_FtpList.GetItemState( i, LVIS_SELECTED )) возвращает значение LVIS_SELECTED, значит элемент с индексом i выбран из списка. В этом случае определяем имя соответствующего объекта и его размер, считывая их непосредственно из первой и второй колонки списка:

// Определяем название выбранного элемента списка

// (имя файла или каталога)

sSelItem = m_FtpList.GetItemText( i, 0 );

// Считываем данные из колонки Length

sLength_Dir = m_FtpList.GetItemText( i, 1 );

Если вместо длины файла во второй колонке записана строка Dir, значит из списка выбран каталог. Тогда мы добавляем название этого каталога к концу строки, содержащей текущий каталог сервера FTP.

В противном случае вы выбрали из списка не каталог, а файл и на экран выводится предупреждающее сообщение, о том что вы выбрали файл с определенным именем:

if(sLength_Dir == "Dir") // Выбран каталог

   sCurentDirectory  = sCurentDirectory + "/" + sSelItem;

else                     // Выбран файл

   AfxMessageBox("You select file " + sSelItem);

После этого изменяем форму курсора и вызываем метод DirectoryView, который считывает имена объектов, расположенных в каталоге sCurentDirectory и отображает их в списке диалоговой панели приложения.

Чтобы изменить форму курсора мы создаем объект wait класса CWaitCursor. Когда при выходе из метода OnDblclkFtpList этот объект удаляется, курсор автоматически восстанавливает свою форму:

   . . .

   // Меняем форму курсора (курсор “ожидание”)

   CWaitCursor wait;  

   // Отображаем содержимое выбранного каталога

   DirectoryView();

}

Затем в поле IDC_STATUS отображается новый путь каталога и снимается блокировка со списка, так что мы опять можем выбирать из него файлы и каталоги:

// Отображаем на диалоговой панели новый путь каталога

m_Status.SetWindowText(sCurentDirectory);

// Снимаем блокировку списка IDC_FTP_LIST

m_FtpList.EnableWindow(TRUE);

В завершении метода OnDblclkFtpList мы записываем по адресу pResult нулевое значение, которое означает, что метод успешно завершен:

*pResult = 0;


Содержание раздела