VKBDSRV - Virtual KeyBoard Server.


Назначение

Сервер &VKBDSRV обеспечивает Виртуальную Клавиатуру для редактирования тегов в системах, где вместо обычной клавиатуры и мыши используются сенсорные экраны.

Сервер имеет две мнемосхемы - стандартную, пригодную для экранов от 640*480 до 1280*1024, а также большую для экранов от 1280*800 и выше. Выбор мнемосхемы делается в конфигурации.

В начало


Принцип работы

Сервер &VKBDSRV работает автономно и взаимодействует с клиентской программой только через сообщения.

Сервер &VKBDSRV имеет ряд команд-сообщений, которые рекомендуется передавать одним сообщением в виде длинной строки текста, разделенной символами CRLF на строки, через функцию VkbdSend, имеющуюся в шаблонах редактирования. В командах передается начальный редактируемый текст, "предыдущее значение", текст метки для комментария, набор допустимых символов, язык и регистр символов. Очень важно также, что при вызове клиент передает серверу шаблон ответного сообщения, которое будет передано клиенту при нажатии кнопки Ok в конце редактирования. Клиент же должен уметь обрабатывать это сообщение, присланное сервером.

Таким образом, клиент посылает серверу задание на редактирование, в которое включен шаблон ответного сообщения, а после завершения редактирования получает ответное сообщение по этому шаблону, содержащее отредактированный текст.

В начало


Посылка задания

При вызове окна виртуальной клавиатуры рекомендуется передавать все команды в одном длинном сообщении, разделяя команды символами CRLF, а также рекомендуется использовать стандартную функцию VkbdSend, которая имеется в шаблонах редактирования.

Пример вызова вещественного тега с именем Demo:

   InitTag(tagDemo,'Demo',2);
   ...
   // Если нажат сенсор...
   if ClickButton=1 then begin
    // Начать редактирование тега...
    if ClickTag=tagDemo then
    if VKbdSend('@Home'+CRLF+'@State=3'
          +CRLF+'@CharSet='+Url_Packed('0123456789.eE-+*/%$()')
          +CRLF+'@Language='+Str(iGetTag(tagLanguage))
          +CRLF+'@Label=Введите тег Demo.'
          +CRLF+'@Text='+Str(rGetTag(tagDemo))
          +CRLF+'@Prev='+Str(rGetTag(tagDemo))
          +CRLF+'@DevMsg='+DevName+' @Vkbd.EditTag '+NameTag(tagDemo)+'=%Text%'
          +CRLF+'@WinShow'+CRLF+'@WinSelect'
          +CRLF)>0
    then begin b:=Voice(snd_Click); Speak('Отредактируйте тег Demo.'); end
    else begin b:=Voice(snd_Fails); Trouble('Could not call VKBD!');  end;
   end;
  
Соответственно клиент должен обрабатывать на сообщение @Vkbd.EditTag Demo=...

Для упрощения вызова редактора в шаблонах есть функция VkbdEditTag, с использованием которой вызов сокращается до:

   InitTag(tagDemo,'Demo',2);
   ...
   // Если нажат сенсор...
   if ClickButton=1 then begin
    // Начать редактирование тега...
    if ClickTag=tagDemo then
    if VKbdEditTag(tagDemo,iGetTag(tagLanguage),3,'Введите тег Demo.')>0
    then begin b:=Voice(snd_Click); Speak('Отредактируйте тег Demo.'); end
    else begin b:=Voice(snd_Fails); Trouble('Could not call VKBD!');  end;
   end;
  
При этом функция VkbdEditTag вызывает функцию VkbdSend c набором наиболее "ходовых" параметров редактирования.

В начало


Обработка ответа

При вызове окна клиент посылает серверу шаблон сообщения, которое он желает получить от сервера по окончании редактирования. При нажатии Ok сервер посылает клиенту сообщение, заменив шаблон на отредактированный текст. Например, шаблон

@DevMsg=&Client @Vkbd.EditTag Demo=%Text%
при значении отредактированного текста "123.45" заменяется на сообщение:
DevSendMsg('&Client @Vkbd.EditTag Demo=123.45');
Клиент должен уметь обрабатывать это сообщение.

Пример обработки сообщения:

     {
     Analyse data coming from standard input.
     }
     procedure StdIn_Process(Data:string);
     var cmd,arg:String; b:Boolean; tag:Integer;
     begin
      {
      "@cmd=arg" or "@cmd args" commands:
      }
      cmd:='';
      arg:='';
      if Length(Data)>0 then
      if Data[1]='@' then begin
       cmd:=ExtractWord(1,Data);
       arg:=Copy(Data,Pos(cmd,Data)+Length(cmd)+1);
       {}
       if IsSameText(cmd,'@Vkbd.EditTag') then begin
        tag:=FindTag(ExtractWord(1,arg));
        if TypeTag(tag)>0 then begin
         if tag=tagDemo then UpdateTag(tag,SkipWords(1,arg),_MinusInf,_PlusInf);
         Success(cmd+' '+NameTag(tag)+'='+TagAsText(tag));
        end;
        Data:='';
       end;
       {}
       if Length(Data)>0 then begin
        Trouble(' Unrecognized command "'+Data+'".');
        Data:='';
       end;
      end;
      cmd:='';
      arg:='';
     end;
  
Функции SkipWords,UpdateTag,TagAsText есть в шаблонах редактирования.

В начало


Конфигурация

Чтобы использовать &VKBDSRV, клиент должен включить в конфигурацию:

  [ConfigFileList]
  ConfigFile = ~~\Resource\DaqSite\VkbdServer\VkbdSrv.cfg
  
На больших экранах (не менее 1280x800) можно использовать большую мнемосхему, если на сенсорном экране трудно попадать по кнопкам мнемосхемы стандартного размера. Для того, чтобы использовать мнемосхему большого размера, надо включить в конфигурацию:
  [&VkbdSrv.Ctrl]
  Circuit = ~~\Resource\DaqSite\VkbdServer\Huge\VkbdSrv.crc
  
Кроме того, для включения речевых эффектов может потребоваться добавление сервера речевых сообщений &SPEAKSRV и активизация одного из речевых "движков":
  [ConfigFileList]
  ConfigFile = ~~\Resource\DaqSite\SpeakServer\SpeakSrv.cfg
  [&SpeakSrv]
  Engine = Adult Female #1 Russian (L&H)
  

После вставки этих фрагментов в конфигурацию в системе должно появиться устройство &VKBDSRV, а также окно &VKBDSRV.CTRL с мнемосхемой, в начале скрытой.

Чтобы избежать пересечений имен, не рекомендуется использовать теги, начинающиеся на "&VKBDSRV.", так как все теги сервера &VKBDSRV начинаются на этот префикс и его можно считать зарезервированным для сервера &VKBDSRV.

В начало


Сообщения

Сервер &VKBDSRV работает автономно и взаимодействует с клиентской программой через сообщения.
Вот список сообщений от клиента серверу &VKBDSRV:

Сообщения от сервера клиенту по окончании редактирования задаются самим клиентом через сообщение @DevMsg, поэтому клиентский код должен сам позаботиться о формате этого сообщения и о его корректной обработке.

Однако для облегчения работы в шаблонах есть функция VkbdEditTag, которая использует наиболее "ходовой" шаблон сообщения со значением по умолчанию @Vkbd.EditTag. Если точнее, команда для тега tag формируется как '@DevMsg='+DevName+' @Vkbd.EditTag '+NameTag(tag)+'=%Text%'.

В этом случае клиент будет получать сообщение @Vkbd.EditTag имя_тега=значение.

См. также пример вызова.

В начало