Ответ 1
Броски опасны, потому что вы выходите за пределы системы проверки типов. Это вас поймало. Проблема в том, что array[1..4] of integer
и array of integer
не являются одинаковыми.
Вам нужно объявить массив как отдельный тип, подобный этому
TWidthArray = array [1..4] of Integer;
PWidthArray = ^TWidthArray;
Затем сделайте свою константу следующим образом:
const
arrWidth: TWidthArray = (100,100,100,70);
Когда вам нужно извлечь массив из поля со списком, сделайте следующее:
Widths: TWidthArray;
...
Widths := PWidthArray(ComboBox.Tag)^;
Если вам нужно поддерживать использование динамических массивов, вам нужно будет изменить свой общий тип, чтобы это отразить. Однако будьте осторожны с тем, что приведение Integer
к Tag
при вводе Tag
приведет к обходу подсчета ссылок динамического массива. Поэтому вам нужно действительно понять, что вы делаете, если спуститесь по этому маршруту.
Один последний момент. Если вы захотите скомпилировать этот код для 64-битного, это приведет к сбою из-за этой строки:
ComboBox.Tag := integer(@arrWidth);
так как Integer
- это 32-битный тип данных. Вместо этого вы должны использовать NativeInt
, который является целым числом той же ширины, что и указатель.
ComboBox.Tag := NativeInt(@arrWidth);