Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Фокус на объект  (Прочитано 2757 раз)

Серега

  • Старожил
  • ****
  • Сообщений: 290
    • Просмотр профиля
Фокус на объект
« : 20 Декабря 2018, 11:21:22 »
Добрый день!
Ситуация.
Есть таблица. В ней отображаются данные SQL запроса. Необходимо из первого (начинаем отсчет с 0) столбца таблицы и выделенной строки взять текст ячейки на пересечении (если нет выделенной то значение RowIndex = -1).
После этого добавить к этому тексту следующий текст "_SPI_Set" и присвоить это переменной, которая используется для подмены переменных.
Есть 2 скрипта универсальный (привязан к кнопке) и секундный. Пытались сделать одинаковые (по смыслу и тексту) скрипты.
Надеюсь понятно объяснил.
Теперь вопросы.
В1. Выражение var:=table.Columns(1).Cells(table.RowIndex).Text +  "_SPI_Set", где var:string, Text: UTF8String  считаем текст в скобочках тоже string в универсальном скрипте работает, в секундном нет. При этом если использовать преобразование типов UTF8toStr секундный все равно не работает. Почему?
В2. Поставили маяки значений. Вывели на экран. Кратко - использовали if. Т.е.:
Код: (delphi)
...
  metka := $FFFF;
  if True then
    metka := $F000
  else
    begin
      metka := $000F;
      exit;
    end;
...
В результате значение metka:=$FFFF не увидели. Предполагаем это происходило во время перезапуска проекта. По кнопке универсальный скрипт работает. Секундный нет, вернее всего скорей работает поскольку значение metka:=$000F и не меняется. Используется ли в скриптах или свойствах объектов привязка к экрану или есть механизм фокуса на объекте? Возможно поэтому секундный скрипт и не работает поскольку "не знает своей привязки"?
Задавайте вопросы.
« Изменён: 20 Декабря 2018, 16:15:07 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3217
    • Просмотр профиля
    • Simple-Scada
Re: Фокус на объект
« Ответ #1 : 21 Декабря 2018, 12:04:37 »
Здравствуйте.

Цитировать
Есть таблица. В ней отображаются данные SQL запроса. Необходимо из первого (начинаем отсчет с 0) столбца таблицы и выделенной строки взять текст ячейки на пересечении (если нет выделенной то значение RowIndex = -1). После этого добавить к этому тексту следующий текст "_SPI_Set" и присвоить это переменной, которая используется для подмены переменных.
Вот код, который решает данную задачу:
Код: (delphi)
var
  aCell: TM_TableCell;
  aFindName: string;
  aVariable: TM_Variable;
begin
  { берём ячейку на пересечении первого столбца и выделенной строки  }
  aCell := Table1.GetCell(0, Table1.RowIndex);
  if aCell <> nil then
  begin
    { формируем имя для поиска переменной }
    aFindName := aCell.Text + '_SPI_Set';
    { ищем переменную }
    aVariable := GetVariableByName(aFindName);
    { если переменная найдена, то выполняем с неё действия }
    if aVariable <> nil then
      aVariable.Value := Random(1000);
  end;
end.

Цитировать
Есть 2 скрипта универсальный (привязан к кнопке) и секундный. Пытались сделать одинаковые (по смыслу и тексту) скрипты.
Код, приведённый выше имеет смысл назначать только на события, которые производит клиент (как клик мышью), т.к. тогда сервер будет знать какая строка выделена в таблице. Если выполнять скрипт в секундном скрипте, то никакой привязки к клиенту не будет, т.к. неизвестно для какого клиента нужно брать выделенную строку (Table1.RowIndex). Представьте, что у Вас есть два клиента подключенных к проекту. Один выделил первую строку. Другой - вторую. С какой строкой серверу нужно работать в Table1.RowIndex? Поэтому Table1.RowIndex нужно использовать только в тех скриптах, которые вызываются клиентом, чтобы сервер знал с каким клиентом он сейчас работает.

Цитировать
В результате значение metka:=$FFFF не увидели.
И не должны были увидеть. Ведь у Вас дальше идёт условие "if True then metka := $F000", которое всегда истина. Значит скрипт будет всегда выполнять присвоение "metka := $F000".

Цитировать
Используется ли в скриптах или свойствах объектов привязка к экрану или есть механизм фокуса на объекте? Возможно поэтому секундный скрипт и не работает поскольку "не знает своей привязки"?
Нет, такого механизма нет. Есть только скрипты которые вызываются клиентом и в них сервер знает о том с каким именно клиентом работает (в том числе может получить имя клиента через GetClientName) и скрипты, которые вызываются сервером (в них информация о клиенте отсутствует).
« Изменён: 21 Декабря 2018, 12:07:33 от Simple-Scada »

Серега

  • Старожил
  • ****
  • Сообщений: 290
    • Просмотр профиля
Re: Фокус на объект
« Ответ #2 : 21 Декабря 2018, 12:55:38 »
Добрый день!
Спасибо за ответ.
Пока ждали ответ, в ходе тестов на 99% стали уверенными, что фокуса нет, а есть скрипты на клиенте и сервере. Но Ваш ответ придал нам уверенности.  ;D
Жаль конечно придется концепцию менять. Хотя это даже к лучшему. Ну а с таблицей будем пробовать.
Еще раз спасибо.