Если у вас ADT версии 12+, вы должны обновить Proguard с 4.4 -> 4.6 (как описано здесь здесь ). Кроме того, вы должны оставить файл ... \ bin \ proguard.bat в оригинальной форме.
Просто скачайте его из Интернета и скопируйте папку lib из загруженного пакета в:
[Каталог установки Android SDK] \ tools \ proguard \ lib
Попробуйте следующее:
procedure TBlock.SetField(var Field: Double; const Value: Double);
var
OldValue: Double;
begin
OldValue := Field;
DoOnChanging(OldValue, Value);
Field := Value;
DoOnChanged(OldValue, Value);
end;
procedure TBlock.SetWeightIn(const Value: Double);
begin
SetField(FWeightIn, Value);
end;
procedure TBlock.SetWeightOut(const Value: Double);
begin
SetField(FWeightOut, Value);
end;
Delphi поддерживает индексированных свойств . Несколько свойств могут совместно использовать один геттер или сеттер, дифференцированный по порядковому индексу:
type
TWeightType = (wtIn, wtOut);
TBlock = class
private
procedure SetWeight(Index: TWeightType; const Value: Double);
function GetWeight(Index: TWeightType): Double;
public
property InWeight: Double index wtIn read GetWeight write SetWeight;
property OutWeight: Double index wtOut read GetWeight write SetWeight;
end;
Вы можете объединить это с ответом Кобуса , чтобы получить следующее:
procedure TBlock.SetWeight(Index: TWeightType; const Value: Double);
begin
case Index of
wtIn: SetField(FWeightIn, Value);
wtOut: SetField(FWeightOut, Value);
end;
end;
Это может дать вам идеи для других способов ссылки в ваши поля по индексу вместо двух полностью отдельных полей для таких связанных значений.
Вы можете добавить дополнительный метод. Что-то вроде:
procedure TBlock.setValue(const Value : Double; Location : PDouble);
var
OldValue : Double;
begin
OldValue:=Location^;
DoOnChanging(OldValue,Value);
Location^:=Value;
DOnChanged(OldValue, Value);
end;
procedure TBlock.setWeightOut(const Value : Double);
begin
setValue(value, @FWeightOut);
end;
Я не компилировал / не тестировал код. Идея состоит в том, чтобы иметь общий метод установки, который работает с указателем на местоположение. Специализированные версии просто вызывают общий метод с адресом устанавливаемой переменной. Однако у вас должен быть один тип общего метода установки для каждого типа переменной (double, integer, ...). Вы можете изменить его для работы с указателем и длиной переменной для работы со всеми типами - ваше решение, стоит ли оно того.
если параметры процедуры / функции совпадают и код между началом и концом такой же, тогда вы можете просто использовать
procedure SetWeightValue(const Value: Double);
var OldValue: Double;
begin
OldValue := FWeightIn;
DoOnChanging(OldValue, Value);
FWeightIn := Value;
DoOnChanged(OldValue, Value);
end;
Вот и все ...