Добрый день!
Ситуация.
Есть таблица. В ней отображаются данные 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. Т.е.:
...
metka := $FFFF;
if True then
metka := $F000
else
begin
metka := $000F;
exit;
end;
...
В результате значение metka:=$FFFF не увидели. Предполагаем это происходило во время перезапуска проекта. По кнопке универсальный скрипт работает. Секундный нет, вернее всего скорей работает поскольку значение metka:=$000F и не меняется. Используется ли в скриптах или свойствах объектов привязка к экрану или есть механизм фокуса на объекте? Возможно поэтому секундный скрипт и не работает поскольку "не знает своей привязки"?
Задавайте вопросы.
Здравствуйте.
Есть таблица. В ней отображаются данные SQL запроса. Необходимо из первого (начинаем отсчет с 0) столбца таблицы и выделенной строки взять текст ячейки на пересечении (если нет выделенной то значение RowIndex = -1). После этого добавить к этому тексту следующий текст "_SPI_Set" и присвоить это переменной, которая используется для подмены переменных.
Вот код, который решает данную задачу:
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) и скрипты, которые вызываются сервером (в них информация о клиенте отсутствует).