Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Програмирование платформенно-независимых систем > Trolltech Qt
Перезагрузить страницу Окошечко Open Files
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Lisenok Lisenok вне форума
Member
 
Сообщений: 443
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.01.2007
По умолчанию 11.08.2008, 20:24

Столкнулся с крайне интересной проблемой:
в конструкторе программы запускаю стандартное окошечко выбора файла с помощью функции
getOpenFileName(<params>)/getOpenFileNames(<params>).
Так вот эта функция пытается построить дерево по всем возможным путям, а так как у нас сейчас не работает один сервер, то программа попусту зависает. Если выдернуть сетевой кабель, то программка запускается. Проверил раз 15-20 - действительно так работает. В ассистенте почитал про функцию getOpenFileName/getOpenFileName, но не нашел флажка, который бы отключал построение этого дерева по "My Network Places". Кто-нибудь знает как справиться с этой проблемой? Может быть каким-нибудь окольным путем?

P.S. работать с выдернутым кабелем не предлагать, это уже я понял. НО хотелось бы, чтобы программа не висла из-за проблем на серверах!
Ответить с цитированием
  (#2 (permalink)) Старый
Lisenok Lisenok вне форума
Member
 
Сообщений: 443
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.01.2007
По умолчанию 13.08.2008, 14:26

Никто не сталкивался с данной проблемой?
Ответить с цитированием
  (#3 (permalink)) Старый
Lisenok Lisenok вне форума
Member
 
Сообщений: 443
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.01.2007
По умолчанию 17.09.2008, 14:14

Блин, может кто-нибудь сталкивался с Qt? Может быть сталкивался с подобной проблемой? Хоть какое-нибудь решение можете посоветовать?
Ответить с цитированием
  (#4 (permalink)) Старый
AD AD вне форума
Member
 
Сообщений: 575
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 3 сообщениях
Регистрация: 15.07.2009
По умолчанию 13.11.2009, 14:51

Не знаю, упоминал ли я в этом форуме или нет... Но думаю, повторить будет не лишне...
В Qt-шних функциях getOpenFileName/getOpenFileNames есть глюк: эти функции строят дерево каталогов для Network Places, при нестабильной работе сети соответственно функции зависают. Для избежания этих проблем лучше использовать функции API операционной системы. Да, возможно, неудобно писать реализацию под несколько систем, но это вариант для избежания наступления на "грабли". Для определения ошибки в реализации этих функций у Qt пока что не хватает времени....

Под Windows данные функции будут выглядеть следующим образом:
Код:
/// Вызов окна диалога для выбора открываемого файла
QString getOpenFileName(QWidget* parent, const char* caption, const char* directory, const char* filter)
{
    const int NAME_SIZE = 550;
    char fname[NAME_SIZE] = {0};        ///< буфер для имени файла
    bool result = false;

#ifdef Q_WS_WIN
    OPENFILENAME ofn;                    ///< структура диалога открытия файла
    ::ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = 88;
    ofn.hwndOwner = (parent) ? parent -> winId() : 0;
    ofn.lpstrFile = fname;
    ofn.nMaxFile = sizeof(fname);
    ofn.lpstrFilter = filter;
    ofn.nFilterIndex = 0;
    ofn.lpstrFileTitle = 0;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = directory;
    ofn.lpstrTitle = caption;
    ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    if(::GetOpenFileName(&ofn) == 1) result = true;
#endif // Q_WS_WIN

    return (result) ? QString(fname) : QString("");
}

/// Вызов окна диалога для выбора открываемых файлов
QStringList getOpenFileNames(QWidget* parent, const char* caption, const char* directory, const char* filter)
{
    const int NAME_SIZE = 5500;
    char fname[NAME_SIZE] = {0};        ///< буфер для имени файла
    QStringList list;

#ifdef Q_WS_WIN
    OPENFILENAME ofn;                    ///< структура диалога открытия файла
    ::ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = 88;
    ofn.hwndOwner = (parent) ? parent -> winId() : 0;
    ofn.lpstrFile = fname;
    ofn.nMaxFile = sizeof(fname);
    ofn.lpstrFilter = filter;
    ofn.nFilterIndex = 0;
    ofn.lpstrFileTitle = 0;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = directory;
    ofn.lpstrTitle = caption;
    ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    if(::GetOpenFileName(&ofn) == 1)
    {
        if(ofn.nFileExtension) list << QString(fname);
        else if(ofn.nFileOffset)
        {
            QString path(QString(fname) + QDir::separator()), name("");
            for(int i=ofn.nFileOffset, j=ofn.nFileOffset+1; fname[i]!=0 || fname[j]!=0 || j<sizeof(fname); ++i,
                ++j)
            {
                if(fname[i] != 0) name += QChar(fname[i]);
                if(fname[j] == 0)
                    list << QString(path + name),
                    name.clear(),
                    ++i, ++j;
                if(fname[i] == 0 && fname[j] == 0) break;
            }
        }
    }
#endif // Q_WS_WIN

    return list;
}
Ответить с цитированием
  (#5 (permalink)) Старый
winamp winamp вне форума
Member
 
Сообщений: 262
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.08.2008
По умолчанию 15.11.2009, 10:52

Если я правильно понял то, о чём вы говорите , то можно использовать
статическую функцию QFileDialog::getOpenFileName , у которой таких проблем не наблюдается.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
AD AD вне форума
Member
 
Сообщений: 575
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 3 сообщениях
Регистрация: 15.07.2009
По умолчанию 15.11.2009, 23:50

Цитата:
Если я правильно понял то, о чём вы говорите , то можно использовать
статическую функцию QFileDialog::getOpenFileName , у которой таких проблем не наблюдается.
У нее тоже наблюдалось!
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Programe files aleks.tarasow Любые вопросы от новичков 3 30.05.2011 18:55
Recover My Files Desprado Память 3 05.02.2011 15:49
Formats of Files akimovster Софт и программы 2 19.07.2007 11:45
Ini.Files чтение из файла demonphp Delphi 5 23.08.2006 12:09
Files как с ними работать и читать их Azure DHTML, JavaScript, VBScript 17 11.02.2005 12:12
Не проигрываются Midi files в чем причина Лиза Delphi 0 07.08.2004 02:10
Как стереть Temporary Internet Files Delphi ycat Delphi 0 15.07.2004 13:14
Install Shield Files структура использовния Tata С/С++ 0 09.06.2004 03:01
Как узнать путь к директории C:/Program Files JuriS C++ Builder 2 25.04.2004 21:38
Как направить и сохранить запрос в *.js или *.vbs files Anonymous DHTML, JavaScript, VBScript 5 16.01.2004 18:30
Как определить пути к Programm files, Desktop DarkStar C++ Builder 1 24.11.2003 17:24



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов