Автор
|
Тема: Кнопочка "Обзор"...
|
Vovan |
опубликован 29-01-2002 15:58 MSK
Как мне вывести стандартное окно "обзор", и что бы оно возвратило в программу путь к каталогу. Извините за дурацкие вопросы, в MSDN всё написано, но у меня его нету, заодно посоветуйте где его взять, может он на дисках продаёться? Заранее благодарен.
|
purpe
|
опубликован 29-01-2002 16:28 MSK
в разделе Delphi есть статейка:http://www.sources.ru/delphi/delphi_browser_for_all.shtml там внизу есть ссылочки: http://msdn.microsoft.com/library/psdk/shellcc/shell/Functions/SHBrowseForFolder.htm http://msdn.microsoft.com/library/psdk/shellcc/shell/Shell_basics/Folder_ID.htm |
sergeyMJ
|
опубликован 29-01-2002 16:30 MSK
Я купил MSDN на горбушке за 600 руб (4 диска) Раньше мне предлагали там же за 400 другие ребята |
Muran
|
опубликован 29-01-2002 16:47 MSK
Вообще-то MSDN стоит 220р за 4 диска. |
purpe
|
опубликован 29-01-2002 16:54 MSK
давайте не будем разводить демагогию по поводу ценообразования ...
|
Kresan
|
опубликован 29-01-2002 17:20 MSK
В модуле Builder 5.0 под названием FileCtrl.hpp есть функция SelectDirectory ( AnsiString Caption, WideString Root, AnsiString &SelectedDirectory ). Вот и всё. |
Drunkard
|
опубликован 31-01-2002 04:40 MSK
Долго базарить не буду. Я это на API в Borlande 5.0 делаю так:Компиляцию под Borlandoм ведешь обязательно включив галочку OLE #include <shlobj.h> // Borland 5.0 ее не знает, поэтому я определяю #define BIF_EDITBOX 0x0010 void Browse HWND,char*,int,UINT,int);//Виндовый диалог выбора папки //Обьявляешь глобальной переменную IMalloc *pMalloc; В Main функции пишешь { HRESULT hRes; //Здесь всякая своя хрень CoInitialize(NULL); hRes=CoGetMalloc(1,&pMalloc); if(!SUCCEEDED(hRes)) { MessageBox(hwnd,"Windows не выдала указатель на IMalloc.","",MB_SYSTEMMODAL|MB_OK); CoUninitialize(); DestroyWindow(hwnd); return 0; }; // Здесь опять всякая хрень } // Создаешь свой диалог, в котором есть редактируемое поле, допустим его идентиф IDE_PAPKA // В этом диалоге у тебя еще три кнопки 1) Browse, 2) ОК, 3) Cancel // В процедуре диалога должны быть примерно такие строки case WM_INITDIALOG: SetDlgItemText(hwnd,IDE_PAPKA,""); case WM_COMMAND: switch (LOWORD(wParam)) { case IDB_BROWSE: Browse(hwnd,"Выберите основную папку.",CSIDL_DRIVES,BIF_EDITBOX|BIF_RETURNONLYFSDIRS,IDE_PAPKA); // Вот после этого вызова в редактируемом поле IDE_PAPKA у тебя появится путь к папке return TRUE; case IDCANCEL: EndDialog(hwnd,TRUE); return TRUE; case IDOK: GetWindowText(GetDlgItem(hwnd,IDE_PAPKA),StrPap,MAX_PATH-1); //После этого путь будет сидеть в строке char StrPap[MAX_PATH] // Стандартная функция придуманная не мною, а списанная с книжки :))) void Browse(HWND hwnd,char* Title,int RootFolder,UINT Flag,int IdDialog) { static BROWSEINFO bi; LPSTR lpBuffer; LPITEMIDLIST pidlPrograms,pidlBrowse; lpBuffer=(LPSTR)pMalloc->Alloc(MAX_PATH); if(MAX_PATH!=pMalloc->GetSize(lpBuffer)) { MessageBox(hwnd,"Затрудняюсь получить блок памяти.","",MB_SYSTEMMODAL | MB_OK); return; }; if(!SUCCEEDED(SHGetSpecialFolderLocation(hwnd,RootFolder,&pidlPrograms))) { pMalloc->Free(lpBuffer); MessageBox(hwnd,"Затрудняюсь обнаружить корневую папку.","",MB_SYSTEMMODAL | MB_OK); return; }; bi.hwndOwner=hwnd; bi.pidlRoot=pidlPrograms; bi.pszDisplayName=lpBuffer; bi.lpszTitle=Title; bi.ulFlags=Flag; bi.lpfn=NULL; bi.lParam=0; pidlBrowse=SHBrowseForFolder(&bi); if(pidlBrowse!=NULL) { if(SHGetPathFromIDList(pidlBrowse,lpBuffer)) SetDlgItemText(hwnd,IdDialog,lpBuffer); pMalloc->Free(lpBuffer); } else pMalloc->Free(lpBuffer); }
|
Drunkard
|
опубликован 31-01-2002 04:43 MSK
void Browse ( HWND,char*,int,UINT,int);//Виндовый диалог выбора папкиТам куда-то подевалась открывающая скобка |
ADK
|
опубликован 31-01-2002 05:31 MSK
2Drunkard: так много кода для SHBrowseForFolder... Хе У меня больше 10 строк никак не выходило. |
Drunkard
|
опубликован 31-01-2002 10:48 MSK
ADK< Покажи - поучусь. Только чур на API. :) |
Drunkard
|
опубликован 31-01-2002 15:39 MSK
ADK< Жду 10 строк кода. :) Если в стиле "Читай MSDN" ,то спасибо. Это в прогу не подошьешь. У меня один знакомый тоже проги в 10 строк пишет. Да ты его знаешь, это Вася Пупкин. Он просто переводы строки в исходники не вставляет. :) Хочу скопировать твой код и вставить в прогу и она заурчав мягко тронулась, а не запердела, дергаясь рывками и застучав клапанами. Хе. |
SUnteXx
|
опубликован 31-01-2002 23:44 MSK
2Dunkard: Вот мой пример на Win32API!char szWorkDir[MAX_PATH]; LPCITEMIDLIST lpItemDList; BROWSEINFO bi = { hWnd, NULL, (LPSTR)szWorkDir, "Please, choose the folder...", BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_EDITBOX /*| BIF_STATUSTEXT */| BIF_BROWSEFORCOMPUTER, BrowseCallbackProc, // У меня еще свой процесс для обработки некоторых мессаг, я в него (диалог) добавляю две кнопки:) NULL, 0 }; if(!(lpItemDList=SHBrowseForFolder(&bi))) { . . . return; } SHGetPathFromIDList(lpItemDList, szWorkDir); 6 строк:) Может что упустил, но суть ясна:)
|
Drunkard
|
опубликован 01-02-2002 01:39 MSK
SUnteXx< Привет. Не хочу лезть в бутылку, но куда мне сувать эти 6 строк?Вопрос в чем? Парень попросил "как это сделать". MSDN у него нету и не знает где его взять. Я ему подробно от 0 до 100% расписал "как и что следует сделать на ВС 5.0". Он может просто скопировать код в свою прогу и запустить, и все ОК. Проверено. Сюда включены даже обработки ошибок и куда совать обращения к функциям и где получать результат. Надеюсь ты заметил отличие моего примера от твоего? Я его не подписал такими словами "Может что упустил, но суть ясна:) " Вот именно, где у тебя указатель на интерфейс Imalloc оболочки? Пример функции Browse взят мной из "Руководства программиста по Microsoft Windows 95" изд. MicrosoftPress стр. 168. Может я его коряво переработал :)), но суть не в том. Суть в том, что за нормальный ответ получаешь какие-то усмешки за спиной типа "Хе". Зачем ADK залез в этот раздел? Чтобы покритиковать? Я тут крутой? MSDN прочел своими глазами :)) теперь пишу за 10 строк. Ну-Ну. (см. тему того же Vovana "Ламеры и пр.") Я считаю так: не привел своего кода, нечего лезть с вы@бонами типа "да у меня покруче". Можешь встрять в случае обнаружения ошибок. Кто видит в приведенном коде ошибку - пусть закидает меня дохлыми мониторами. А по мне, парень попросил - я ему отписал всё от корки до корки и это видно из текста. Не люблю я этот снобизм типа "читай MSDN". Вобщем пожалел даже, что ответ Vovanу послал - очень неприятное впечатление осталось от этого Хе. |
GE
|
опубликован 01-02-2002 02:37 MSK
2Drunkard: "читай MSDN" - это не снобизм, замечание в адрес SUnteXx как раз результат того, что Вы не знакомы с MSDN. |
Drunkard
|
опубликован 01-02-2002 02:52 MSK
GE< Вы что-то не допоняли. Вы имеете ввиду замечание "куда мне сувать эти шесть строк"? Я правильно понял? Если да, то отвечу, что прекрасно знаю куда их вставить в программу. И это видно из ответа Vovanу. При ответе Vovanу как раз, я ему показал куда и как надо "сувать", т.к. у него нет MSDN. Обратите внимание на его вопрос. Так что кроме MSDN следует еще и внимательно читать вопросы и переписку. Если же Вас лично задело "Читай MSDN", то я считаю, что это Вам на пользу :)) Форум все-таки на "исходниках", а не на "MSDNах":)). Или я не прав?С SUnteXx-ом я не вступал ни в какую полемику, т.к. не вижу никакого отличия приведенного мной кода и его, кроме того что мной прописаны детали употребления этого кода, которые никак в мифические 10 строк не влезают. Удачи. |
ADK
|
опубликован 01-02-2002 05:58 MSK
Во-первых, Druncard, не стоит всё так воспринимать, я вовсе не хотел тебя задеть. Вот мой код. Кое-что добавил для полноты, но суть не меняется.BROWSEINFO bi; char foldername[MAX_PATH]; ZeroMemory(&bi,sizeof(bi)); bi.pszDisplayName=foldername; bi.hwndOwner=hwnd; bi.lpszTitle="Âûáåðèòå ïàïêó äëÿ óñòàíîâêè:"; bi.ulFlags=BIF_RETURNONLYFSDIRS; LPITEMIDLIST lpid= SHBrowseForFolder(&bi); if(!lpid) return FALSE; IMalloc* pMalloc; SHGetPathFromIDList(lpid,foldername); SHGetMalloc(&pMalloc); pMalloc->Free((void*) lpid); pMalloc->Release(); Подключить: #include <shellapi.h> #include <shlobj.h> |
ADK
|
опубликован 01-02-2002 06:03 MSK
2Drunkard: Можешь бесконечно наезжать, что мой код неполный и непонятный, но по-моему, его достаточно. И комментов типа // Здесь опять всякая хрень нет. |
ADK
|
опубликован 01-02-2002 06:09 MSK
А от того, что твоя прога умеет выдавать ошибки типа "Затрудняюсь обнаружить корневую папку" никому легче не будет. Ещё раз извини, не считай наездом, ты первый начал. |
SUnteXx
|
опубликован 01-02-2002 12:21 MSK
2Drunkard & Vovan: Сори, не заметил что без MSDN'a человек. Сори, не хотел! Но код, как вы могли видеть в приведенном коде ADK, не сильно меняется.2Drunkard: Наезды на меня не действуют:) >Долго базарить не буду. Я это на API в Borlande 5.0 делаю так: А я код писал для MVC++. Если на то пошло, то может код выложить с добавлением еще 2 кнопок и обработкой строки пути к папке? 2ADK: Согласен, зачем в данном случае наворачивать код, если, для начала, можно кинуть основу, а потом уже, если человека заинтересует, более подробно и глобально! |
Vovan
|
опубликован 01-02-2002 13:16 MSK
Спасибо всем, но мне хотелось сделать на VC++ с MFC? но ладно! |
ADK
|
опубликован 01-02-2002 13:24 MSK
Так мы ж тебе на API дали!! Юзай!! |