Здравствуйте.
Возможная ошибка - дисбаланс между операторами begin и end. Получить диагностику можно при предварительной компиляции кода по нажатию Shift + F9.
Но начинать надо с алгоритма. Судя по строке скрипта:
if Field1.AsInt > Field2.AsInt and Field3.AsInt and Field4.AsInt then Field1.Color := 4;
в предположении что подразумевалось сравнение переменной поля Field1 на превышение над переменными прочих полей:
if (Field1.AsInt > Field2.AsInt) and (Field1.AsInt > Field3.AsInt) and (Field1.AsInt > Field4.AsInt) then
Field1.Color := clRed;
с последующими сравнениями на превышение двух, одной переменных и меньше всех переменных.
Скрипт раскрашивает объект и для каждого объекта необходим свой экземпляр. Кроме того цвет не корректируется для остальных объектов.
Для вызова скрипта раскраски в прочих объектах можно использовать скрипт, вызываемый по аналогичному событию - либо пара событий по изменению основной и совпадающей с ней дополнительной переменной, либо для объекта "Поле" по вводу и изменению основной переменной.
Универсальный скрипт раскраски реализован как подсчет числа превышений значения основной переменной объекта по ВСЕМУ набору переменных:
Procedure Field_OnDataChange(Sender: TM_Control);
var i,j: integer;
begin
with Sender as TM_Object do begin
j := 0; // счётчик превышений
for i := 1 to 4 do
if AsInt > GetObjectByName('Field' + IntToStr(i)).Variable.AsInt then
j := j + 1; // встретилась переменная, имеющая значение большее чем у основной
case j of // перевод числа превышений в цвет объекта
0: Color := clGreen;
1: Color := clYellow;
2: Color := clFuchsia;
3: Color := clRed;
end;
// здесь может быть код для ещё каких-либо действий с объектом, например вывод значения в поле Text
end;
end.
Скрипт вызова скрипта раскраски во всех прочих объектах/ во всех объектах:
Procedure Field_OnDataExChange(Sender: TM_Control);
var i: integer;
begin
with Sender as TM_Object do
for i := 1 to 4 do
GetObjectByName('Field' + IntToStr(i)).OnDataChangeEvent; // скрипт раскраски у объекта с изменившейся переменной вызывается дважды
// if Tag <> i then GetObjectByName('Field' + IntToStr(i)).OnDataChangeEvent; // скрипт вызывается один раз, но приходится идентифицировать объект свойством Tag
end.
Пример во вложении.
P.S. Вопрос раскраски объектов с одинаковыми значениями переменных остался открытым.