Броски опасны, потому что вы выходите за пределы системы проверки типов. Это застало тебя здесь. Проблема в том, что 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
обойдет подсчет ссылок динамического массива. Поэтому вам нужно по-настоящему понять, что вы делаете, если идете по этому пути.
Один последний момент. Если вы когда-нибудь захотите скомпилировать этот код для 64-битного кода, он потерпит неудачу из-за этой строки:
ComboBox.Tag := integer(@arrWidth);
, поскольку integer
- это 32-битный тип данных. Вместо этого вы должны использовать NativeInt
, которое является целым числом той же ширины, что и указатель.
ComboBox.Tag := NativeInt(@arrWidth);