VBiB/ACCB.net - Visual Basic in België | .net Ineta User Group  
Hoofdmenu

Advertenties

Het Computer Winkeltje HCW


Evenementen

Forum

Plaats nieuw bericht   Plaats Reactie
Vorige onderwerp Printervriendelijke versie Log in om je privé berichten te bekijken Volgende onderwerp
Auteur Bericht
StevenROffline
Onderwerp: Conversie van vb.net naar C#  BerichtGeplaatst: 17 mrt 2010 - 10:39
Junior Developer


Geregistreerd op: 15-dec-2007
Berichten: 50

Status: Offline
Hey,


Ik zit met een probleempje, ik heb een klasse gemaakt (lees gevonden op internet en volledig aangepast) in C#. Dit ging eigenlijk vrij goed. Afgelopen week moest ik deze klasse verwerken in een com classe dit op zich ging ook nog goed. Maar het raisen van events in en deze plaatsen in de com classe lukt met totaal niet. Onderstaand heb ik de vb.net code geplaatst en ook de C# code. Voorlopig heb ik het probleem kunnen omzeilen door in vb.net de code te maken en de C# klasse zo te koppelen
maar hier wil ik eigenlijk vanaf (is geen zuivere oplossing).

Kan iemand me een voorbeeld geven hoe ik dit moet verwerken in de com klasse ? of me hier mee verder helpen. Ik heb op internet een aantal voorbeelden gevonden waar events getriggerd worden in C# maar daar worden altijd de sender en een object meegegeven, moet dit altijd ?? ik zou eigenlijk alleen een event willen die een string terug geeft. (kan u ook zien in vb.net code)


Ik hoop dat iemand me hiermee kan helpen.



Visual Basic code:

<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface Steven_TapiHandler
<DispId(1)> Sub Nieuw()
<DispId(3)> Sub Close()
<DispId(4)> Sub GesprekOpnemen()
<DispId(5)> Sub GesprekVerbreken()
<DispId(6)> Sub InWacht()
<DispId(7)> Sub UitWacht()
End Interface

<InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface Steven_TapiHandlerEvents
<DispId(20001)> Sub OnIncommingCall(ByVal strBellerNr As String, ByVal strBellerNaam As String)
<DispId(20002)> Sub OnCallStateChanged(ByVal strStatus As String)
<DispId(20003)> Sub OnDigitDialed(ByVal strBellerNr As String, ByVal strBellerNaam As String)
End Interface

Public Sub OnCall(ByVal sender As Object, ByVal e As NewCallEventArgs) Handles _Line.NewCall
Dim strEvent As String

If e.Call.CallState = CallState.Offering Then

If e.Call.CallerId.ToString.Substring(0, 1) <> "+" Then
If e.Call.CallerId.ToString.Length > 2 Then
strEvent = "+32" & e.Call.CallerId.ToString
Else
strEvent = e.Call.CallerId.ToString
End If

RaiseEvent OnIncommingCall(strEvent, e.Call.CallerName)
_CurrentCall = e.Call
End If
End If
End Sub



C - Sharp code tot nu toe.

Visual Basic code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Steven_Tapi
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface Tapi_Interface
{
[DispId(10001)]
String GeefWoord();
}

[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface Tapi_InterfaceEvents
{
[DispId(20001)]
void OnIncommingCall(ByVal strBellerNr As String, ByVal strBellerNaam As String);
}

[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(Tapi_InterfaceEvents))]
public class cls_Tapi : Tapi_Interface
{
public String GeefWoord()
{
return "Test 375698";
}
}
}
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
AntiOffline
Onderwerp: Re: Conversie van vb.net naar C#  BerichtGeplaatst: 18 mrt 2010 - 23:41
Moderator


Geregistreerd op: 09-mei-2006
Berichten: 396
Woonplaats: Genk
Status: Offline
Het lijkt me dat je gewoon een eigen event dient aan te maken en deze af te vuren indien nodig. De rest van de code is perfect overdraagbaar naar c#.

Om een event in c# af te vuren heb je een aantal dingen nodig.

Ten eerste heb je een delegate nodig. Ik ga je de theoretische achtergrond besparen. Ga er maar vanuit dat dit een managed pointer is (een gegevenstype dat rechtstreeks naar een andere waarde verwijst.)

Deze dient je buiten je klasse te instantiëren en kan je vrij een naam geven.

Visual Basic code:
public delegate void AnyEventHandler(Any obj, AnyEventArgs e);


In bovenstaand voorbeeld zie je zo een delegate. In deze definitie wordt aangegeven dat de delegate een object Any verwacht en een object AnyEventArgs. Any verwijst hier naar het object dat het event afvuurt (de sender) terwijl AnyEventArgs een klasse is die met het event wordt meegestuurd. Deze klasse bevat data die belangrijk is voor het type event. (In jou geval bv. een string.) Deze objecten worden de definitie van de delegate genoemd.

Andere mogelijke definities zouden kunnen zijn:

Visual Basic code:
public delegate void AnyEventHandler(EventArgs e);

Geen sender object en een standaard eventArgs object

Visual Basic code:
public delegate void AnyEventHandler;

Helemaal geen objecten

In dit voorbeeld volgen we de eerste definitie. (met sender en AnyEventArgs)

Als tweede gaan we AnyEventArgs klasse aanmaken. Dit is een gewone klasse die er zo zou kunnen uitzien:

Visual Basic code:
public class AnyEventArgs
    {
        public String Woord{ get; set; }

        public AnyEventArgs() {}
        public AnyEventArgs(String woord)
        {
            this.Woord = woord;
        }

    }


Dit is een vrij eenvoudige klasse die één property heeft die via de property geset kan worden of via de constructor. Dit is de EventArgs klasse die we met het event gaan meesturen. Ook dit dient buiten de main klasse (die het event oproept) geplaatst te worden.

De volgende stap is de main klasse zelf. Hierin zijn 3 dingen belangrijk:
1. De declaratie van het event op basis van de aangemaakte delegate. We haken het event als het ware aan de delegate.
2. De constructie van het event
3. Het oproepen van het event.

- Event aanmaken en initialiseren
Visual Basic code:
public event AnyEventHandler myEventHandler= null;


- Constructie van het event. Dit is technisch gezien niet nodig maar wordt door MS aangeraden om te doen. Je zou in principe het event rechtstreeks kunnen oproepen maar we kunnen dit beter wrappen in een gecontroleerde omgeving.

Visual Basic code:

protected void OnAnyEvent(AnyEventArgs e)
        {
            if (myEventHandler!= null) {
                myEventHandler(this,e);
        }
}



- Als laatste kunnen we nu ons event oproepen indien dit nodig is:

Visual Basic code:

public void DoRandomFunction(){
OnAnyEvent(new AnyEventArgs("stringDieMeeMoetMetEvent"));
}



In de klasse waar je dit event wil gebruiken kan je naar dit event luisteren door het volgende:

Visual Basic code:


private void Init()
{
Any any = new Any();
any.myEventHandler += new AnyEventHandler(AnyListener);
}

private void AnyListener(Any sender,AnyEventArgs e)
{
     Console.WriteLine(e.Naam);
}



De volledige constructie ziet er dan (samengevat) uit als volgt:

Visual Basic code:

//Delegate waaraan we het event hooken
    public delegate void AnyEventHandler(Any obj, AnyEventArgs e);


    class Any
    {

        //Event aanmaken (instantie van de delegate
        public event AnyEventHandler myEventHandler= null;
       
        //Event call wrappen (MS practice)
        protected void OnAnyEvent(AnyEventArgs e)
        {
            if (myEventHandler!= null)
            {
                myEventHandler(this,e);
            }
        }

        //Functie waarin we als voorbeeld het event oproepen
        public void DoRandomFunction()
        {
            OnAnyEvent(new AnyEventArgs("stringDieMeeMoetMetEvent"));
        }
    }

    //Event argumenten klasse, die in dit geval eens string bevat.
    public class AnyEventArgs
    {
        public String Woord{ get; set; }

        public AnyEventArgs() {}
        public AnyEventArgs(String woord)
        {
            this.Woord = woord;
        }

    }



Excuses voor eventuele schrijffouten of compileerfouten. Ik heb het niet kunnen testen (zit momenteel op Linux) maar het principe is wel correct. Mocht een andere mod of lid van dit forum de code snel even kunnen testen zou ik dit ten zeerste appreciëren.

Succes

_________________
Intellectuals solve problems; geniuses prevent them.
-- Albert Einstein

Blog: http://blog.anxma.com
Twitter: http://twitter.com/stevenhouben
 
 Bekijk gebruikers profiel Stuur privé bericht Bekijk de homepage MSN Messenger  
Reageer met quote Naar boven
StevenROffline
Onderwerp: Re: Conversie van vb.net naar C#  BerichtGeplaatst: 19 mrt 2010 - 14:32
Junior Developer


Geregistreerd op: 15-dec-2007
Berichten: 50

Status: Offline
Hey Anti,


Bedankt voor de info - ondertussen is het gelukt Smile

Ik zal deze avond de code ook nog posten moest iemand anders in de toekomst
hier dan nog problemen mee hebben.

Nogmaals bedankt voor de info.


Groeten,

Steven
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
LacostaOffline
Onderwerp: Re: Conversie van vb.net naar C#  BerichtGeplaatst: 27 mrt 2010 - 10:00
Senior Developer


Geregistreerd op: 27-mei-2008
Berichten: 100

Status: Offline
Er is ook een tooltje voor op het web:
http://www.developerfusion.com/tools/co ... to-csharp/
 
 Bekijk gebruikers profiel Stuur privé bericht  
Reageer met quote Naar boven
Berichten van afgelopen:     
Ga naar:  
Tijden zijn in GMT + 1 uur
Plaats nieuw bericht   Plaats Reactie
Vorige onderwerp Printervriendelijke versie Log in om je privé berichten te bekijken Volgende onderwerp
PNphpBB2 © 2003-2007 
 

 
Postnuke - ADODB Database - PHP 4/5 - pnPhpBB2 - Hosting bij Openminds
Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno 21-12-2000)
vbib.be gestart op 1/03/06 (extra vanaf 1/09: vbnet.be en vbdotnet.be)
VBiB is gerelateerd met wintips.be

Nieuwsbrief RSS Feed: backend.php