Проблема в том, что вариантная часть записи должна быть последней частью записи, в то время как поля недопустимы под методами и свойствами в списке членов. Это затрудняет объединение двух функций. Однако существуют различные способы эффективно обойти это ограничение.
Метод 1: фиктивная запись
Вы можете использовать фиктивную запись для вариантной детали:
type
TTest = record
Name: string;
Age: Integer;
Dummy: record
case Byte of
0: (Data: Integer);
1: (Tag: Byte);
end;
procedure Test;
end;
Это имеет видимый эффект, который вам нужно написать t.Dummy.Data
вместо t.Data
.
Метод 2: Помощник записи
Если это недопустимо, вы можете использовать помощник записи :
type
TTest = record
Name: string;
Age: Integer;
case Byte of
0: (Data: Integer);
1: (Tag: Byte);
end;
TTestHelper = record helper for TTest
procedure Test;
end;
procedure TTestHelper.Test;
begin
ShowMessage(Name);
ShowMessage(Age.ToString);
ShowMessage(Data.ToHexString);
end;
Метод 3: Использовать ключевое слово видимости в качестве разделителя
Дэвид Хеффернан предложил в комментарии, что вы можете использовать ключевое слово public
visibility, чтобы обойти ограничение syntacti c, которое вы наблюдаете. Используя это ключевое слово, вы можете написать
type
TTest = packed record
procedure Test;
public
Name: string;
Age: Integer;
case Byte of
0: (Data: Integer);
1: (Tag: Byte);
end;
, который не имеет нежелательных побочных эффектов. Это связано с тем, что видимость по умолчанию - publi c, поэтому все члены публикуются c - как до, так и после public
.
.