Показать сообщение отдельно
Старый 06.08.2008, 10:54   #3  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от NeveB Посмотреть сообщение
Модифицировать форму FilePathLookup_RU
в четверке эту форму прибили похоже, глянул в 3ку, но все равно она поставленной задачи не решает диалог выбора каталога все равно открывается по default'у на рабочем столе, а 3ий параметр метода browseForFolder всего лишь берется в том, случае если мы ничего не выбрали в диалоге. Вот код того метода в 3.0:
X++:
str browseForFolder(int _hwnd, str _title, str _defaultFolder = "")
{
    str folder;
    int il;

    // Declare the DLL's we need to use
    DLL dll = new DLL(#dLL);
    DLLFunction shBrowseForFolder   = new DLLFunction(dll, #browseFolder);
    DLLFunction shGetPathFromIDList = new DLLFunction(dll, #browsePath);

    DLL dllOle = new DLL(#dLLOLE);
    DLLFunction coTaskMemFree = new DLLFunction(dllOle, #dLLFuncMemFree);

    Binary struct = new Binary(#structSize);
    Binary titleStruct = new Binary(strlen(_title) + 1);
    Binary folderStruct = new Binary(#fileNameLength);

    shBrowseForFolder.returns(ExtTypes::DWORD);
    shBrowseForFolder.arg(ExtTypes::POINTER);

    shGetPathFromIDList.returns(ExtTypes::DWORD);
    shGetPathFromIDList.arg(ExtTypes::DWORD, ExtTypes::POINTER);

    coTaskMemFree.arg(ExtTypes::DWORD);

    titleStruct.string(0, _title);

    struct.dWord(0, _hwnd);          // hwndOwner
    struct.dWord(4, 0);             // pidlRoot
    struct.dWord(8, 0);             // pszDisplayName
    struct.binary(12, titleStruct); // lpszTitle
    struct.dWord(16, 0);            // ulFlags
    struct.dWord(20, 0);            // lpfn
    struct.dWord(24, 0);            // lParam
    struct.dWord(28, 0);            // iImage

    // Put up the Select Folder dialogue
    il = shBrowseForFolder.call(struct);

    if (il)
    {
        // extract folder name
        if (shGetPathFromIDList.call(il, folderStruct))
        {
            folder = folderStruct.string(0);
        }

        // clean up
        coTaskMemFree.call(il);
    }
    else
    {
        folder = _defaultFolder;
    }
    return folder;
}
вот если бы параметр _defaultFolder как то передавался в метод DLL, тогда - да, но к сожалению в данном случае можно лишь рулить параметром pidlRoot - struct.dWord(4, 0); где 2ой параметр=0 как раз и говорит что открывать надо Рабочий стол. Но он насколько я понимаю может быть только предопределенным значением, типа: Рабочий стол, Мои документы и т.п.... А строку передать не удастся...