vsoft.messaging هو libary يوفر نظام مراسلة/اشتراك داخلي متزامن/غير متزامن لتطبيقات Delphi.
يتم استخدام هذه المكتبة من قبل FinalBuilder وهي تعمل بشكل جيد لسنوات عديدة.
تستفيد هذه المكتبة من TObject.Dispatch والطرق الديناميكية التي تم تقديمها مرة أخرى في Delphi 1.0. طريقة الإرسال هي كيفية إرسال رسائل Windows إلى أساليب معالج الرسائل على أحفاد التثبيت.
بينما تمت إضافة TObject.Dispatch في الأصل لغرض إرسال رسائل Windows ، فإنها ليست مرتبطة بالفعل بـ Windows. هذا يعني أن هذه المكتبة يجب أن تعمل على أي منصة تدعمها دلفي. ومع ذلك ، فقد اختبرت هذا فقط على Win32/Win64 (VCL و FMX).
يتم تعريف الرسائل على أنها سجلات ، مع حقل MSGID.
// create a unique message id.
// on windows this needs to be higher than WM_USER
const PROJECT_OPENED_MSG = WM_USER + $ 1000 ;
type
TProjectOpenedMessage = record
MsgID : TMessageID;
Filler : TMessageFiller;
// payload starts here.
ProjectName : string;
public
constructor Create( const theProjectName : string);
end ;
implementation
constructor TProjectOpenedMessage.Create( const theProjectName : string);
begin
MsgID := PROJECT_OPENED_MSG; // assign our message id
ProjectName := theProjectName; // store the payload.
end ;
يتم تعريف TMessageID على أنه TMessageID = Cardinal;
لا يلزم حقل الحشو إلا إذا كنت تتعامل مع الرسائل في تطبيقات VCL أو FMX (على Windows) ، ثم فقط إذا كنت تتعامل معها على النماذج أو الإطارات أو Wincontrols ، أي أي شيء مع Windproc. وذلك لأن الانحراف في TControl و TWinControl و TCustomForm يلقي معلمة الرسالة إلى TMessage . إذا كنت تستخدم هذا على منصات أخرى ، فيمكنك استخدام Word لحقل MSGID ، حيث أن كل ما يستخدمه TObject.Dispatch
يتم إرسال الرسائل من خلال كائن قناة. لإنشاء قناة ، استخدم طريقة TMessageChannelFactory.CreateChannel
var
channel : IMessageChannel;
begin
channel := TMessageChannelFactory.CreateChannel;
...مثال :
procedure SendProjectOpenedMessage ( const projectName : string)
var
msg : TProjectOpenedMessage;
begin
msg := TProjectOpened.Create(projectName);
FChannel.Queue.PostMessage(msg); // async
// or
FChannel.Queue.SendMessage(msg); // sync
end ; لاحظ أن السبب في PostMessage و SendMessage موجودون على القناة. خاصية بحتة تدور حول قيود الأدوية الجماهيرية في دلفي ، حيث لا يمكن أن يكون للواجهات غير الجينية طرقًا عامة (يمكن للسجلات ، لذا فإن قائمة الانتظار هي في الواقع سجل).
Queue.PostMessage يرسل الرسالة بشكل غير متزامن ، أي إرجاع الطريقة قبل استلام الرسالة.
Queue.SendMessage عائدات بعد انتهاء جميع المرسلين من إرسال الرسالة. ملاحظة لا ينبغي استخدام SendMessage لإرسال الرسائل إلى المرسلين الذين يعملون على واجهة المستخدم ، واستخدم PostMessage بدلاً من ذلك.
لكي يستقبل كائن الرسائل ، يحتاج إلى إنشاء مرسل ، وربط المرسل لنفسه والقناة
type
TReceiver = class
private
FDispatcher : IMessageDispatcher;
public
constructor Create( const channel : IMessageChannel);
end ;
implementation
constructor TReceiver.Create( const channel : IMessageChannel);
begin
FDispatcher := TMessageDispatcherFactory.CreateDispatcher;
// tell the dispatcher where to dispatch the messages to.
FDispatcher.Target := Self;
// hook up the dispatcher to the channel.
FDispatcher.Channel := channel;
end ;
ملاحظة: إذا كنت تتعامل مع الرسائل على النماذج/الإطارات/عناصر التحكم حيث ستقوم بإجراء تحديثات واجهة المستخدم ، فيجب عليك استخدام TMessageDispatcherFactory.CreateUIDispatcher - وهذا يضمن إرسال الرسائل فقط على الموضوع الرئيسي (المكالمات tther.queue). لأسباب الأداء ، لا ينبغي استخدام CreateUidispatcher لرمز غير واجهة المستخدم ، ويجب أن تتجنب استخدام الكثير من مرسلات واجهة المستخدم التي تم توصيلها بنفس القناة.
إن التعامل مع الرسائل مثل التعامل مع رسائل Windows في Delphi
type
TReceiver = class
private
...
procedure ProjectOpened ( var msg : TProjectOpenedMessage); message PROJECT_OPENED_MSG;
...
end ;
implementation
procedure TReceiver.ProjectOpened ( var msg : TProjectOpenedMessage);
begin
// use msg.ProjectName payload here.
end ;