Да это будет работать хорошо. Однако в любом случае действительно необходимо поместить другую запись в перечисление, определяющее значение количества объектов:
enum ButtonState {
BUTTON_NORMAL,
BUTTON_PRESSED,
BUTTON_CLICKED,
STATE_COUNT
};
Тогда можно определить массив как
Color colors[STATE_COUNT];
иначе, это - путаница для хранения суммы состояний синхронной с размером массива. Перечисления будут всегда запускаться с нуля, если не иначе инициализированный, и затем каждой дополнительной записи присвоят значение один выше предыдущего, если не иначе инициализированный. Конечно, также не причинило бы боль при помещении нуля явно, если Вы хотите. Если бы Вы не возражаете против дополнительного кода, я обернул бы доступ к необработанному массиву с помощью функции как
Color & operator[](ButtonState state) {
return array[state];
}
Или эквивалент getColor
функция, передающая запрос. Это запретило бы непосредственно индексацию массива с некоторым целым числом, которое почти наверняка в какой-то момент перестанет работать, потому что каждый понимает индексы превратно.
procedure TForm1.WMEnterSizeMove(var Message:TWMMove);
begin
Self.DisableAlign;
end;
procedure TForm1.WMExitSizeMove(var Message:TWMMove);
begin
Self.EnableAlign;
end;
Попробуйте использовать WM_SETREDRAW ( не LockWindowUpdate ).
Вы также можете посмотреть DeferWindowPos .
Сложные формы часто состоят из вложенных панелей, и процесс перерисовки может вызвать мерцание. Если это так с вашим проектом, есть два простых решения, которые могут помочь:
FullRepaint
на ваших панелях. DoubleBuffered
в вашей форме. Вы не найдете это свойство в инспекторе объектов, поэтому поместите DoubleBuffered: = true;
в FormCreate. Я обошел это следующим образом:
Поэкспериментировав с этим действием, вы получите форму, которая становится пустой, пока вы ее изменяете, но затем аккуратно заполняет себя, когда вы "отпустить".
Bri