Если других '
человеческих' вариантов не предложат, то можно попробовать '
поиграть' правым выравниваением формы средствами
WinAPI.
Алгоритм не сложный: получить размеры клиентской области Ax и размеры текущей формы, после этого выставить координаты формы (
formDesign.leftValue) таким образом что бы форма была '
прижата' к правой границе рабочей области Ax.
Обработку можно навесить на метод
run():
X++:
public void run()
{
// --> FormAlignment
container rectCurForm ;
container rectAxClient;
int formWidth ;
int formLeft ;
;
// <-- FormAlignment
super();
// --> FormAlignment
switch( this.form().design().leftMode() )
{
case FormLeft::AutoRight :
case FormLeft::RightEdge :
rectCurForm = WinAPI::getWindowRect( this.hWnd() ) ;
rectAxClient = WinAPI::getClientRect( WinAPI::findWindowEx( infolog.hWnd(), 0, 'MDIClient', '' ) ) ;
formWidth = conpeek( rectCurForm, 3 ) - conpeek( rectCurForm, 1 ) ;
formLeft = conpeek( rectAxClient, 3 ) - formWidth ;
this.design().leftValue( formLeft ) ;
break ;
}
// <-- FormAlignment
}
В класс WinAPI добавить 'обертки' методов
BOOL GetWindowRect( HWND hWnd, LPRECT lpRect ) и
BOOL GetClientRect( HWND hWnd, LPRECT lpRect ):
X++:
client static container getWindowRect(HWND _hWnd)
{
#define.sizeOfRectStruct(16)
DLL DLL = new DLL(#UserDLL) ;
DLLFunction DLLFunction = new DLLFunction(DLL,'GetWindowRect');
Binary rect = new Binary( #sizeOfRectStruct );
;
DLLFunction.arg( ExtTypes::DWord, ExtTypes::Pointer ) ;
DLLFunction.returns( ExtTypes::DWord ) ;
if( DLLFunction.call( _hWnd, rect ) == 0 )
return connull() ;
return [ rect.dWord( #offset0 ), rect.dWord( #offset4 ), rect.dWord( #offset8 ), rect.dWord( #offset12 ) ] ;
}
X++:
client static container getClientRect(HWND _HWND)
{
#define.sizeOfRectStruct(16)
DLL DLL = new DLL(#UserDLL) ;
DLLFunction DLLFunction = new DLLFunction(DLL,'GetClientRect');
Binary rect = new Binary( #sizeOfRectStruct );
;
DLLFunction.arg( ExtTypes::DWord, ExtTypes::Pointer ) ;
DLLFunction.returns( ExtTypes::DWord ) ;
if( DLLFunction.call( _hWnd, rect ) == 0 )
return connull() ;
return [ rect.dWord( #offset0 ), rect.dWord( #offset4 ), rect.dWord( #offset8 ), rect.dWord( #offset12 ) ] ;
}
P.S. Набросал небольшой проект в качестве демонстрации (Ax 3.0 sp05 fp01 )