xojo:objectnotifier:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
xojo:objectnotifier:start [2021/04/01 17:42]
mz
xojo:objectnotifier:start [2021/04/06 09:27] (aktuell)
mz [Object notification]
Zeile 1: Zeile 1:
-====== Object Notification ====== +====== Object notification ======
-/* {{tag> }} */+
  
-{{indexmenu>.#3|ns tsort hsort nsort}}+<fs x-large>A simple subscribe-callback mechanism for inter-object communication</fs>
  
-----+<WRAP round download 40%> 
 +**{{ :xojo:objectnotifier:object_notification.zip |Object Notification interfaces and class  (xojo-binary-code folder)}}**\\
  
-===== Interface objectNotifier =====+{{ :xojo:objectnotifier:objectnotification.pdf |Sourcecode as pdf}} 
 +</WRAP>
  
  
-===== Interface objectNotificationReceiver =====+This works similar to the built-in interfaces //dataNotifier// and //dataNotificationReceiver//.\\ 
 +However the **ObjectChanged** method receives two parameters: an **Object** from the notifier and any **info** from the original subscriber.\\
  
-===== Class ObjectNotifierBox =====+The **notifier** may send himself by setting "me" as Object, or he sends simply the current data which have been changed.\\ 
 +The **subscriber** stores any sort of (static) information together with the callback-address when subscribing by //addObjectNotificationReceiver//.\\ 
 +This info may be a simple index number, but it can also be a whole object (means a reference to an object) so that the receiver can distinguish which subscription called him. 
 + 
 +The **//ObjectNotifierBox//** contains the complete implementation of the //objectNotifier// interface.\\ 
 +Simply instantiate this class and call their members like: 
 + 
 +Declare: 
 +  private property onb as ObjectNotifierBox 
 +in //Constructor// Method: 
 +  onb new ObjectNotifierBox  
 +Actual implementation of the //objectNotifier// Interface: 
 +  Sub addObjectNotificationReceiver(receiver as objectNotificationReceiver, optional info as Variant nil) 
 +     onb.addReceiver(receiver, info) 
 +  End Sub 
 + 
 +  Sub removeObjectNotificationReceiver(receiver As objectNotificationReceiver) 
 +     onb.removeReceiver(receiver) 
 +  End Sub 
 + 
 +For calling all subscribed receivers write somewhere in your class: 
 + 
 +  onb.callReceivers(me) 
 + 
 +Instead of "me" you may send any object you need, of course... 
 + 
 +<WRAP round important 100%> 
 +Be careful with //removing// if you have multiple subscriptions from the same object (perhaps with different //info//).\\ 
 +<code> 
 +xy.addObjectNotificationReceiver(me, 1) 
 +xy.addObjectNotificationReceiver(me, 2) 
 +</code> 
 +Because //removeObjectNotificationReceiver// obtains no //info// parameter, it cancels only the first object found in the array, thus acting as //fifo//.\\ 
 +It's therefore not possible to delete only the second entry (with //info// 2). 
 + 
 +</WRAP> 
 + 
 + 
 + 
 +====== Sourcecode ====== 
 + 
 +{{ :xojo:objectnotifier:objectnotification-tree.png|}} 
 + 
 + 
 +===== Interface objectNotifier =====
  
-   
-   
-  Object Notification 
   Interface objectNotifier   Interface objectNotifier
   Methods   Methods
-  Sub addObjectNotificationReceiver(receiver as objectNotificationReceiver, optional info as Varia +   
-  nt = nil)+  Sub addObjectNotificationReceiver(receiver as objectNotificationReceiver, optional info as Variant = nil)
   End Sub   End Sub
 +  
   Sub removeObjectNotificationReceiver(receiver As objectNotificationReceiver)   Sub removeObjectNotificationReceiver(receiver As objectNotificationReceiver)
   End Sub   End Sub
 +  
   End Interface   End Interface
 +
 +
 +===== Interface objectNotificationReceiver =====
 +
   Interface objectNotificationReceiver   Interface objectNotificationReceiver
   Methods   Methods
 +  
   Sub objectChanged(obj as Object, info as Variant)   Sub objectChanged(obj as Object, info as Variant)
   End Sub   End Sub
 +  
   End Interface   End Interface
 +
 +
 +===== Class ObjectNotifierBox =====
 +
      
   Class ObjectNotifierBox   Class ObjectNotifierBox
-   
   Methods   Methods
      
   Sub addReceiver(receiver as objectNotificationReceiver, info as Variant)   Sub addReceiver(receiver as objectNotificationReceiver, info as Variant)
-  var i as Integer = mReceivers.IndexOf(receiver) +     var i as Integer = mReceivers.IndexOf(receiver) 
-  if i = -1 then +     if i = -1 then 
-  mReceivers.Add(receiver) +        mReceivers.Add(receiver) 
-  mInfos.Add(info) +        mInfos.Add(info) 
-  end if +     end if
-  //+
   End Sub   End Sub
 +  
   Sub callReceivers(obj as Object)   Sub callReceivers(obj as Object)
-  For i As Integer = 0 To mReceivers.LastIndex +     For i As Integer = 0 To mReceivers.LastIndex 
-  mReceivers(i).objectChanged(obj, mInfos(i)) +        mReceivers(i).objectChanged(obj, mInfos(i)) 
-  Next +     Next
-  //+
   End Sub   End Sub
 +  
   Sub removeReceiver(receiver As objectNotificationReceiver)   Sub removeReceiver(receiver As objectNotificationReceiver)
-  var i as Integer = mReceivers.IndexOf(receiver) +     var i as Integer = mReceivers.IndexOf(receiver) 
-  if i > -1 then +     if i > -1 then 
-  mReceivers.RemoveAt(i) +        mReceivers.RemoveAt(i) 
-  mInfos.RemoveAt(i) +        mInfos.RemoveAt(i) 
-  end if +     end if
-  //+
   End Sub   End Sub
      
   Properties   Properties
-  mInfos() As Variant +   
-  mReceivers() As objectNotificationReceiver+  Private mInfos() As Variant 
 +  Private mReceivers() As objectNotificationReceiver
      
   End Class   End Class
      
- 
 ---- ----
  
 /*eof*/ /*eof*/
  
  • xojo/objectnotifier/start.1617291765.txt.gz
  • Zuletzt geändert: 2021/04/01 17:42
  • von mz