Event navracenící mnou vytvořené objekty   zodpovězená otázka

VB.NET, Algoritmy

Potřebuji poradit. Mám knihovnu s funkcemi a události s ní spojené.

Příklad knihovny:

Namespace knihovna
Public Class funkce
Private _id As system.Int16
private _status as system.string

private Structure objekt_1
   Public id As system.Int16
   Public diagnostika As system.string
   Public status As system.String
End Structure

       Public Property id() As Int16
            Get
                Return (_id)
            End Get
            Set(ByVal value As Int16)
                _id = value
            End Set
        End Property

        Public Property status() As String
            Get
                Return (_status)
            End Get
            Set(ByVal value As String)
                _status = value
            End Set
        End Property

public event udalost_1 As eventhandler  'Tady bych asi měl říct, že je to můj objekt1, popřípadě více objektů

function funkce_1(neco as string, neco as int16)
... výkoná část
RaiseEvent událost_1(něco as string, něco as int16, něco as objekt) ' Tohle bych potřeboval vrátit
end Function
end class
end namespace

Vlastní program by k ní měl přistupovat asi takto:

class program

public novy_objekt as knihovna.objekt1
public Structure objekt_1
   Public id As system.Int16
   Public diagnostika As system.string
   Public status As system.String
End Structure

Public Sub Form.load ' například nahrání hlavního formu
for i = 0 to 9
dim novy_objekt(i) = new novy_objekt
novy_oblekt.id = i
end for
'pak již k objektu přistupuji přes index
novy_objekt(0).funkce_1(neco as string, neco as int16)
end Sub

'zachycení události z knihovny
Public Sub udalost(id as int 16, něco as int16, něco as objekt)
' a zde již mám data ze zpracované funkce
' v proměnné ID mám i index ze které knihovny se to vrátilo
' dále můžu provést např:
novy_objekt(id).status = "ok"
End Sub
end class

Jde mi o to že funkce nevrací standartní envent(e , sender), ale data zpracované funkcí.

Pokud dimenzuji pole pro 10 objektu tak nejsem schopnej zjistit které zařízení, řízené knihovnou mi vrátila event.

Za případné návrhy předem děkuji.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Myslíš něco jako:

    Public Class funkce
        Delegate Sub udalost_info(ByVal str As String, ByVal int As Int16, ByVal obj As Object)
        Public Event udalost_1 As udalost_info  
'... a dále pak
        Function funkce_1(ByVal neco As String, ByVal neco2 As Int16)
            RaiseEvent udalost_1(neco, neco2, Me)
            Return 0
        End Function

nebo jsem to nepochopil?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Používejte generické typy a parametry událostí odvozené od EventArgs.

Public Class Worker
  Public Event WorkCompleted As EventHandler(Of WorkCompletedEventArgs)
  Public Sub DoWork()
    Dim n As Integer = 1 + 1
    RaiseEvent WorkCompleted(Me, New WorkCompletedEventArgs(n))
  End Sub
End Class

Public Class WorkCompletedEventArgs
  Inherits EventArgs
  Private _result As Integer
  Public Sub New(ByVal result As Integer)
    _result = result
  End Sub
  Public ReadOnly Property Result As Integer
    Get
      Return _result
    End Get
  End Property
End Class

Friend Class Form1
  Private WithEvents worker As New Worker
  Private Sub worker_WorkCompleted(ByVal sender As Object, ByVal e As WorkCompletedEventArgs) Handles worker.WorkCompleted
    MsgBox(e.Result.ToString())
  End Sub
End Class

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Myslím že cestička se nachází nekde mezi.

Pokusim se to ještě přiblížit na příkladu.

Máme ledničku. Dodavatel dodal knihovnu (dll) pro řízení ledničky.

Funkce knihovny přikazují co má lednička dělat.

A lednička na oplátku posíla události. (Chyby, provozní hlášení,atd)

Problém je v tom, že knihovna nevrací (e , sender), ale pouze stavy (objekty) a pokud mám víc ledniček, tak nevim od které ledničky mi to přišlo.

Napadlo mě knihovnu zapouzdřit do vlastní třídy, kde odchytávám události a přes můj Public handler si ji odchytim s tím že k ní přidam ještě ID lednice.

Funguje mi to pokud si vytvořim nový Form, který načte knihovnu a

zpracuje i události. Z Textboxu udělám ID. Jenže tato cesta mi nepřijde úplně korektní.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud delegát události nemá příslušné parametry (zdroj události), pak vám skutečně nezbyde nic jiného než to zapouzdřit do vlastní třídy a identifikátor lednice si spravovat sám. Událost této třídy bude přeposílat událost od lednice, ovšem s již přiřazeným identifikátorem.

P.S.: Co je to za lednici?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Lednice je pouze příklad. Doufám že ji většina zná a ví co od ní může očekávat.

Jinak realizace je stavěná pro Evakuační rohlas.

Jak přesně fungujou delegáti?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Delegát představuje ukazatel na libovolnou metodu s příslušnou signaturou. Signatura je návratová hodnota a parametry. Delegáti hrají klíčovou roli při zpracování událostí, což se projevuje hlavně v C#, ve VB.NET je delegát vytvořen automaticky při použití klíčového slova AddressOf.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Moc dík. To je předně ono.

Vytvořim pouzdro pro knihovnu a delegati mi to budou vracet tak jak potřebuji. Palec nahoru.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback