realbasic-nug.it
[Top] [All Lists]

Re: Comportamento normale, bizzarro o bug delle computed property?

To: REALbasic NUG Italian <realbasic-nug dot it at lists dot realsoftware dot com>
Subject: Re: Comportamento normale, bizzarro o bug delle computed property?
From: Massimo Valle <maxduepuntozero at yahoo dot it>
Date: Tue, 4 Dec 2007 12:45:21 +0100
Delivered-to: listarchive at realsoftware dot com
Delivered-to: realbasic-nug dot it at lists dot realsoftware dot com
References: <2CB96CDB-0313-4C48-B523-9FFD98CDD9A4 at menssana dot to dot it> <FF7DE1A1-7CF5-4060-AB3C-C1195CFECBC1 at yahoo dot it> <D6EA9DDD-B439-4308-A4D5-5378FC5E5556 at menssana dot to dot it> <7A2E9204-BFEB-4B42-9BE5-7318A67A775A at yahoo dot it> <33FD5E13-DC30-434E-94B0-7A74F1B2F5DB at menssana dot to dot it> <E0F27830-B979-48A3-9F59-2536E1884763 at yahoo dot it> <67435AC0-A086-44F5-8C6E-C77DB41D6999 at menssana dot to dot it> <452DB0C5-5B51-460E-9AAC-380DFD367281 at omnidea dot it> <3240BD57-99FD-43C2-B812-191D04F5D6B3 at yahoo dot it> <6299FE45-E8F6-4064-8ED6-822BB8CEC340 at omnidea dot it> <4DE4CDC2-AB8E-4DD0-8484-28C399FFCFBA at yahoo dot it> <2E5E605F-9AA0-405D-9B4C-272C06F36660 at omnidea dot it>

On 04/dic/07, at 12:06, Gilberto De Faveri wrote:


On 04/dic/07, at 11:41, Massimo Valle wrote:

Questo è vero per una subclass, che la rende di fatto un oggetto non facilmente riutilizzabile. Ma con i delegates si potrebbe sostanzialmente agganciare l'evento Action a qualsiasi metodo, sia esso globale o un metodo di un oggetto istanziato. Ottenendo lo stesso controllo fine che si ottiene istanziando un oggetto da IDE. Per inciso il metodo dei delegates è ampiamente utilizzato in Cocoa, ma anche in altri linguaggi.

Non ti seguo. Pur potendo utilizzare i delegati come puntatori a funzione non sarebbe comunque possibile (nè in linea con i principi dell'OOP a dire il vero) agganciarli "per istanza" del controllo. In parole povere, a prescindere dalle limitazioni imposte da scelte progettuali, non vedo il modo per specificare a runtime con i delegati quello che permette di fare l'IDE (ad. esempio, nel caso dell'ormai famoso PushButton, specificare un Action() diversa "per istanza").

Puoi fare un esempio?

Ti propongo un esempio con un Timer, così nello stesso tempo creiamo qualcosa di funzionante ed utilizzabile. Quello che ti descrivo di seguito è un modo per creare una subclass di Timer riutilizzabile che possa venire istanziata al runtime e il cui evento Action() possa essere agganciato ad un metodo diverso per ogni istanza.

1. Partendo da un nuovo progetto, prima di tutto creiamo un nuovo Modulo che ci serve per specificare il nostro delegate. Chiamiamo il modulo "Delegates" per semplicità.

2. Nel modulo Delegates definiamo un nuovo delegate così:
   Delegate Sub TimerAction()

3. Ora definiamo una sottoclasse di Timer che chiameremo "DelegatingTimer"

4. Nel DelegatingTimer definiamo una proprietà:
   DelegateMethod as TimerAction

5. Nel DelegatingTimer creiamo un metodo costruttore:
   Sub Constructor(MethodToCall as TimerAction)
     DelegatedMethod = MethodToCall
   End Sub

6. Nell' evento Action() di DelegatingTimer inseriamo:
   Sub Action()
     DelegateMethod.invoke
   End Sub

Ora il nostro timer con delegate è terminato. Proviamo ad utilizzarlo.

1. Nella finestra Window1 (già presente in un nuovo progetto) creiamo una proprietà:
   WindowTimer as DelegatingTimer

2. Sempre nella nostra finestra creiamo un metodo che si conforme alla specifica del nostro delegate. Una semplice Sub senza argomenti:
   Sub TimerDelegate()
     msgBox "Tempo scaduto"
   End Sub

3. Inseriamo un pushButton nella finestra, o qualunque altro modo per istanziare il nostro Timer con questo codice:
   WindowTimer = new DelegatingTimer(addressOf self.TimerDelegate)
   WindowTimer.mode = 0
   WindowTimer.enabled = true
   WindowTimer.period = 3000
   WindowTimer.mode = 1
   WindowTimer.reset


Ecco fatto.
Premendo il pulsante (o invocando il metodo) che esegue il codice al punto 3 creiamo un'istanza del nostro Timer a cui assegniamo un'azione che decidiamo noi. In questo caso, quando il timer scade gli facciamo eseguire il metodo TimerDelegate della finestra, ma avremmo potuto specificare un qualsiasi altro metodo purchè conforme alla dichiarazione del delegate. Nello stesso modo possiamo istanziare il nostro timer altre volte, assegnando ogni volta un'azione diversa a seconda del caso. E nello stesso progetto possiamo riutilizzare più volte lo stesso DelegatingTimer in altre parti per fare ciò che vogliamo.

Massimo




<Prev in Thread] Current Thread [Next in Thread>