AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.07.2003, 16:22   #1  
ahtoh
Гость
 
n/a
Модальный диалог
как вызвать ?
Старый 02.07.2003, 17:06   #2  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Регистрация: 21.08.2002
Адрес: Москва
Это где-то на форуме уже было.
Только если я не ошибаюсь, при использовании этого способа, есть какой-то побочный эффект, он проявляется когда вызываешь из модальной формы другое модальное.

PHP код:
public void run()
{
    
super();

    
this.setFormModal(this.hWnd(), true);
}

//---------------------------------------------------------------------

public void close()
{
    
super();

    
this.setFormModal(this.hWnd(), false);
}

//---------------------------------------------------------------------

void setFormModal(int _thisHWNDboolean _bModal)
{
    
DLL             _winApiDLL;
    
DLLFunction     _EnabledWindow;
    
DLLFunction     _getTop;
    
DLLFunction     _getNext;
    
DLLFunction     _getParent;

    
void local_enableWHND(int _lHWND)
    {
        
int lnextWnd;

        
lnextWnd _getTop.call(_getParent.call(_lHWND));

        while (
lnextWnd)
        {
           if (
lnextWnd != _lHWND)
                
_enabledWindow.call(lnextWnd, (!_bModal));

            
lnextWnd =  _getNext.call(lnextWnd2);
        }
    }
    ;
    
_winApiDLL              = new DLL('user32');
    
_getNext                = new DLLFunction(_winApiDLL"GetWindow");
    
_EnabledWindow          = new DLLFunction(_winApiDLL"EnableWindow");
    
_getTop                 = new DLLFunction(_winApiDLL"GetTopWindow");
    
_getParent              = new DLLFunction(_winApiDLL"GetParent");

    
_getParent.returns(ExtTypes:: DWORD);
    
_getParent.arg(ExtTypes:: DWORD);

    
_EnabledWindow.returns(ExtTypes:: DWORD);
    
_EnabledWindow.arg(ExtTypes:: DWORDExtTypes:: DWORD);

    
_getTop.returns(ExtTypes:: DWORD);
    
_getTop.arg(ExtTypes:: DWORD);

    
_getNext.returns(ExtTypes:: DWORD);
    
_getNext.arg(ExtTypes:: DWORDExtTypes:: DWORD);

    
local_enableWHND(_thisHWND);

    
local_enableWHND(_getParent.call(_thisHWND));

__________________
yurisafronov@mail.ru
skype: y.safronov
Старый 02.07.2003, 23:22   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Вай, кошмар какой!
Юрий, а проще разве никак нельзя?

На самом деле я не знаю. Но точно надо обращаться к WinAPI?
Старый 03.07.2003, 08:57   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Проще можно только стандартный MessageBox через статические методы класса Box.
Box:: okCancel()
Старый 03.07.2003, 10:12   #5  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Регистрация: 21.08.2002
Адрес: Москва
2mazzy
Описан метод с помощью которого я в Аксапате делаю модальной любую форму.
Другого метода я не знаю. И думаю что это правильно, так как соответствует концепции MDI. Иногда мне приходится применять этот метод. Но в принципе если конечный пользователь довольно продвинут, то можно вообще избежать модальных форм.

2Wamr
Я про это знаю, но мне было не понятно, что под словосочетанием "Модальный диалог" подразумевает ahtoh. И поэтому я написал универсальный способ.
__________________
yurisafronov@mail.ru
skype: y.safronov
Старый 03.07.2003, 10:17   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Yuri Safronov, понял. Спасибо

Wamr, Box наследует от DialogBox, который в свою очередь вызывает WinAPI.

Жалко, что стандартными средствами модального диалога сделать нельзя. Правда мне никогда он еще не нужен был. Но на всякий случай, все равно жалко
Старый 03.07.2003, 10:29   #7  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
2mazzy
практически любое действие в Windows приводит в конечном итгое к вызову WinAPI
Старый 03.07.2003, 10:39   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Wamr, так то так. Но где то вызовом АПИ занимается ядро, а где то ручками приходится писать... Ладно бог с ним.

Yuri Safronov, ahtoh,
наверняка вы рассамтривали возможность просто взвести галочку Always on Top.
Это не совсем модальность, но для пользователя особой разницы не ощущается. Почему не стали рассматривать возможность использования этой галочки вместо того, чтобы городить код?
Старый 03.07.2003, 10:45   #9  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Регистрация: 21.08.2002
Адрес: Москва
2mazzy
Это не модальность
__________________
yurisafronov@mail.ru
skype: y.safronov
Старый 03.07.2003, 10:51   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Always on top
2mazzy
Такая "модальность" легко приводит к случайным глюкам
например таким http://www.axforum.info/forums/showt...=6437#post6437
Старый 03.07.2003, 11:27   #11  
garu is offline
garu
Участник
 
33 / 21 (1) +++
Регистрация: 03.07.2003
Модальный диалог
Буквально дня два назад сделал то же самое (как мысли сходятся), если бы раньше опублиуовал не пришлось бы голову ломать))).
Правда есть еще одна задумка, как сделать форму модальной по отношению только к вызвашей )))
Старый 03.07.2003, 11:44   #12  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Пользуйтесь поиском
2garu
Это было опубликовано 18-09-2002
http://www.axforum.info/forums/showt...=4128#post4128
Старый 03.07.2003, 12:41   #13  
garu is offline
garu
Участник
 
33 / 21 (1) +++
Регистрация: 03.07.2003
Модальное только по отношению к вызвавшему
А вот так еще можно ограничить модальность, т.е окно будет модальное только по отношению к окну которое его вызвало

public static void setFormModal_toPrevHWND(int thisHWND, int prevHWND, boolean bModal)
{
DLL winApiDLL;
DLLFunction EnabledWindow;
DLLFunction getNext;

void local_enableWHND(int lhWnd)
{

while (lhWnd)
{
enabledWindow.call(prevHWND, (! bModal));

lhWnd = getNext.call(lhWnd, 2);
}
}
;

winApiDLL = new DLL('user32');
getNext = new DLLFunction(winApiDLL, "GetWindow");
EnabledWindow = new DLLFunction(winApiDLL, "EnableWindow");

EnabledWindow.returns(ExtTypes::DWORD);
EnabledWindow.arg(ExtTypes::DWORD, ExtTypes::DWORD);

getNext.returns(ExtTypes::DWORD);
getNext.arg(ExtTypes::DWORD, ExtTypes::DWORD);

local_enableWHND(thisHWND);

}
За это сообщение автора поблагодарили: kashperuk (4).
Старый 03.07.2003, 14:12   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Re: Always on top
Цитата:
Изначально опубликовано Wamr
2mazzy
Такая "модальность" легко приводит к случайным глюкам
например таким http://www.axforum.info/forums/showt...=6437#post6437
Понял.
Но я бы все же пользователей учить стал.
Иначе всю Аксапту переписывать надо.

Ок. Понял. Пошел за попкорном.
Буду дальше смотреть на интересную дискуссию.
Старый 13.08.2003, 07:58   #15  
Buba is offline
Buba
Участник
 
90 / 10 (1) +
Регистрация: 24.04.2003
Адрес: Томск
Функция "GetWindow" находится в "user32"
например
PHP код:
_winApiDLL              = new DLL('user32'); 
PHP код:
_getNext                = new DLLFunction(_winApiDLL"GetWindow"); 
Функция "shellExecute" -- в "SHELL32"

А где находится функция "CreateProcess" ?
Старый 13.08.2003, 08:00   #16  
Buba is offline
Buba
Участник
 
90 / 10 (1) +
Регистрация: 24.04.2003
Адрес: Томск
А также функция "WaitForSingleObject" ?
Старый 13.08.2003, 10:32   #17  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Регистрация: 21.08.2002
Адрес: Москва
PHP код:
static void Job1(Args _args)
{
    
DLL winApiDLL;
    
DLLFunction createprocess;
    
DLLFunction waitforSO;
    ;

    
winApiDLL = new DLL('kernel32');
    
createprocess = new DLLFunction(winApiDLL"CreateProcessW");
    
waitforSO = new DLLFunction(winApiDLL"WaitForSingleObject");

Обе функции в kernel32.dll
Просто функции CreateProcess нет, а есть

CreateProcessA
CreateProcessW

Про различия между A и W можно прочитать здесь:
http://www.axforum.info/forums/showt...7471#post17471

А вот функция WaitForSingleObject есть, без всяких там A и W. В ней они просто не нужны.
__________________
yurisafronov@mail.ru
skype: y.safronov
Старый 13.08.2003, 10:35   #18  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
MSDN
http://msdn.microsoft.com/
Старый 13.08.2003, 12:35   #19  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
И еще немного о DialogBox
Маленький комментарий ко второму варианту модального окна согласно Wamr (с помощью MessageBox). Передо мной встала задача создать такое модальное окно, при котором бы в Axapty не посылалось бы вообще никаких сообщений. Стандарно так ведет себя только Box::stop(), но в этом варианте диалога только одна кнопка. Вот код, который эмулирует аксартовский DialogBox, причем создает диалоги, полностью блокирующие окно Аксапты:
PHP код:
//int MessageBox(
//  HWND hWnd,          // handle to owner window
//  LPCTSTR lpText,     // text in message box
//  LPCTSTR lpCaption,  // message box title
//  UINT uType,         // message box style
DialogButton systemMessageBox(
                
str             _text,
                
DialogBoxType   _dialogBoxType,
                
str             _title "@SYS11132",
                
DialogButton    _defaultButton DialogButton::Ok,
                
boolean         _taskModal false,
                
int             _hWnd activeFormRun activeFormRun.hWnd() : 0)
{
    
DLL             user32DLL   = new DLL("USER32");
    
DLLFunction     messageBox  = new DLLFunction(user32DLL"MessageBoxA");
    
int             uType 0retxhWnd _hWnd;
    
DialogButton    retButton;

    
messageBox.returns(ExtTypes:: DWord);
    
messageBox.arg(ExtTypes:: DWORD,
                   
ExtTypes::String,
                   
ExtTypes::String,
                   
ExtTypes:: DWORD);

    switch(
_dialogBoxType)
    {
        case 
DialogBoxType::InfoBox :
            
uType #MB_OK | #MB_ICONINFORMATION;
            
break;
        case 
DialogBoxType::OkCancelBox :
            
uType #MB_OKCANCEL | #MB_ICONWARNING;
            
uType _defaultButton == DialogButton::Ok uType #MB_DEFBUTTON1 :
                        
uType #MB_DEFBUTTON2;
            
break;
        case 
DialogBoxType::StopBox :
            
uType #MB_OK | #MB_ICONSTOP;
            
break;
        case 
DialogBoxType::WarnBox :
            
uType #MB_OK | #MB_ICONWARNING;
            
break;
        case 
DialogBoxType::YesNoBox :
            
uType #MB_YESNO | #MB_ICONWARNING;
            
uType _defaultButton == DialogButton::Yes uType #MB_DEFBUTTON1 :
                        
uType #MB_DEFBUTTON2;
            
break;
        case 
DialogBoxType::YesNoCancelBox :
            
uType #MB_YESNOCANCEL | #MB_ICONWARNING;
            
uType _defaultButton == DialogButton::Yes uType #MB_DEFBUTTON1 :
                        
(_defaultButton == DialogButton::No uType #MB_DEFBUTTON2 :
                            
uType #MB_DEFBUTTON3);
            
break;

        case 
DialogBoxType::NoToAllBox,
             
DialogBoxType::YesToAllBox,
             
DialogBoxType::YesToAllNoToAllBox :
        default :
            
uType #MB_YESNO | #MB_ICONINFORMATION;
    
}
    if (
_taskModal)
    {
        
uType uType #MB_TASKMODAL;
        
xhWnd 0;
    }

    
/* --> */ ret messageBox.call(xhWnd_text_titleuType);

    switch(
ret)
    {
        case 
#IDOK, #IDRETRY, #IDIGNORE  :
            
retButton DialogButton::Ok;
            break;
        case 
#IDCANCEL, #IDABORT, #IDCLOSE :
            
retButton DialogButton::Cancel;
            break;
        case 
#IDYES, #IDHELP :
            
retButton DialogButton::Yes;
            break;
        case 
#IDNO :
        
default :
            
retButton DialogButton::No;
            break;
    }
    return 
retButton;

Старый 27.08.2007, 07:10   #20  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
А я сделал проще...У меня есть форма с кнопкой, по которой вызывается диалог. Стало необходимо сделать этот диалог "модальным". Сделал следующим хитрым способом:
1) в методо dialog добавил dialog.windowType(FormWindowType::PopUp), теперь диалог всегда поверх остальных окон.
2) по клику кнопки, вызывающей диалог отрабатывает метод, выключающий enabled всех контролов формы.
X++:
void enabled(boolean _enabled)
{
    int ctrlCount, i;
    ctrlCount = element.design().controlCount();
    for (i = 1; i <= ctrlCount; i++)
    {
            element.design().controlNum(i).enabled(_enabled);
    }
}
очень просто ... для моего случая неплохо подошло.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
финансовые аналитики в диалог longson DAX: Программирование 6 02.07.2008 03:23
Диалог на отчете, то работает, то нет Himan DAX: Программирование 6 22.02.2007 11:04
Диалог в наследнике SalesReport_Invoice_RU DreamCreator DAX: Программирование 21 28.12.2005 11:12
Диалог открытия файлов NeveB DAX: Программирование 1 08.12.2003 11:48
Свой диалог фильтра Vadik DAX: Программирование 7 31.01.2003 19:20

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:10.