AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 02.07.2003, 16:22   #1  
ahtoh
Гость
 
n/a
Модальный диалог
как вызвать ?
Old 02.07.2003, 17:06   #2  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Join Date: 21.08.2002
Location: Москва
Это где-то на форуме уже было.
Только если я не ошибаюсь, при использовании этого способа, есть какой-то побочный эффект, он проявляется когда вызываешь из модальной формы другое модальное.

PHP Code:
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
Old 02.07.2003, 23:22   #3  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Вай, кошмар какой!
Юрий, а проще разве никак нельзя?

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

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

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

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

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

}
This post has been rated by: kashperuk (4).
Old 03.07.2003, 14:12   #14  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Re: Always on top
Quote:
Изначально опубликовано Wamr
2mazzy
Такая "модальность" легко приводит к случайным глюкам
например таким http://www.axforum.info/forums/showt...=6437#post6437
Понял.
Но я бы все же пользователей учить стал.
Иначе всю Аксапту переписывать надо.

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

А где находится функция "CreateProcess" ?
Old 13.08.2003, 08:00   #16  
Buba is offline
Buba
Участник
 
90 / 10 (1) +
Join Date: 24.04.2003
Location: Томск
А также функция "WaitForSingleObject" ?
Old 13.08.2003, 10:32   #17  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Join Date: 21.08.2002
Location: Москва
PHP Code:
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
Old 13.08.2003, 10:35   #18  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Join Date: 15.01.2002
Location: Москва
Blog Entries: 7
MSDN
http://msdn.microsoft.com/
Old 13.08.2003, 12:35   #19  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
И еще немного о DialogBox
Маленький комментарий ко второму варианту модального окна согласно Wamr (с помощью MessageBox). Передо мной встала задача создать такое модальное окно, при котором бы в Axapty не посылалось бы вообще никаких сообщений. Стандарно так ведет себя только Box::stop(), но в этом варианте диалога только одна кнопка. Вот код, который эмулирует аксартовский DialogBox, причем создает диалоги, полностью блокирующие окно Аксапты:
PHP Code:
//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;

Old 27.08.2007, 07:10   #20  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Join Date: 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);
    }
}
очень просто ... для моего случая неплохо подошло.
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
финансовые аналитики в диалог 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 11:24.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.