Повторная логика методов set в Delphi

Если у вас ADT версии 12+, вы должны обновить Proguard с 4.4 -> 4.6 (как описано здесь здесь ). Кроме того, вы должны оставить файл ... \ bin \ proguard.bat в оригинальной форме.

Просто скачайте его из Интернета и скопируйте папку lib из загруженного пакета в:

[Каталог установки Android SDK] \ tools \ proguard \ lib

9
задан Tihauan 23 July 2009 в 07:10
поделиться

4 ответа

Попробуйте следующее:

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;
13
ответ дан 4 December 2019 в 10:33
поделиться

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;

Это может дать вам идеи для других способов ссылки в ваши поля по индексу вместо двух полностью отдельных полей для таких связанных значений.

7
ответ дан 4 December 2019 в 10:33
поделиться

Вы можете добавить дополнительный метод. Что-то вроде:

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, ...). Вы можете изменить его для работы с указателем и длиной переменной для работы со всеми типами - ваше решение, стоит ли оно того.

0
ответ дан 4 December 2019 в 10:33
поделиться

если параметры процедуры / функции совпадают и код между началом и концом такой же, тогда вы можете просто использовать

procedure SetWeightValue(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightIn;
  DoOnChanging(OldValue, Value);
  FWeightIn := Value;
  DoOnChanged(OldValue, Value);
end;

Вот и все ...

0
ответ дан 4 December 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: