سؤال

لكل مرض من الفصل، يجب أن أقوم بتطبيق بعض منطق الأحداث (onchanging، onchanged):

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

procedure TBlock.SetWeightOut(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightOut;
  DoOnChanging(OldValue, Value);
  FWeightOut := Value;
  DoOnChanged(OldValue, Value);
end;

هل يمكن أن تقترح طريقة لتنفيذ هذا دون تكرار كل هذه الخطوط لكل مجموعة؟

هل كانت مفيدة؟

المحلول

جرب هذا:

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;

نصائح أخرى

الدعم دلفي خصائص مفهرسة. وبعد يمكن أن تشارك خصائص متعددة في الحصول على Getter أو STERTER واحد، وتمييزها بواسطة مؤشر ترتيبي:

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;

أنا لم تجميع / اختبار الكود على الرغم من. تتمثل الفكرة في الحصول على طريقة STERTER عامة تعمل مع مؤشر إلى الموقع. الإصدارات المتخصصة فقط استدعاء طريقة Gerneral مع إعداد عنوان المتغير. يجب أن يكون لديك نوع واحد من طريقة Setter العامة لكل نوع من المتغير (مزدوج، عدد صحيح، ...) على الرغم من ذلك. يمكنك تعديلها للعمل على المؤشر وطول متغير للعمل مع جميع الأنواع - قرارك إذا كان الأمر يستحق كل هذا العناء.

إذا كانت معلمات الإجراءات / الوظيفة هي نفسها ورمز بين البدء والنهاية هي نفسها، فيمكنك استخدامها فقط

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

هذا هو...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top