-- Шаблон создан мастером бланков
-- 18.11.2004 13:25:39
--
БланкСШаблоном "Работа с WScript";
var buf[]:s;
var buf1[]:s;
var buf2[]:s;
var buf3[]:s;
var Printer_port[]:s;
var Printer_name[]:s;

Proc sendkeys1(st:s); -- "+"= shift; "%"=Alt; "^"=Ctrl
 var Wsh:AutoObject;
  if st = '':
     exit;
  fi;
  Wsh=CreateAutoObject("WScript.Shell");
  try
    Wsh.sendkeys(st);
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;
end;

--Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
--Const KEYEVENTF_KEYUP = &H2 'событие отпускания клавиши
--Const VK_LCONTROL = &HA2 ' Левый Ctrl
--Const VK_RCONTROL = &HA3 ' Правый Ctrl
--Const VK_ESCAPE = &H1B  'клавиша Escape
--Const VK_LWIN = &H5B 'левая клавиша, эмулирующая нажатие кнопки ПУСК
--Const VK_RWIN = &H5B 'левая клавиша, эмулирующая нажатие кнопки ПУСК
--Const VK_LMENU = &HA4 ' Левый Alt
--Const VK_RMENU = &HA5 ' Правый Alt
--Const VK_SHIFT = &H10 ' Shift
--
--Private Sub Command1_Click()
--    Call keybd_event(VK_LWIN, 0, 0, 0) 'Hажимаем
--    Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0) 'Отпускаем
--End Sub



Proc sendkeys(st:s); -- "+"= shift; "%"=Alt; "^"=Ctrl
 --Каждая клавиша задается своим символом. Например, чтобы задать нажатие друг за другом клавиш А, Б и В, нужно указать в качестве параметра строку "АБВ".
--Некоторые специальные символы следует всегда задавать заключенными в фигурные скобки. Перечень таких символов:
--{+} {^} {%} {~} {(} {)} {[} {]} {{} {}}
--Задание неотображаемых символов и специальных клавиш:
--<Backspace> - {BACKSPACE} или {BS} или {BKSP}
--<Break> - {BREAK}
--<Caps Lock> - {CAPSLOCK}
--<Delete> - {DELETE} или {DEL}
--<End> - {END}
--<Enter> - {ENTER} или ~
--<Esc> - {ESC}
--<Home> - {HOME}
--<Insert> - {INSERT} или {INS}
--<Num Lock> - {NUMLOCK}
--<Page Down> - {PGDN}
--<Page Up> - {PGUP}
--<Print Screen> - {PRTSC}
--<Scroll Lock> - {SCROLLLOCK}
--<Tab> - {TAB}
--<Up Arrow> - {UP}
--<Left Arrow> - {LEFT}
--<Down Arrow> - {DOWN}
--<Right Arrow> - {RIGHT}
--<F1> - {F1}
--<F2> - {F2}
--и т.д.
--<Shift> - +
--<Ctrl> - ^
--<Alt> - %
--Можно использовать скобки. Например, нажатие клавиш <G> и <S> при нажатом <Shift> следует записывать как "+(GS)". Запись "+GS" приведёт к нажатию клавиши <G> при нажатом <Shift>, а затем клавиши <S> уже без <Shift>.
--Задание нескольких нажатий: "{LEFT 42}" приведёт к нажатию клавиши <Left Arrow> 42 раза подряд, "{h 10}" приведёт к нажатию клавиши <h> 10 раз подряд.
--Метод не может быть использован для посылки нажатий клавиш в приложения MS-DOS.

-- ВНИМАНИЕ!!!! передача русских букв на латинской раскладке работает некорректно !!!
-- Всегда работает (при любой раскладке) передача латинских символов в фигурных скобках

 var Wsh:AutoObject;
  if st = '':
     exit;
  fi;
  Wsh=CreateAutoObject("WScript.Shell");
  try
    Wsh.sendkeys(st);
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;
end;

func getClipboardData:s;
 --WScript.CreateObject("HTMLFile").parentWindow.clipboardData.getData("text");
 var HTMLFile,parentWindow,clipboardData:AutoObject;
 var rez:s;
     HTMLFile=CreateAutoObject("HTMLFile");
--     HTMLFile=CreateAutoObject("WScript.HTMLFile");
     try
       parentWindow  = AsAutoObject(HTMLFile.parentWindow);
       clipboardData= AsAutoObject(parentWindow.clipboardData);
       rez= AsString(clipboardData.getData("text"));
       ClearVariable(clipboardData);
       ClearVariable(parentWindow);
       ClearVariable(HTMLFile);
     except
       ClearVariable(clipboardData);
       ClearVariable(parentWindow);
       ClearVariable(HTMLFile);
     end;
  ^rez;
end;


Func RegRead(Reg:s):s;
-- Пример: message(Раб.WSH.RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\DIC\TBW\6.9\ProfNet\Paths\INI'));

--Если "Reg" оканчивается символом "\", метод считывает значение по умолчанию для раздела, в противном случае считывается параметр. Параметр "Reg" должен начинаться с одного из корневых ключей:
--HKEY_CURRENT_USER - HKCU
--HKEY_LOCAL_MACHINE - HKLM
--HKEY_CLASSES_ROOT - HKCR
--HKEY_USERS - HKEY_USERS
--HKEY_CURRENT_CONFIG - HKEY_CURRENT_CONFIG

--<Name> - строка, наименование параметра или раздела.
--<Value> - значение параметра или значение для раздела по умолчанию.
--<Type> - необязательный, тип значения. Возможные значения: "REG_SZ", "REG_EXPAND_SZ", "REG_DWORD", "REG_BINARY". Если указано "REG_SZ" или "REG_EXPAND_SZ", параметр "Type" конвертируется в строку, если указано "REG_DWORD", параметр "Type" конвертируется в целое число, если указано "REG_BINARY", параметр "Type" должен быть целым числом.




--Set WshShell = CreateObject("WScript.Shell")
--WshShell.RegWrite "HKCU\NewKey\","Value"
--WshShell.RegWrite "HKEY_CURRENT_USER\NewKey\Param","Value","REG_SZ"
--MsgBox WshShell.RegRead("HKEY_CURRENT_USER\NewKey\Param")
--MsgBox WshShell.RegRead("HKEY_CURRENT_USER\NewKey\")
--WshShell.RegDelete "HKEY_CURRENT_USER\NewKey\Param"
--WshShell.RegDelete "HKEY_CURRENT_USER\NewKey\"

 var Wsh:AutoObject;
 var rez:s;
  Wsh=CreateAutoObject("WScript.Shell");
  try
    rez=AsString(Wsh.RegRead(Reg));
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;

  ^rez;
end;

Proc RegWrite(Reg:s;v:s;Type:s);
--<Type> - необязательный, тип значения. Возможные значения: "REG_SZ", "REG_EXPAND_SZ", "REG_DWORD", "REG_BINARY". Если указано "REG_SZ" или "REG_EXPAND_SZ", параметр "Type" конвертируется в строку, если указано "REG_DWORD", параметр "Type" конвертируется в целое число, если указано "REG_BINARY", параметр "Type" должен быть целым числом.
 var Wsh:AutoObject;
 var rez:s;
  if Type='':Type='REG_SZ';fi;
  Wsh=CreateAutoObject("WScript.Shell");
  try
    Wsh.RegWrite(Reg,v,Type);
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;
end;


Func GetDefaultPrinter:s;
 var rez:s;
 rez=trim(RegRead("HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"));
 if rez<>'':rez=ExtractWord(1,rez,',');fi;
  ^rez;
end;

Func GetCurrentPrinter:s;-- Возвращает текущий принтер в Турбо (перерыв между вызовами данной функции не менее 2 секунд)
 var rez:s;
 sendkeys('{ENTER}');
 if ChoosePrinter(rez,'')=cmOk:^rez;fi;
  ^rez;
end;




Proc GetPrinters; -- заполняет массивы Printer_port и Printer_name
 var j, z, k : i;
 var Wsh, Printers : AutoObject;
 var asport : l;

  ClearVariable(РАБ.WSH.Printer_port);
  ClearVariable(РАБ.WSH.Printer_name);

  Wsh = CreateAutoObject("WScript.Network");
  try
    Printers = AsAutoObject(Wsh.EnumPrinterConnections);
    z = AsInteger(Printers.Count) - 1;
    AsPort = false;
    k = 0;
    for j = 0..z do
     AsPort = not AsPort;
     if AsPort:
         k = k + 1;
         Printer_port[k] = AsString(Printers.Item(j));
      else
         Printer_name[k] = AsString(Printers.Item(j));
     fi;
    od;
    ClearVariable(Printers);
    ClearVariable(Wsh);
  except
    ClearVariable(Printers);
    ClearVariable(Wsh);
  end;
end;

Func ChoosePrinter(Default:l;ShowAll:l):s;
var rez:s;
var j,mx,x:i;

 if Default and not ShowAll:^GetDefaultPrinter;fi;

-- if not Default:
--    if ChoosePrinter(rez,'Выбор принтера...')=cmOk:^rez;fi;
--    ^'';
-- fi;

 j=LengthOfArray(РАБ.WSH.Printer_name);
 if trim(РАБ.WSH.Printer_name[1])='':GetPrinters;fi;
 j=LengthOfArray(РАБ.WSH.Printer_name);
 if j=1:^РАБ.WSH.Printer_name[j];fi;
 if trim(РАБ.WSH.Printer_name[1])='':^'';fi;
 for j=1..LengthOfArray(РАБ.WSH.Printer_name) do mx=max(mx,length(РАБ.WSH.Printer_name[j])); od;

 ClearVariable(РАБ.WSH.buf);
 CopyArray(РАБ.WSH.Printer_name,РАБ.WSH.buf);
 rez=GetDefaultPrinter;
 if rez<>'':
    j=SearchInArray(РАБ.WSH.buf,rez);
    if j>0:РАБ.WSH.buf[j]=РАБ.WSH.buf[j]+'--по умолчанию windows';x=length('по умолчанию windows');
    fi;
 fi;
 rez=GetCurrentPrinter;
 if rez<>'':
    j=SearchInArray(РАБ.WSH.buf,rez);
    if j<1:
      j=SearchInArray(РАБ.WSH.buf,rez+'--по умолчанию windows');
    fi;
    if j>0:
      if pos('--',РАБ.WSH.buf[j])>0:
         РАБ.WSH.buf[j]=РАБ.WSH.buf[j]+' и текущий в турбо';x=x+length(' и текущий в турбо');
       | true:
         РАБ.WSH.buf[j]=РАБ.WSH.buf[j]+'--текущий в турбо';
      fi;
    fi;
 fi;
 j=AlternateTree('Выбор принтера...',РАБ.WSH.buf,int((mx+x)*0.75),max(1,j),12,'','Принтер','Статус',int(mx*0.75),false);
 if j>0:^РАБ.WSH.Printer_name[j];
 fi;
 ^'';
end;

Func GetComputerName:s;
 var Wsh:AutoObject;
 var rez:s;
  Wsh = CreateAutoObject("WScript.Network");
  try
    rez=AsString(Wsh.ComputerName);
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;
  ^rez;
end;

Func GetUserName:s;
 var Wsh:AutoObject;
 var rez:s;
  Wsh = CreateAutoObject("WScript.Network");
  try
    rez=AsString(Wsh.UserName);
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;
  ^rez;
end;

Func GetUserDomain:s;
 var Wsh:AutoObject;
 var rez:s;
  Wsh = CreateAutoObject("WScript.Network");
  try
    rez=AsString(Wsh.UserDomain);
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;
  ^rez;
end;

Func exec_cmd_hide(cmd:s;wait:l):i;
 var x:i;
 var Wsh:AutoObject;
  Wsh=CreateAutoObject("WScript.Shell");
  try
    x=AsInteger(Wsh.Run(cmd,0,wait));
  finally
    ClearVariable(Wsh);
  end;
  ^x;
end;

Func ExecStdOut_to_Buf(cmd:s):integer; -- количество строк которые вернуло запущенное приложение
 var rez:i;
 var Wsh,WshExec,OutStream:AutoObject;
  ClearVariable(Раб.WSH.Buf);
  rez=0;
  Wsh=CreateAutoObject("WScript.Shell");
  try
    WshExec =AsAutoObject(Wsh.Exec(cmd));
    OutStream=AsAutoObject(WshExec.StdOut);
    While Not AsLogical(OutStream.AtEndOfStream) do
      rez=rez+1;
      buf[rez]=AsString(OutStream.ReadLine);
    od;
  finally
    ClearVariable(OutStream);
    ClearVariable(WshExec);
    ClearVariable(Wsh);
  end;
  ^rez;
end;

--WshExec.Terminate

--Раб.WSH.exec_cmd_hide('tasklist /fi "imagename eq tbw.exe" /fo csv /nh > c:\TB69Net\tasklist.txt',true);

--Set WshShell = CreateObject("WScript.Shell")
--Set WshExec = WshShell.Exec("nslookup")
--Set InStream = WshExec.StdIn
--InStream.WriteLine "help"
--InStream.WriteLine "exit"
--Set OutStream = WshExec.StdOut
--Str = vbNullString
--While Not OutStream.AtEndOfStream
--    Str = Str & Trim(OutStream.ReadLine()) & vbCrLf
--Wend
--MsgBox Str


--tasklist /fi "imagename eq tbw.exe" /fo csv /nh >tasklist.txt


--WshShell.Popup "Текст сообщения",, "Текст заголовка", 4+16

Proc Popup(msg:s);
 var Wsh:AutoObject;
  Wsh=CreateAutoObject("WScript.Shell");
  try
    Wsh.Popup(msg);
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;
end;

Func Get_ExpandEnvironmentStrings(par:s):s;-- возвращает ExpandEnvironmentStrings
 var Wsh:AutoObject;
 var rez:s;
  Wsh=CreateAutoObject("WScript.Shell");
  try
    rez=AsString(Wsh.ExpandEnvironmentStrings("%"+par+"%"));
    ClearVariable(Wsh);
  except
    ClearVariable(Wsh);
  end;
  ^rez;
end;

Func Get_PROCESSOR_ARCHITECTURE:s;-- возвращает разрядность текущего приложения (для ТБ всегда=х86)
 ^Get_ExpandEnvironmentStrings('PROCESSOR_ARCHITECTURE');
end;

Func Get_OS:s;-- возвращает OS
 ^Get_ExpandEnvironmentStrings('OS');
end;


--Set colItems = objService.ExecQuery("SELECT * FROM Win32_DesktopMonitor")
--
--MonitorInfo = "Основные параметры монитора компьютера" & vbCrLf & vbCrLf
--
--' Начинаем перебор коллекции
--For Each objItem in colItems
--    ' Начинаем перебор всех свойств для текущего экземпляра класса WMI
--    For Each objClassProperty In objItem.Properties_
--        ' Если значение больше 0
--        If Len(objClassProperty.value)>0 Then
--            MonitorInfo = MonitorInfo & objClassProperty.Name &"= " & objClassProperty.value &vbCrLf
--        End If
--    Next
--    MonitorInfo = MonitorInfo & "----------------------------------------------" &vbCrLf &vbCrLf
--Next


func getWin32_Process(exe:s):i;
 var locator,service,security_,Win32_Process:AutoObject;
 var CurrentItem:AutoObject;
 var cnt,j,k,r:i;
 var rez,exesql,exe_ExecStdOut:s;
     if exe<>'':
        cnt=wordscount(exe,'*');
        rez=exe;
        r=pos('*',rez);
        while r>0 do
          rez=SubStr(rez,1,r-1)+'%'+SubStr(rez,r+1,255);
          r=pos('*',rez);
        od;
        r=pos('?',rez);
        while r>0 do
          rez=SubStr(rez,1,r-1)+'_'+SubStr(rez,r+1,255);
          r=pos('?',rez);
        od;
        exesql=rez;
      | true:
        exesql='%';
     fi;

     locator=CreateAutoObject("WbemScripting.SWbemLocator");
     try
       service  = AsAutoObject(locator.connectServer());
       security_= AsAutoObject(service.security_);
       security_.impersonationLevel=3;


       Win32_Process =AsAutoObject(service.ExecQuery("Select * from Win32_Process Where Name like '"+exesql+"'"));
       cnt=AsInteger(Win32_Process.Count);
       ClearVariable(раб.wsh.buf);
       ClearVariable(раб.wsh.buf1);
       ClearVariable(раб.wsh.buf2);
       k=0;
       try
         for j=0..cnt-1 do
           CurrentItem= AsAutoObject(Win32_Process.itemindex(j));
           k=k+1;
           buf [k]=AsString(CurrentItem.Handle);
           buf1[k]=AsString(CurrentItem.Name);
           buf2[k]=AsString(CurrentItem.CommandLine);
           ClearVariable(CurrentItem);
         od;
       except
         exe_ExecStdOut='';
         if pos('*',exe)<1 and pos('?',exe)<1:exe_ExecStdOut=' /fi "imagename eq '+exe+'"';fi;
         r=ExecStdOut_to_Buf('tasklist'+exe_ExecStdOut+' /fo csv /nh');
         k=0;
         for j=1..r do
           rez=trim(ВыделитьСлово(1,buf[j],','));
           rez=SubStr(rez,2,Length(rez)-2);
           if match(rez,exe):
              k=k+1;
              buf1[k]=rez;
              rez=trim(ВыделитьСлово(2,buf[j],','));
              rez=SubStr(rez,2,Length(rez)-2);
              buf[k]=rez;
              CurrentItem= AsAutoObject(service.get("Win32_Process.handle="+rez));
              buf2[k]=AsString(CurrentItem.CommandLine);
              ClearVariable(CurrentItem);
           fi;
         od;
         for j=k+1..r do
           deletefromarray(buf,k+1);
         od;
       end;

       ClearVariable(Win32_Process);
       ClearVariable(security_);
       ClearVariable(service);
       ClearVariable(locator);
     except
       ClearVariable(Win32_Process);
       ClearVariable(security_);
       ClearVariable(service);
       ClearVariable(locator);
       возбудить;
     end;
  ^k;

end;

--Select * from Win32_Process Where Name = 'Notepad.exe'"
--В getKeyboardLayout() подсталяй этот хэндл и получишь его раскладку.

--Если нужно получить заголовок (title) окна, то последовательность:
--1) с помощью GetActiveWindow() получаешь hwnd на активное окно
--2) передаёшь полученный указатель в GetWindowText и получаешь заговок окна.

--Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
--Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2",UserName,Password)
--Set colItems = objWMIService.ExecQuery("Select * from Win32_Process",,48)

--For Each objItem In colItems
--    objItem.GetOwner strUserName, strUserDomain
--    Wscript.Echo "Process " & objItem.Name & " is owned by " _
--      & strUserDomain & "\" & strUserName & "."
--Next

--  int WINAPI GetWindowText(
--  _In_   HWND hWnd,
--  _Out_  LPTSTR lpString,
--  _In_   int nMaxCount
--);

func getScreenResolution:s;
 var locator,service,security_,video:AutoObject;
 var rez:s;
--  if pos('NT',get_OS)<1:
--     rez=RegRead('HKEY_CURRENT_CONFIG\Display\Settings\Resolution');
--   | true:

     locator=CreateAutoObject("WbemScripting.SWbemLocator");
     try
       service  = AsAutoObject(locator.connectServer());
       security_= AsAutoObject(service.security_);
       security_.impersonationLevel=3;
       video =AsAutoObject(service.get("Win32_VideoController.DeviceID='VideoController1'"));
       rez= AsString(video.currentHorizontalResolution)+','+AsString(video.currentVerticalResolution);
--CurrentBitsPerPixel --
--Caption -- название видеокарты
--CurrentNumberOfColors --Количество цветов, которые поддерживаются видеокартой при данных разрешениях
--DeviceID   --Идентификатор видеокарты, (CIM_LogicalDevice).
--PNPDeviceID -- Идентификатор Win32 данного устройства, (CIM_LogicalDevice)
--VideoModeDescription -- Информация о текущем разрешении, цвете и режиме развертки для видеокарты. (Цвета: 1680 x 1050 x 4294967296)

       ClearVariable(video);
       ClearVariable(security_);
       ClearVariable(service);
       ClearVariable(locator);
     except
       ClearVariable(video);
       ClearVariable(security_);
       ClearVariable(service);
       ClearVariable(locator);
     end;
--  fi;
  ^rez;
end;



Proc Menu_Print;
 sendkeys('{F7}');
end;

Proc Menu_Preview;
 sendkeys('{F7}');
 sendkeys('{ESC}');
end;

var buf_sendkeys[]:s;
var buf_sendkeys_deley[]:i;
var InputStr:s;
var ExecCmd[]:s;
Proc Exec(cmd:s);
 var z,j:i;
   if match(cmd,'fs#PutVariableI(cs#*,fi#int(fs#getClipboardData))'):
    cmd=SubStr(cmd,20,255);
    cmd=SubStr(cmd,1,pos(',fi#int(fs#getClipboardData))',cmd)-1);
    PutVariableI(cmd,int(getClipboardData));
    Exit;
   fi;
   z=WordsCount(cmd,'(),');
   for j=1..z do
     ExecCmd[j]=ExtractWord(j,cmd,'(),');
   od;
end;
func send_buf_sendkeys:i;-- отсылает последовательность нажатий и возвращяет задержку перед следующим посылом, если buf_sendkeys пуст то возврат -1
   var ln:i;
   ln=LengthOfArray(buf_sendkeys);
   if ln>0:
      if buf_sendkeys_deley[1]<0:
         Exec(buf_sendkeys[1]);
         ln=-buf_sendkeys_deley[1];
         DeleteFromArray(buf_sendkeys,1);
         DeleteFromArray(buf_sendkeys_deley,1);
         ^ln;
       | true:
         sendkeys(buf_sendkeys[1]);
         DeleteFromArray(buf_sendkeys,1);
         if ln>1:ln=buf_sendkeys_deley[1];
          | true:ln=-1;
         fi;
         DeleteFromArray(buf_sendkeys_deley,1);
         ^ln;
      fi;
   fi;
   ^-1;
end;
Proc OnTimerSendKey(Timer:s);
 var deley:i;
 var TimerSendKey:object;
     if FindObject(Timer,TimerSendKey):
        TimerSendKey.Active=false;
        deley=send_buf_sendkeys;
        if deley<0:TimerSendKey.Active=false;exit;
         | true   :TimerSendKey.Interval=max(1,deley); --TimerSendKey.Active=true;
        fi;
        TimerSendKey.Active=true;
     fi;
end;

Proc CopyToBufer_AutoScale(PasteTo:s;TypePasteTo:s;Timer:s;in:s);-- копирует в буфер обмена(аналог CTRL+INSERT) значение масштаба при котором бланк помещается по ширине при печати
-- PasteTo=Имя текстовой переменной для записи результата
var j,wc,lf,rf:i;
var bo:s;
var TimerSendKey:object;
  if FindObject(Timer,TimerSendKey):
     if AsLogical(TimerSendKey.Active):
        TimerSendKey.Active=false;
     fi;
     wc=WordsCount(in,';');
     ClearVariable(РАБ.WSH.buf_sendkeys);
     j=j+1;buf_sendkeys[j]='{F7}';
     buf_sendkeys_deley[j]=200;

     if wc>0:
        lf=int(trim(ExtractWord(1,in,';')));
        rf=int(trim(ExtractWord(2,in,';')));
        bo=(trim(ExtractWord(3,in,';')));
     fi;
     if lf+rf>0 or bo<>'':
       j=j+1;buf_sendkeys[j]='%{Y}';
       buf_sendkeys_deley[j]=200;
       j=j+1;buf_sendkeys[j]='+{TAB}^{HOME}';
       if bo<>'':
       buf_sendkeys[j]=buf_sendkeys[j]+'%'+if(bo='A' or bo='А','{F}','{R}');
       fi;
       if lf>0:
       buf_sendkeys[j]=buf_sendkeys[j]+'%{K}'+str(lf,if(trunc(lf)<lf,1,0));
       fi;
       if rf>0:
       buf_sendkeys[j]=buf_sendkeys[j]+'%{G}'+str(rf,if(trunc(rf)<rf,1,0));
       fi;
       buf_sendkeys_deley[j]=10;
       j=j+1;buf_sendkeys[j]='%{V}';
       buf_sendkeys_deley[j]=100;
       j=j+1;buf_sendkeys[j]='{ESC}';
       buf_sendkeys_deley[j]=100;
     fi;

     j=j+1;buf_sendkeys[j]='%{R}+{TAB}{ }%{V}';
     buf_sendkeys_deley[j]=200;
     j=j+1;buf_sendkeys[j]='%{Y}';
     buf_sendkeys_deley[j]=200;
     j=j+1;buf_sendkeys[j]='+{TAB}^{HOME}';
     buf_sendkeys_deley[j]=100;
     j=j+1;buf_sendkeys[j]='^{TAB 2}%{G}^({INSERT}){ESC}^{F4}{ESC}';
     buf_sendkeys_deley[j]=100;
     if PasteTo<>'':
        j=j+1;
        buf_sendkeys[j]='fs#PutVariable'+if(TypePasteTo<>'',TypePasteTo,'S')+'(cs#'+PasteTo+',fi#int(fs#getClipboardData))';
        buf_sendkeys_deley[j]=-1;
     fi;
     TimerSendKey.Interval=1;
     TimerSendKey.Active=true;
  fi;

--  OnTimerSendKey(Timer);
--   sendkeys('{F7}%{R}+{TAB}{ }%{V}%{Y}+{TAB}^{HOME}^{TAB 2}%{G}^({INSERT}){ESC}^{F4}{ESC}'+if(Paste,'+({INSERT})',''));
end;
Proc CopyToBufer_Field(PasteTo:s;TypePasteTo:s;Timer:s);-- копирует в буфер обмена(аналог CTRL+INSERT) значение масштаба при котором бланк помещается по ширине при печати
-- PasteTo=Имя текстовой переменной для записи результата
var j:i;
var TimerSendKey:object;
  if FindObject(Timer,TimerSendKey):
     if AsLogical(TimerSendKey.Active):
        TimerSendKey.Active=false;
     fi;
     ClearVariable(РАБ.WSH.buf_sendkeys);
     j=j+1;buf_sendkeys[j]='{F7}';
     buf_sendkeys_deley[j]=200;
     j=j+1;buf_sendkeys[j]='%{R}+{TAB}{ }%{V}';
     buf_sendkeys_deley[j]=200;
     j=j+1;buf_sendkeys[j]='%{Y}';
     buf_sendkeys_deley[j]=200;
     j=j+1;buf_sendkeys[j]='+{TAB}^{HOME}%{K}^({INSERT})';
     buf_sendkeys_deley[j]=10;
     j=j+1;
     buf_sendkeys[j]='fs#PutVariable'+if(TypePasteTo<>'',TypePasteTo,'S')+'(cs#'+ExtractWord(1,PasteTo,',')+',fi#int(fs#getClipboardData))';
     buf_sendkeys_deley[j]=-1;

     j=j+1;buf_sendkeys[j]='%{G}^({INSERT})';
     buf_sendkeys_deley[j]=10;
     j=j+1;
     buf_sendkeys[j]='fs#PutVariable'+if(TypePasteTo<>'',TypePasteTo,'S')+'(cs#'+ExtractWord(2,PasteTo,',')+',fi#int(fs#getClipboardData))';
     buf_sendkeys_deley[j]=-1;


     j=j+1;buf_sendkeys[j]='%{D}^({INSERT})';
     buf_sendkeys_deley[j]=10;
     j=j+1;
     buf_sendkeys[j]='fs#PutVariable'+if(TypePasteTo<>'',TypePasteTo,'S')+'(cs#'+ExtractWord(3,PasteTo,',')+',fi#int(fs#getClipboardData))';
     buf_sendkeys_deley[j]=-1;

     j=j+1;buf_sendkeys[j]='%{Y}^({INSERT})';
     buf_sendkeys_deley[j]=10;
     j=j+1;
     buf_sendkeys[j]='fs#PutVariable'+if(TypePasteTo<>'',TypePasteTo,'S')+'(cs#'+ExtractWord(4,PasteTo,',')+',fi#int(fs#getClipboardData))';
     buf_sendkeys_deley[j]=-1;

     if ExtractWord(5,PasteTo,',')='масштаб':
        j=j+1;buf_sendkeys[j]='^{TAB 2}%{G}^({INSERT})';
        buf_sendkeys_deley[j]=10;
        j=j+1;
        buf_sendkeys[j]='fs#PutVariable'+if(TypePasteTo<>'',TypePasteTo,'S')+'(cs#'+ExtractWord(5,PasteTo,',')+',fi#int(fs#getClipboardData))';
        buf_sendkeys_deley[j]=-1;

     fi;

     j=j+1;buf_sendkeys[j]='{ESC}^{F4}{ESC}';
     buf_sendkeys_deley[j]=10;

     TimerSendKey.Interval=700;
     TimerSendKey.Active=true;
  fi;

--  OnTimerSendKey(Timer);
--   sendkeys('{F7}%{R}+{TAB}{ }%{V}%{Y}+{TAB}^{HOME}^{TAB 2}%{G}^({INSERT}){ESC}^{F4}{ESC}'+if(Paste,'+({INSERT})',''));
end;


--Proc PutVariableS;
--end;
--func ExecuteFuncS:s;
--^'';
--end;



Proc SetMenu_Print(АвтоМасштаб:l;Масштаб:i;СтрВсе:i;СтрНач:i;СтрКон:i;КолКопий:i;Альбомная:l;exe:l;Timer:s); --меняет текщие настройки печати
-- нулевое значение параметра = игнорирование (не меняется), 1-true 2-false
-- exe=true - печать по примененным настройкам
-- Альбомная  - устанавливается альбомная
-- not Альбомная  - устанавливается книжная
var st :s;
var j:i;
var TimerSendKey:object;
  if FindObject(Timer,TimerSendKey):
     if AsLogical(TimerSendKey.Active):
        TimerSendKey.Active=false;
     fi;
     ClearVariable(РАБ.WSH.buf_sendkeys);
     j=j+1;buf_sendkeys[j]='{F7}';
     buf_sendkeys_deley[j]=200;
     j=j+1;buf_sendkeys[j]='';
     buf_sendkeys_deley[j]=200;
     if АвтоМасштаб:buf_sendkeys[j]=buf_sendkeys[j]+'%{R}+{TAB}{ }';fi;
     if СтрВсе=2 and (СтрНач>0 or СтрКон>0):buf_sendkeys[j]=buf_sendkeys[j]+'%{N}';
        if СтрНач>0:buf_sendkeys[j]=buf_sendkeys[j]+'{TAB}'+str(СтрНач);if СтрКон>0:buf_sendkeys[j]=buf_sendkeys[j]+'{TAB}';fi;
         | true:buf_sendkeys[j]=buf_sendkeys[j]+'{TAB 2}';
        fi;
        if СтрКон>0:buf_sendkeys[j]=buf_sendkeys[j]+str(СтрКон);fi;
      | СтрВсе=1:buf_sendkeys[j]=buf_sendkeys[j]+'%{D}';
     fi;
     if КолКопий>0:buf_sendkeys[j]=buf_sendkeys[j]+'%{R}'+str(КолКопий);
     fi;
     buf_sendkeys[j]=buf_sendkeys[j]+'%{V}';
     if (not АвтоМасштаб and Масштаб>0):
        j=j+1;buf_sendkeys[j]='';
        buf_sendkeys_deley[j]=200;

        buf_sendkeys[j]=buf_sendkeys[j]+'%{Y}+{TAB}^{HOME}';--зашли в настройки
        if Альбомная:buf_sendkeys[j]=buf_sendkeys[j]+'%{F}'; -- альбомная
         | true     :buf_sendkeys[j]=buf_sendkeys[j]+'%{R}'; -- книжная
        fi;
        if (not АвтоМасштаб and Масштаб>0):
           buf_sendkeys[j]=buf_sendkeys[j]+'+{TAB 2}';-- поднялись на закладку
           buf_sendkeys[j]=buf_sendkeys[j]+'^{TAB 2}%{G}'+str(Масштаб);-- масштаб
        fi;
        buf_sendkeys[j]=buf_sendkeys[j]+'%{V}{ESC}';--применить и выход из настроек
     fi;

     j=j+1;buf_sendkeys[j]='';
     buf_sendkeys_deley[j]=200;
     if exe:buf_sendkeys[j]=buf_sendkeys[j]+'({ENTER})'; -- на печать
      | true:buf_sendkeys[j]=buf_sendkeys[j]+'^{F4}{ESC}';-- закрыли окна
     fi;
     TimerSendKey.Interval=700;
     TimerSendKey.Active=true;
     exit;
  fi;

 st='{F7}';
 if АвтоМасштаб:st=st+'%{R}+{TAB}{ }';fi;
 if СтрВсе=2 and (СтрНач>0 or СтрКон>0):st=st+'%{N}';
    if СтрНач>0:st=st+'{TAB}'+str(СтрНач);if СтрКон>0:st=st+'{TAB}';fi;
     | true:st=st+'{TAB 2}';
    fi;
    if СтрКон>0:st=st+str(СтрКон);fi;
  | СтрВсе=1:st=st+'%{D}';
 fi;
 if КолКопий>0:st=st+'%{R}'+str(КолКопий);
 fi;
 st=st+'%{V}';
 if (not АвтоМасштаб and Масштаб>0):
    st=st+'%{Y}+{TAB}^{HOME}';--зашли в настройки
    if Альбомная:st=st+'%{F}'; -- альбомная
     | true     :st=st+'%{R}'; -- книжная
    fi;
    if (not АвтоМасштаб and Масштаб>0):
       st=st+'+{TAB 2}';-- поднялись на закладку
       st=st+'^{TAB 2}%{G}'+str(Масштаб);-- масштаб
    fi;
    st=st+'%{V}{ESC}';--применить и выход из настроек
 fi;
 if exe:st=st+'({ENTER})'; -- на печать
  | true:st=st+'^{F4}{ESC}';-- закрыли окна
 fi;
--    РАБ.WSH.sendkeys('{F7}{TAB 4}{ }%{V}%{Y}+{TAB}^{HOME}^{TAB 2}%{G}^({INSERT}){ESC}^{F4}{ESC}{RIGHT 3}+({INSERT})');

 sendkeys(st);
end;

Proc CopyToBufer;-- скопировать в буфер обмена
 sendkeys('^({INSERT})');
end;
Proc PasteFromBufer;-- вставить из буфера обмена
 sendkeys('+({INSERT})');
end;

Proc Menu_Search(PasteFromBufer :l; Type:i; Exe_Search:l); -- открывает стандартный диалог поиска
-- PasteFromBufer=вставить в строку поиска содержимое буфера обмена
-- Type=1, - поиск подстроки
-- Type=2, - поиск слова
-- Type=3, - поиск регулярного выражения
-- Exe_Search= выполнить поиск
var st :s;
  st = '^({S})';
  if PasteFromBufer:
    st = st+'+({INSERT})';
  fi;
  if Type=1:st = st+ '%({G})'; -- подстроки
   | Type=2:st = st+ '%({C})'; -- слова
   | Type=3:st = st+ '%({D})'; -- выражения
  fi;
  if Exe_Search:
     st =st+'~';
  fi;
  sendkeys(st);
---------------------------------------------------------------------------------
-- пример
-- Шаблон.Поле=СтрокаПоиска; -- ставим фокус на клетку со строкой поиска
-- Раб.WSH.CopyToBufer; -- копируем содержимое клетки строки поиска в буфер обмена
-- Раб.WSH.Menu_Search(true, 1, true); -- открываем меню поиска,
-- 1 параметр=true = вставляем в строку поиска содержимое буфера обмена, 
-- 2 параметр=1 = устанавливаем параметр поиска=поиск подстроки,
-- 3 параметр=true = сразу выполняем поиск, закрывая окно поиска
end;

Proc Menu_Search_Repeat;
 sendkeys('^({L})');
end;



Конец