سؤال

في دلفي 2009 لدي نموذج مع إجراء MyProcedure الذي يكتب إلى تسمية في النموذج. النموذج الاستخدامات Datamodule مع عميلDataset. عند إطلاق الحدث AfterScroll من ClientDataset، يجب تنفيذ MyProcedure. لتجنب المراجع الدائرية والأهم من ذلك، كما أريد أن تكون Datamodule قابلة لإعادة الاستخدام، يجب ألا يشير DataModule إلى هذا النموذج المحدد.

باختصار، آمل أن أتمكن من الوصول إلى حدث AfterScroll من النموذج الخاص بي. هل يمكنني ربط حدث AfterScroll على Datamodule من النموذج الخاص بي؟ اعتقدت أنه ينبغي أن يكون ممكنا، لكن لا أستطيع أن أتذكر كيفية القيام بذلك. شكرا مقدما.

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

المحلول

يمكنك وضع خاصية حدث في Datamodule الخاص بك:

private
FOnAfterScroll : TNotifyEvent;
public
property OnAfterScroll   : TNotifyEvent read FOnAfterScroll write FOnAfterScroll;

يمكنك بعد ذلك استدعاء هذا الحدث في إجراء AfterScroll في Datamodule:

If Assigned(FOnAfterScroll) then FOnAfterScroll(Self);

في النموذج: إعلان معالج الأحداث

procedure HandleAfterScroll(Sender : TObject);

ثم تقوم بتعيين إجراء Onafterscroll في Datamodule

datamodule1.onafterscroll: = myhandleafterscroll؛

هناك طريقة أخرى هي إرسال رسالة Windows مخصصة من Datamodule والاستجابة لهذه الرسالة في النموذج.

نصائح أخرى

يجب أن يكون شيء مثل:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataModule1.MyCDS.AfterScroll := MyAfterScrollHandler;
end;

إذا كان كل ما تريده هو إعلان معالج الأحداث في وحدة مختلفة، مثل النموذج، انتقل مع اقتراح Ulrich. إذا كنت ترغب في أن تكون قادرا على وضع معالج حدث افتراضي في وحدة البيانات الخاصة بك، فستكون قادرا على تمديد سلوكه، فإنه يستغرق المزيد من العمل. يمكنك القيام بذلك عن طريق إضافة حدث إلى وحدة البيانات.

حدد مؤشر طريقة مع التوقيع المناسب وإضافة واحدة إلى وحدة البيانات في النطاق العام، مثل ذلك:

type
  TMyEvent = procedure({arg list here}) of object;

  TMyDataModule = class(TDataModule)
  //definition goes here
    procedure MyTableAfterScroll({arg list here});
  private
    FExternalEvent: TMyEvent;
  public
    property ExternalEvent: TMyEvent read FMyEvent write FMyEvent
  end;

implementation

procedure TMyDataModule.MyTableAfterScroll({arg list here});
begin
  //do whatever
  if assigned(FExternalEvent) then
    FExternalEvent({whatever arguments});
  //do more stuff, if you'd like
end;

إلى ربطه، في OnCreate النموذج الخاص بك، ما عليك سوى تعيين الإجراء الخاص بك إلى MyDatamodule.externalevent وسوف تكون جيدا للذهاب.

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