Консультация № 177276
16.03.2010, 00:47
43.65 руб.
0 5 1
Уважаемые эксперты помогите в написание программы:Программа создающая оглавление диска, то есть она может создать оглавление любого диска на который мы укажем и выведет на экран, но учитель требует программу работающую через форму, а не через консоль.

Обсуждение

Неизвестный
16.03.2010, 00:52
общий
sagir1000:
Операционная система, среда разработки, средства разработки, требования к интерфейсу, требования к выводу результата?
Неизвестный
16.03.2010, 01:16
общий
VerenaОС-XP,с++builder, программа должна работать через форму - т.е. должно быть на форме предусмотрено: ввод названия диска, кнопка запускающая построение оглавления и вывод оглавления диска(выводим оглавление диска в алфавитном порядке.
Неизвестный
16.03.2010, 06:40
общий
это ответ
Здравствуйте, sagir1000.

Надеюсь, простые программы писать в c++ builder-е умеете?
Если да, то есть чудесная ShellApi-функция: SHBrowseForFolder, которая выдаёт список папок в своём готовом окошке, при определённых флагах вроде бы можно сделать так, чтобы можно было выбрать диск. В обычном состоянии сразу в окне содержит дерево с дисками.

В приложении добавлю функцию с коллбаком, которая открывается прям на заданной папке.

Приложение:
BOOL BrowseForFolder(TCHAR *pszPath, HWND hWnd)
{
BROWSEINFO bi;
LPITEMIDLIST pil;
bi.hwndOwner = hWnd;// это "хозяин" окна, окно будет модально по отношению к нему; может быть NULL
bi.pidlRoot = NULL;
bi.pszDisplayName = pszPath;
bi.lpszTitle = "";//"Select destination directory";
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowsePathProc;
bi.iImage = 0;
bi.lParam = (long)pszPath;
pil = SHBrowseForFolder(&bi);
if(pil)
{
SHGetPathFromIDList(pil, pszPath);
return TRUE;
}
return FALSE;
}
/// callbak for folder_browser
INT CALLBACK BrowsePathProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)
{ TCHAR szDir[MAX_PATH];
static HWND hTitle;
switch(uMsg)
{
case BFFM_INITIALIZED:
if(((char*)pData)[strlen((char*)pData)-1]=='\\')
strrchr((char*)pData,'\\')[0]=0;
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
break;
case BFFM_SELCHANGED:
if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir))
{
SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);
}
break;
}
return 0;
}
Неизвестный
19.03.2010, 20:31
общий
Сандров Алекс, извините не могу понять как работает ваш код, не можете его прокоментировать?
Неизвестный
22.03.2010, 06:04
общий
Могу, а что именно непонятно?
Кстати, я вроде 2 примера писал, и текста было больше в изначальном посте.
1 пример работы через ShellAPI, второй через Win32API.

То, что в приложении, используется просто:
1. Вставляем этот код к себе в программу.
2. Линкуем к проекту Shlwapi.lib (возможно, в проектах С++ Builder они автоматически прилинковываются)
3. Вызываем в нужном месте BrowseForFolder, указывая изначальный путь, можно пусто, и окно-родителя, можно NULL.
Форма ответа