Я тут пробежался по граблям и решил что конечный вариант может пригодиться не только мне...
Если возникает проблема в получении из одного регистра нескольких значений и их обратной записи. Например биты управляющих сигналов, или побайтная запись в ворд... Мало ли как могут изгольнуться производители.
Предлагается построить следующую конструкцию: ОРС переменная, локальные переменные для каждого параметра, элементы управления для каждого параметра, скрипты:
OnChange
var
Mask,Pos:byte;
begin
if not (Sender is TM_Object) then Exit;
with Sender as TM_Object do
if (Variable <> nil) and (VariableEx <> nil) then
begin
Mask:=Round(Power(2, (tag shr 4))-1); //bitMask
Pos:= Tag and 15;
VariableEx.Value := VariableEx.Value and ((Mask shl Pos) xor 65535) + (Value shl Pos);
end;
end.
OnChangeEx
var
Mask,Pos:byte;
begin
if not (Sender is TM_Object) then Exit;
with Sender as TM_Object do
if (Variable <> nil) and (VariableEx <> nil) then
begin
Mask:=Round(Power(2, (tag shr 4))-1); //bitMask
Pos:= Tag and 15;
Value := (VariableEx.Value shr Pos) and Mask;
end;
end.
К управляющему элементу привязываем переменную(локальная), доп.переменную (ОРС), скрипты и устанавливаем тег:
16*к-во_бит + стартовый_бит. (например младший байт тег 16*8+0=128, старший 16*8+8=136, или побитно 16*1+х = 16,17,18...31)
ВСЕ! Наше поле меняет и отображает только заданную часть ОРС переменной