Кое-что про динамическое создание объектов (ver2)
Добавлено: 02 мар 2017, 17:30
				
				Первоначальный вариант не прижился по причине "пожирания" буфера команд. Быстро исправил с хранением коэффициентов в реестр. Хочется сделать красивее, но времени свободного не хватает. Итак ver2.
В продолжение темы http://www.tyumbit.ru/gal_forum/viewtop ... 8&start=15
Вернулся к проблеме по причине появления слабовидящего юзера с FontSize = 14 и 125% в винде работающим через трехзвенный клиент с другого конца страны.
Опущу долгий путь с Delphi, dll, OleCall...
Предложенный вариант проще. Окно моргает один раз в момент запуска клиента. В идеальные позиции мы не попадем, по вполне понятным причинам, но и жесткого наложения объектов не будет.
Создаем настройки:
cfsEx.vip
Для определения текущих коэффициентов и записи их в реестр настроек в момент запуска клиента подписываемся на точку расширения.
AppInit.vip
Соответственно при создании объектов координаты скармливаем функциям.
Проверял этим интерфейсом:
TestFontSize.vip
Если кто будет проверять - отпишитесь.
			В продолжение темы http://www.tyumbit.ru/gal_forum/viewtop ... 8&start=15
Вернулся к проблеме по причине появления слабовидящего юзера с FontSize = 14 и 125% в винде работающим через трехзвенный клиент с другого конца страны.
Опущу долгий путь с Delphi, dll, OleCall...
Предложенный вариант проще. Окно моргает один раз в момент запуска клиента. В идеальные позиции мы не попадем, по вполне понятным причинам, но и жесткого наложения объектов не будет.
Создаем настройки:
Код: Выделить всё
   TR.AddTuneU ( 'ZOOM.KoefZoomPosX', 'Коэффициент позиции X',  ftDouble, '1', '', 0  ); TR.SetCorpoType ( 'ZOOM.KoefZoomPosX', ttCorpoTune );
   TR.AddTuneU ( 'ZOOM.KoefZoomPosY', 'Коэффициент позиции Y',  ftDouble, '1', '', 0  ); TR.SetCorpoType ( 'ZOOM.KoefZoomPosY', ttCorpoTune );
   TR.AddTuneU ( 'ZOOM.KoefZoomSizeX', 'Коэффициент размера X', ftDouble, '1', '', 0  ); TR.SetCorpoType ( 'ZOOM.KoefZoomSizeX', ttCorpoTune );
   TR.AddTuneU ( 'ZOOM.KoefZoomSizeY', 'Коэффициент размера Y', ftDouble, '1', '', 0  ); TR.SetCorpoType ( 'ZOOM.KoefZoomSizeY', ttCorpoTune );
Код: Выделить всё
CONST
 x_def  = 401;
 y_def  = 343;
 xs_def = 304;
 ys_def = 14;
END;
Interface _cfsEx '' CacheAble;
var TestField : string;
var x, y, xs, ys :Integer;
var kx, ky, kxs, kys : Double;
window wTest;
Show At ( ,,45,3 );
screen sTest;
Fields
 TestField : Skip;
<<
 Инициализация модуля для работы с конфигуратором
                                                         .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>>
End;
HandleEvent
cmInit :
 {
  PutCommand ( cmValue10 );
 }; //cmInit
cmValue10 :
 {
  cfsSetCurrentContainer ( cfsGetCurrentContainerSelf );
  If cfsGetProp ( 'i_STEST_TestField', cfpOrigin_X, x  ) <> 0 x  := x_def;
  If cfsGetProp ( 'i_STEST_TestField', cfpOrigin_Y, y  ) <> 0 y  := y_def;
  If cfsGetProp ( 'i_STEST_TestField', cfpSize_X,   xs ) <> 0 xs := xs_def;
  If cfsGetProp ( 'i_STEST_TestField', cfpSize_Y,   ys ) <> 0 xs := ys_def;
  CloseWindow ( wTest );
 };
End; //HandleEvent
End; //window
Public Procedure Init;
{
 RunWindowModal ( wTest );
 kx  := x / x_def;   If kx = 0 kx := 1;   doSetTune ( 'ZOOM.KoefZoomPosX', kx );
 ky  := y / y_def;   If ky = 0 ky := 1;   doSetTune ( 'ZOOM.KoefZoomPosY', ky );
 kxs := xs / xs_def; If kxs = 0 kxs := 1; doSetTune ( 'ZOOM.KoefZoomSizeX', kxs );
 kys := ys / ys_def; If kys = 0 kys := 1; doSetTune ( 'ZOOM.KoefZoomSizeY', kys );
};
///////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//                        Коэффициенты зависимости от системного шрифта                             \\
///////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Public Function GetKoefPosX : double;
{
 result := kx;
}; //Function GetKoefY
Public Function GetKoefPosY : double;
{
 Result := ky;
}; //Function GetKoefX
Public Function GetKoefSizeX : double;
{
 Result := kxs;
}; //Function GetKoefSizeY
Public Function GetKoefSizeY : double;
{
 Result := kys;
}; //Function GetKoefSizeX
Public Function CalcPosX ( x : integer ) : integer;
{
 Result := Round ( x * GetKoefPosX );
}; //Function CalcPosX
Public Function CalcPosY ( y : integer ) : integer;
{
 Result := Round ( y * GetKoefPosY );
}; //Function CalcPosX
Public Function CalcSizeX ( x : integer ) : integer;
{
 Result := Round ( x * GetKoefSizeX );
}; //Function CalcSizeX
Public Function CalcSizeY ( y : integer ) : integer;
{
 Result := Round ( y * GetKoefSizeY );
}; //Function CalcSizeX
HandleEvent
cmOnVipLoad :
 {
  kx := doGetTune ( 'ZOOM.KoefZoomPosX' );
  ky := doGetTune ( 'ZOOM.KoefZoomPosY' );
  kxs := doGetTune ( 'ZOOM.KoefZoomSizeX' );
  kys := doGetTune ( 'ZOOM.KoefZoomSizeY' );
 }; //cmInit
End;
END.
AppInit.vip
Код: Выделить всё
ExtensionPoint epAppInit;
handler with replace epAppInitZoom on ExtensionPoint epAppInit
Action
{
 Result := true;
 var iCfsEx : _cfsEx;
 iCfsEx.Init;
}
Проверял этим интерфейсом:
TestFontSize.vip
Код: Выделить всё
Interface TestFontSize 'Тестирование создания объекта' EscClose, Cyan;
Show At ( ,,100,20 );
var iCfs : _cfsEx;
Create View
var xPos, yPos, xSize, ySize : double;
    b1, b2 : LongInt;
    f1, f2 : LongInt;
    s1, s2, s3, s4 : string;
    b1x1, b1y1, b1x2, b1y2,
    b2x1, b2y1, b2x2, b2y2,
    b3x1, b3y1, b3x2, b3y2,
    b4x1, b4y1, b4x2, b4y2 : integer;
    f1x1, f1y1, f1x2, f1y2,
    f2x1, f2y1, f2x2, f2y2,
    f3x1, f3y1, f3x2, f3y2,
    f4x1, f4y1, f4x2, f4y2 : integer;
    b1x1e, b1y1e, b1x2e, b1y2e,
    b2x1e, b2y1e, b2x2e, b2y2e,
    b3x1e, b3y1e, b3x2e, b3y2e,
    b4x1e, b4y1e, b4x2e, b4y2e : boolean;
As Select *
From x$users
;
Procedure DestroyObjects;
{
 cfsSetCurrentContainer ( cfsGetCurrentContainerSelf );
 If b1 > 0
  {
   cfsDestroyObject ( b1 );
   b1 := 0;
  };
 If b2 > 0
  {
   cfsDestroyObject ( b2 );
   b2 := 0;
  };
 If f1 > 0
  {
   cfsDestroyObject ( f1 );
   f1 := 0;
  };
 If f2 > 0
  {
   cfsDestroyObject ( f2 );
   f2 := 0;
  };
}; //Procedure DestroyButtons
Procedure MakeObjects;
{
 DestroyObjects;
 cfsSetCurrentContainer ( cfsGetCurrentContainerSelf );
 cfsCreateObject ( 'BUTTON', 'SCR2', 'cmValue1', false, b1 );
 cfsSetProp ( b1, cfpOrigin_X, 24 * xPos );
 cfsSetProp ( b1, cfpOrigin_Y, 25  * yPos );
 cfsSetProp ( b1, cfpSize_X, 169 * xSize );
 cfsSetProp ( b1, cfpSize_Y, 25  * ySize );
 cfsSetProp ( b1, cfpTitle, 'Динамическая кнопка 1' );
 cfsCreateObject ( 'BUTTON', 'SCR2', 'cmValue4', false, b2 );
 cfsSetProp ( b2, cfpOrigin_X, 234 * xPos );
 cfsSetProp ( b2, cfpOrigin_Y, 65  * yPos );
 cfsSetProp ( b2, cfpSize_X, 162 * xSize );
 cfsSetProp ( b2, cfpSize_Y, 25  * ySize );
 cfsSetProp ( b2, cfpTitle, 'Динамическая кнопка 2' );
 cfsCreateObject ( 'PanelInputLine', 'SCR3', 's1', false, f1 );
 cfsSetProp ( f1, cfpOrigin_X, 16 * xPos );
 cfsSetProp ( f1, cfpOrigin_Y, 23 * yPos );
 cfsSetProp ( f1, cfpSize_X, 185 * xSize );
 cfsSetProp ( f1, cfpSize_Y, 14  * ySize );
 cfsCreateObject ( 'PanelInputLine', 'SCR3', 's4', false, f2 );
 cfsSetProp ( f2, cfpOrigin_X, 226 * xPos );
 cfsSetProp ( f2, cfpOrigin_Y, 63  * yPos );
 cfsSetProp ( f2, cfpSize_X, 178 * xSize );
 cfsSetProp ( f2, cfpSize_Y, 14  * ySize );
}; //Procedure MakeButtons
Procedure Refresh;
{
 If cfsGetProp ( b1, cfpOrigin_X, b1x1 ) <> 0 b1x1 := 0;
 If cfsGetProp ( b1, cfpOrigin_Y, b1y1 ) <> 0 b1y1 := 0;
 If cfsGetProp ( b1, cfpSize_X,   b1x2 ) <> 0 b1x2 := 0;
 If cfsGetProp ( b1, cfpSize_Y,   b1y2 ) <> 0 b1y2 := 0;
 If cfsGetProp ( 'b_SCR2_Стандартная_кнопка_1', cfpOrigin_X, b2x1 ) <> 0 b2x1 := 0;
 If cfsGetProp ( 'b_SCR2_Стандартная_кнопка_1', cfpOrigin_Y, b2y1 ) <> 0 b2y1 := 0;
 If cfsGetProp ( 'b_SCR2_Стандартная_кнопка_1', cfpSize_X,   b2x2 ) <> 0 b2x2 := 0;
 If cfsGetProp ( 'b_SCR2_Стандартная_кнопка_1', cfpSize_Y,   b2y2 ) <> 0 b2y2 := 0;
 If cfsGetProp ( 'b_SCR2_Стандартная_кнопка_2', cfpOrigin_X, b3x1 ) <> 0 b3x1 := 0;
 If cfsGetProp ( 'b_SCR2_Стандартная_кнопка_2', cfpOrigin_Y, b3y1 ) <> 0 b3y1 := 0;
 If cfsGetProp ( 'b_SCR2_Стандартная_кнопка_2', cfpSize_X,   b3x2 ) <> 0 b3x2 := 0;
 If cfsGetProp ( 'b_SCR2_Стандартная_кнопка_2', cfpSize_Y,   b3y2 ) <> 0 b3y2 := 0;
 If cfsGetProp ( b2, cfpOrigin_X, b4x1 ) <> 0 b4x1 := 0;
 If cfsGetProp ( b2, cfpOrigin_Y, b4y1 ) <> 0 b4y1 := 0;
 If cfsGetProp ( b2, cfpSize_X,   b4x2 ) <> 0 b4x2 := 0;
 If cfsGetProp ( b2, cfpSize_Y,   b4y2 ) <> 0 b4y2 := 0;
 If cfsGetProp ( f1, cfpOrigin_X, f1x1 ) <> 0 f1x1 := 0;
 If cfsGetProp ( f1, cfpOrigin_Y, f1y1 ) <> 0 f1y1 := 0;
 If cfsGetProp ( f1, cfpSize_X,   f1x2 ) <> 0 f1x2 := 0;
 If cfsGetProp ( f1, cfpSize_Y,   f1y2 ) <> 0 f1y2 := 0;
 If cfsGetProp ( 'i_SCR3_S2', cfpOrigin_X, f2x1 ) <> 0 f2x1 := 0;
 If cfsGetProp ( 'i_SCR3_S2', cfpOrigin_Y, f2y1 ) <> 0 f2y1 := 0;
 If cfsGetProp ( 'i_SCR3_S2', cfpSize_X,   f2x2 ) <> 0 f2x2 := 0;
 If cfsGetProp ( 'i_SCR3_S2', cfpSize_Y,   f2y2 ) <> 0 f2y2 := 0;
 If cfsGetProp ( 'i_SCR3_S3', cfpOrigin_X, f3x1 ) <> 0 f3x1 := 0;
 If cfsGetProp ( 'i_SCR3_S3', cfpOrigin_Y, f3y1 ) <> 0 f3y1 := 0;
 If cfsGetProp ( 'i_SCR3_S3', cfpSize_X,   f3x2 ) <> 0 f3x2 := 0;
 If cfsGetProp ( 'i_SCR3_S3', cfpSize_Y,   f3y2 ) <> 0 f3y2 := 0;
 If cfsGetProp ( f2, cfpOrigin_X, f4x1 ) <> 0 f4x1 := 0;
 If cfsGetProp ( f2, cfpOrigin_Y, f4y1 ) <> 0 f4y1 := 0;
 If cfsGetProp ( f2, cfpSize_X,   f4x2 ) <> 0 f4x2 := 0;
 If cfsGetProp ( f2, cfpSize_Y,   f4y2 ) <> 0 f4y2 := 0;
 RescanPanel ( #x$users );
}; //Procedure Refresh
Screen scr1;
Show At ( ,,,9 );
Table x$users;
Fields
 'Параметр FontSize: ' + GetLongIntParameter ( 'WINDOWS', 'FONTSIZE', 0 ) : Skip;
                              b1x1 : skip, { FONT = { COLOR = If ( b1x1 <> b3x1, ColorSysRed, 0 ) } };
                              b1y1 : skip, { FONT = { COLOR = If ( b1y1 <> b2y1, ColorSysRed, 0 ) } };
                              b1x2 : skip, { FONT = { COLOR = If ( b1x2 <> b3x2, ColorSysRed, 0 ) } };
                              b1y2 : skip, { FONT = { COLOR = If ( b1y2 <> b2y2, ColorSysRed, 0 ) } };
                              b2x1 : skip;
                              b2y1 : skip;
                              b2x2 : skip;
                              b2y2 : skip;
 xPos : [ 5.3 ], noProtect;
                              b3x1 : skip;
                              b3y1 : skip;
                              b3x2 : skip;
                              b3y2 : skip;
                              b4x1 : skip, { FONT = { COLOR = If ( b4x1 <> b2x1, ColorSysRed, 0 ) } };
                              b4y1 : skip, { FONT = { COLOR = If ( b4y1 <> b3y1, ColorSysRed, 0 ) } };
                              b4x2 : skip, { FONT = { COLOR = If ( b4x2 <> b2x2, ColorSysRed, 0 ) } };
                              b4y2 : skip, { FONT = { COLOR = If ( b4y2 <> b3y2, ColorSysRed, 0 ) } };
 yPos : [ 5.3 ], noProtect;
 xSize : [ 5.3 ], noProtect;
                              f1x1 : skip, { FONT = { COLOR = If ( f1x1 <> f3x1, ColorSysRed, 0 ) } };
                              f1y1 : skip, { FONT = { COLOR = If ( f1y1 <> f2y1, ColorSysRed, 0 ) } };
                              f1x2 : skip, { FONT = { COLOR = If ( f1x2 <> f3x2, ColorSysRed, 0 ) } };
                              f1y2 : skip, { FONT = { COLOR = If ( f1y2 <> f2y2, ColorSysRed, 0 ) } };
                              f2x1 : skip;
                              f2y1 : skip;
                              f2x2 : skip;
                              f2y2 : skip;
 ySize : [ 5.3 ], noProtect;
                              f3x1 : skip;
                              f3y1 : skip;
                              f3x2 : skip;
                              f3y2 : skip;
                              f4x1 : skip, { FONT = { COLOR = If ( f4x1 <> f2x1, ColorSysRed, 0 ) } };
                              f4y1 : skip, { FONT = { COLOR = If ( f4y1 <> f3y1, ColorSysRed, 0 ) } };
                              f4x2 : skip, { FONT = { COLOR = If ( f4x2 <> f2x2, ColorSysRed, 0 ) } };
                              f4y2 : skip, { FONT = { COLOR = If ( f4y2 <> f3y2, ColorSysRed, 0 ) } };
Buttons
 cmValue10;
 cmValue11;
<<
 .@@@@@@@@@@@@@@@@@@@@@@@@@@@                  Координаты кнопок:
                                               .@@@.@@@.@@@.@@@  .@@@.@@@.@@@.@@@
 Коэффициент позиции x .@@@@@@@@@@@@           .@@@.@@@.@@@.@@@  .@@@.@@@.@@@.@@@
 Коэффициент позиции y .@@@@@@@@@@@@           Координаты полей:
 Коэффициент размера x .@@@@@@@@@@@@           .@@@.@@@.@@@.@@@  .@@@.@@@.@@@.@@@
 Коэффициент размера y .@@@@@@@@@@@@           .@@@.@@@.@@@.@@@  .@@@.@@@.@@@.@@@
                                  <. Создать объекты .>  <. Уничтожить объекты .>
>>
End;
Screen scr2;
Show At ( ,10,,14 );
Table x$users;
Fields
Buttons
 cmValue2;
 cmValue3;
<<
                                <. Стандартная кнопка 1 .>
  <.  Стандартная кнопка 2 .>
>>
End;
Screen scr3;
Show At ( ,15,, );
Table x$users;
Fields
 s2 : Protect;
 s3 : Protect;
<<
                                .@@@@@@@@@@@@@@@@@@@@@@@@@
  .@@@@@@@@@@@@@@@@@@@@@@@@@@
>>
End;
HandleEvent
cmValue10 :
 {
  MakeObjects;
  Refresh;
 };
cmValue11 :
 {
  DestroyObjects;
  Refresh;
 };
cmInit :
 {
  xPos := iCfs.GetKoefPosX;
  yPos := iCfs.GetKoefPosY;
  xSize := iCfs.GetKoefSizeX;
  ySize := iCfs.GetKoefSizeY;
  b1 := 0;
  b2 := 0;
  f1 := 0;
  f2 := 0;
  s1 := 'Динамическое поле 1';
  s2 := 'Стандартное поле 1';
  s3 := 'Стандартное поле 2';
  s4 := 'Динамическое поле 2';
  Refresh;
 }; //cmInit
End;
END.