28.08.2006, 16:41 | #1 |
Участник
|
WinApi::getOpenFileName()
Кто0нибудь пробовал сделать WinApi::getOpenFileName() с возможностью выбора нескольких файлов?
Уткнулся в то что вот эта строка sFileName = bFileName.string(#offset0); вернет из буфера только путь к папке, в которой лежат открываемые файлы( в случае выбора нескольких файлов ф-я getOpenFileName возвращает путь к папке и названия выбранных файлов) Как бы это обойти? |
|
28.08.2006, 16:48 | #2 |
Модератор
|
Ох... кажется, как параметр ставил контейнер. Попробуйте.
С Уважением, Геогрий |
|
28.08.2006, 16:54 | #3 |
Участник
|
Ээээ... как параметр к чему?
|
|
28.08.2006, 18:04 | #4 |
Участник
|
Переделайте этот метод так
X++: #define.fileNamelength(1024*4) str getOpenFileName(int _hwnd, FilenameFilter _conFilter, str _strInitialPath, str _dialogTitle, str _strDefaultExtension='', str _strDefaultFileName='', int _flags = #OFN_FILEMUSTEXIST) { Binary oFN, bFileName, bStrFilter, bStrInitialPath, bDialogTitle, bstrDefaultExtension; str tmpstr; str sFileName; str dirName, file; int strOffset, i; Info info; DLL _DLL = new DLL('COMDLG32'); DLLFunction _getOpenFileName = new DLLFunction(_DLL, 'GetOpenFileNameA'); _getOpenFileName.returns(ExtTypes::DWord); _getOpenFileName.arg(ExtTypes::Pointer); strOffset = 0; strOffset = 0; for (i=1; i<=conLen(_conFilter); i++) { tmpstr = conPeek(_conFilter, i); if (i mod 2) tmpstr += ' ('+conPeek(_conFilter, i+1)+')'; strOffset += 1 + strLen(tmpstr); } info = new Info(); bFileName = new Binary(#fileNamelength); oFN = new Binary(#structSize); bStrFilter = new Binary(strOffset + 2); bstrDefaultExtension = new Binary(#fileNamelength); bStrInitialPath = new Binary(_strInitialPath); bDialogTitle = new Binary(_dialogTitle); bFileName.string(#Offset0, _strDefaultFileName); strOffset = 0; for (i=1; i<=conLen(_conFilter); i++) { tmpstr = conPeek(_conFilter, i); if (i mod 2) tmpstr += ' ('+conPeek(_conFilter, i+1)+')'; bStrFilter.string(strOffset, tmpstr); strOffset += 1 + strLen(tmpstr); } oFN.dWord( #Offset0 , #structSize); oFN.dWord( #offset4 , _hwnd); oFN.dWord( #offset8 , info.instance()); oFN.binary(#offset12 , bStrFilter); oFN.dWord( #offset16 , 0); oFN.dWord( #offset20 , 0); oFN.dWord( #offset24 , 1); oFN.binary(#offset28 , bFileName); oFN.dWord( #offset32 , #fileNamelength); oFN.dWord( #offset36 , 0); oFN.dWord( #offset40 , 0); oFN.binary(#offset44 , bStrInitialPath); oFN.binary(#offset48 , bDialogTitle); oFN.dWord( #offset52 , #OFN_HIDEREADONLY | #OFN_PATHMUSTEXIST | #OFN_SHAREAWARE | #OFN_NOCHANGEDIR | _flags | #OFN_EXPLORER); oFN.word( #offset56 , 0); oFN.word( #offset58 , 0); oFN.binary(#offset60 , bstrDefaultExtension); oFN.dWord( #offset64 , 0); oFN.dWord( #offset68 , 0); oFN.dWord( #offset72 , 0); if(_getOpenFileName.call(oFN)) { if (_flags & #OFN_ALLOWMULTISELECT) { dirName = bFileName.string(#Offset0); i = strlen(dirName) + 1; sFileName = ""; while (bFileName.byte(i)) { file = bFileName.string(i); i += strlen(file) + 1; sFileName += dirName + "\\" + file + (bFileName.byte(i) ? ";" : "" ); } } else sFileName = bFileName.string(#Offset0); } else sFileName = ''; i = strLen(sfilename); return sFileName; } В макрос #fileNamelength установите размер побольше, чтобы гарантированно влезли все выбранные вами файлы (можно устанавливать размер точно, но придется повторно вызывать окно выбора)
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: fomenka (1), Ace of Database (5), gl00mie (3), jonny (1), alex55 (2), samolalex (1). |
29.08.2006, 09:59 | #5 |
Участник
|
Вот супер, спасибо!
|
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|