Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запрет многократного вызова диалога выбора папки  (Прочитано 10020 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dark_rain
Помогающий

ua
Offline Offline
Пол: Мужской

« : 07-09-2011 11:38 » 

Доброго времени всем! Прошу помощи, есть кнопочка Fill к которой прикручен стандартный диалог выбора папок, проблема в том, что при многократном нажатии на нее открывается множество таких диалогов.  Как мне запретить вызов более одного экземпляра диалога?

Код: (C++)
LRESULT CMainDlg::OnFill(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
        TCHAR szPath[MAX_PATH];
        LPMALLOC pMalloc;
        if (::SHGetMalloc(&pMalloc) == NOERROR)
        {
                BROWSEINFO bi;
                ::ZeroMemory(&bi,sizeof bi);
                bi.ulFlags = BIF_RETURNONLYFSDIRS;
                LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
                if (pidl != NULL)
                {
                        if (::SHGetPathFromIDList(pidl, szPath))
                        {
                                if (szPath)// если нажато ОК то выполнить следующие действия
                                {
                               
                                        if (fScanner_->my_thread_)
                                        {
                                                fScanner_->StopThread ();
                                        }
                                        fScanner_->StartThread (szPath);
                                }
                        }
                }
        }
        return 0;
}
 
« Последнее редактирование: 07-09-2011 11:40 от dark_rain » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 07-09-2011 11:51 » 

Да как угодно. Хоть статическим флажком, хоть мембером.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
dark_rain
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 07-09-2011 11:59 » 

Проблема в том, что по нажатию кнопочки Fill у меня запускается поток, который, при выборе новой директории из диалога, я должен прервать и запустить заново. Я совсем запутался, если я устанавливаю флажок то мне эта кнопка уже недоступна, а мне она очень нужна.

Добавлено через 17 минут и 53 секунды:
Все, разобрался.. Совсем запарился уже))
Код: (C++)
LRESULT CMainDlg::OnFill(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
        static bool once = false;
        if(!once)
        {
                once = true;
        TCHAR szPath[MAX_PATH];
        LPMALLOC pMalloc;
        if (::SHGetMalloc(&pMalloc) == NOERROR)
        {
                BROWSEINFO bi;
                ::ZeroMemory(&bi,sizeof bi);
                bi.ulFlags = BIF_RETURNONLYFSDIRS;
                LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
                if (pidl != NULL)
                {
                        if (::SHGetPathFromIDList(pidl, szPath))
                        {
                                if (szPath)
                                {
                               
                                        if (fScanner_->my_thread_)
                                        {
                                                fScanner_->StopThread ();
                                        }
                                        fScanner_->StartThread (szPath);
                                }
                        }
                }
        }
                once = false;
        }
        return 0;
}
« Последнее редактирование: 07-09-2011 12:17 от dark_rain » Записан
Алик
Постоялец

kz
Offline Offline

« Ответ #3 : 14-09-2011 09:41 » 

к примеру, так:

глобальная переменная
Код: (C++)
bool bIsDialogOpen = false;

Код: (C++)
if (!bIsDialogOpen) {
        bIsDialogOpen = true;
        bool bDialogResult = ::SHGetPathFromIDList(pidl, szPath);
        bIsDialogOpen = false;
        if (bIsDialogOpen){
                ...
        }
}
но грамотнее, если речь идет о многопоточности, вместо bIsDialogOpen использовать объект синхронизации
« Последнее редактирование: 14-09-2011 09:43 от Алик » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 14-09-2011 10:37 » 

к примеру, так:

глобальная переменная
Код: (C++)
bool bIsDialogOpen = false;

Код: (C++)
if (!bIsDialogOpen) {
        bIsDialogOpen = true;
        bool bDialogResult = ::SHGetPathFromIDList(pidl, szPath);
        bIsDialogOpen = false;
        if (bIsDialogOpen){
                ...
        }
}
но грамотнее, если речь идет о многопоточности, вместо bIsDialogOpen использовать объект синхронизации


Алик, зачем нужно во второй строчке:

Код: (C++)
        bIsDialogOpen = true;

?

И тело:

Код: (C++)
if (bIsDialogOpen)

никогда не будет выполняться, тк непосредственно перед этим ты устанавливаешь:

Код: (C++)
bIsDialogOpen = false;

Так что ты хотел этим кодом сказать? Попробуй словами, без кода.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
dark_rain
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 19-09-2011 12:19 » 

В результате переделал диалог и сделал его модальным относительно главного окна. Я новичок и о понятии модальности не знал.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 19-09-2011 14:12 » 

Хммм... Для задачи из первого сообщения даже не знаю, есть ли модальный диалог гут? В общем случае получается, что ты в любой момент можешь открывать папку. Обычно такое действие должно быть законченым. А модальные диалоги предназначены в основнм для постоянного присутствия на экране. Для, например, отображения какой-либо инфы, или для редактирвания сиюминутных данных, например, настроек (громкость, яркость, цвет фона и тд).
« Последнее редактирование: 20-09-2011 07:56 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
dark_rain
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #7 : 19-09-2011 14:21 » 

В моем случае это оптимальный вариант. Красиво и просто. Фактически я запрещаю пользователю обращаться к главному окну, пока открыт диалог выбора папки, тем самым запрещаю снова жать на кнопочку "Fill", как только диалог отработал - главное окно снова доступно. Во многих приложения механизм открытия файла/папки реализован именно так, например в том же блокноте.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 20-09-2011 07:55 » 

Ааа блин. Долблюсь. Забудь всё что я сказал. Просто обычно все диалоги по умолчанию модальные, и упоминание "модальный" я воспринял с точностью наоборот. Те как НЕ модальный. Собственно его и имел ввиду. Ты всё сделал абсолютно правильно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines