Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > File Filters


Автор: pablo 28.6.2005, 13:40
Господа, помогите мне нормально создать фильтр файлов.

Пишу код:

CFileDialog dialog(TRUE);

dialog.m_ofn.lpstrFilter = "Microsoft Access files (*.mdb)";

Но при открытии окна, ничего не фильтруется.
Может кто подскажет как создать фильтр ?

Заранее благодарен smile

Автор: En_t_end 28.6.2005, 13:48
pablo
dialog.m_ofn.lpstrFilter = "Microsoft Access files(*.mdb)\0*.mdb\0";
Попробуй так

Автор: Любитель 28.6.2005, 21:20
Или так: dialog.m_ofn.lpstrFilter = "Microsoft Access files(*.mdb)|*.mdb||";

Автор: Nuzur 28.6.2005, 22:11
Точно работает так
[code=cpp][/code]
CFileDialog * Load;

Load = new CFileDialog(true,NULL,NULL,
OFN_HIDEREADONLY,
"TextFiles(*.txt)|*.txt"
);

Автор: Earnest 29.6.2005, 08:35
Цитата
Или так: dialog.m_ofn.lpstrFilter = "Microsoft Access files(*.mdb)|*.mdb||";

Это неправильно, такой формат строки фильтра принят в MFC, а формат API - это как написал En_t_End.
Короче, если передаете сроку-фильтр в конструктор CFileDialog, то разделяющим символом должен быть '|', если записываете прямо в структуру OPENFILENAME, то разделяющий символ - 0.

Автор: chaos 29.6.2005, 08:42
вот тебе готовый пример
Код

{
    TCHAR title[] = "Sample";    

    CFileDialog fileDlg(TRUE);
    
    CString str("All files (*.*)"); str += (TCHAR)NULL;
    str += "*.*"; str += (TCHAR)NULL;

    str += ("All text files (*.txt)"); str += (TCHAR)NULL;
    str+= "*.txt"; str += (TCHAR)NULL;
         
    fileDlg.m_ofn.lpstrFilter = str;
    fileDlg.m_ofn.nFilterIndex = 2;

    TCHAR strName[_MAX_PATH];
    strName[0] = (TCHAR)NULL;
    fileDlg.m_ofn.lpstrFile = strName;

    fileDlg.m_ofn.lpstrTitle = title;

    if (fileDlg.DoModal() == IDOK)
    {
                 //......                 
    }
}

Автор: seevkaboorka 26.2.2008, 14:50
такой вопрос: есть 2 строки, как из них сделать правильный фильтр?

Код

TCHAR szFilter1[1001] = {0};
TCHAR szFilter1[1001] = {0};
...
ofn.lpstrFilter = ... // надо как-то szFilter1 + \0 + szFilter2 + \0\0


и хочется, чтобы стандартными средствами. без использования CString.

Автор: Earnest 26.2.2008, 17:47
Выдели память + strcat

Автор: seevkaboorka 26.2.2008, 19:27
а можно попдробнее? что-то все мои попытки сделать strcat не увенчались успехом...

Автор: Earnest 27.2.2008, 09:18
А учебник почитать? Все-таки это основы C, их знать надо.

Автор: seevkaboorka 27.2.2008, 10:31
дело в том, что strcat убивает '\0' и делает "нормальную" строку с терминатором на конце. а мне нужно, чтобы терминатор был. вот если б учебник мне помог я бы никого не беспокоил. 

Автор: Earnest 28.2.2008, 19:30
Понятно. 
Тогда просто определи позицию этого нуля (точнее, за нулем): int pos = str + strlen(str) + 1;
а потом используй strcpy: strcpy (str + pos, str2). Естественно, памяти в str должно быть достаточно.
Соответственно, если нужно дальше добавлять строки, то strlen общей строки делать уже нельзя - остановишься на первом нуле - а нужно инкрементировать: pos += strlen (str2) + 1;

Еще способ: сначала использовать какой-нибудь заменитель вместо 0, например '\n', а потом в конце в едином цикле заменить все \n на 0. Тогда можно использовать strcat.

Еще одно замечание: раз уж ты используешь макро-типы TCHAR, то и функции используй соответствующие (макросы, раскрываемые в зависимости от определения UNICODE) - n/e/ _tcscat и т.д. Чтобы узнать их имена, просто набери в MSDN имя стандартной функции (strcpy, например), и тебе покажут все имена для ASCII, mulibyte, unicode и макро-имя.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)