Hilfe bei Übersetzung VB.NET -> C#

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Parmaster.

    Hilfe bei Übersetzung VB.NET -> C#

    Hallo!

    Ich bin gerade dabei Quellcode von VB.NET zu C# zu übersetzen, und komme nicht mehr weiter.

    Hier erst mal der VB.NET Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private WithEvents Control As Controller.XboxController
    2. Private Sub Hand_Load(sender As Object, e As EventArgs) Handles Me.Load
    3. Dim Controllers As New List(Of Controller.XboxController)
    4. For Each Nbr In {0, 1, 2, 3}
    5. Dim TempCntrl As New Controller.XboxController(Me, CUInt(Nbr))
    6. TempCntrl.StickMaximumRadius = 34000
    7. TempCntrl.TrimStickLength = True
    8. TempCntrl.Poll()
    9. If TempCntrl.StartCapturing(False) Then
    10. Controllers.Add(TempCntrl)
    11. End If
    12. Next
    13. Select Case Controllers.Count
    14. Case Is = 0
    15. MessageBox.Show("Es ist kein Controller angeschlossen.")
    16. Me.Close()
    17. Return
    18. Case Is = 1
    19. Control = Controllers.First
    20. Case Else
    21. Dim Str = String.Empty
    22. Dim Number As UInteger
    23. Do
    24. Dim InputStr = InputBox("Es sind mehrere Controller angeschlossen." & vbNewLine &
    25. "Bitte wählen: " & String.Join(", ", Controllers.ConvertAll(Function(x) x.ControllerNumber).ToArray))
    26. If UInteger.TryParse(Str, Number) Then Continue Do
    27. Loop Until Number < Controllers.Count()
    28. Control = Controllers.First
    29. End Select
    30. End Sub


    Und hier der übersetzte C# Code:

    Spoiler anzeigen

    C#-Quellcode

    1. private XboxController Control;
    2. private void Form1_Load(object sender, EventArgs e)
    3. {
    4. List<XboxController> Controllers = new List<XboxController>();
    5. foreach (Nbr in {
    6. 0,
    7. 1,
    8. 2,
    9. 3
    10. }) {
    11. XboxController TempCntrl = new XboxController(this, Convert.ToUInt32(Nbr));
    12. TempCntrl.StickMaximumRadius = 34000;
    13. TempCntrl.TrimStickLength = true;
    14. TempCntrl.Poll();
    15. if (TempCntrl.StartCapturing(false))
    16. {
    17. Controllers.Add(TempCntrl);
    18. }
    19. }
    20. switch (Controllers.Count)
    21. {
    22. case 0:
    23. MessageBox.Show("Es ist kein Controller angeschlossen.");
    24. this.Close();
    25. return;
    26. case 1:
    27. Control = Controllers.First;
    28. break;
    29. default:
    30. dynamic Str = string.Empty;
    31. uint Number = 0;
    32. do
    33. {
    34. dynamic InputStr = Interaction.InputBox("Es sind mehrere Controller angeschlossen." + Constants.vbNewLine + "Bitte wählen: " + string.Join(", ", Controllers.ConvertAll(x => x.ControllerNumber).ToArray));
    35. if (uint.TryParse(Str, Number))
    36. continue;
    37. } while (!(Number < Controllers.Count()));
    38. Control = Controllers.First;
    39. break;
    40. }
    41. }


    Bei dem C# Code habe ich z.B. ein Problem mit der foreach Schleife (Nbr wurde nicht gefunden), genauso sind bei Control = Controllers.First das .First unbekannt, oder etwas weiter oben das Interaction.

    Des Weiteren würde mich interessieren ob dieser VB.NET Code

    VB.NET-Quellcode

    1. Private Sub LSChanged(sender As Object, e As Controller.StickChangedEventArgs) Handles Control.LeftStickChanged
    2. End Sub

    wirklich das hier ist in C#

    C#-Quellcode

    1. private void LSChanged(object sender, StickChangedEventArgs e)
    2. {
    3. }


    Da fehlt doch das Handle, oder nicht?

    Würde mich über Hilfe freuen.
    Moin,

    die Variablennamen etc. sind nicht guidelinekonform, das neben dem Problem als Anmerkung. ;)

    Die Schleife muss in C# so lauten:

    C#-Quellcode

    1. foreach (int nbr in new[] {0,1,2,3}) { // ... }

    Besser wäre jedoch eine einfache For-Schleife:

    C#-Quellcode

    1. for (int i = 0; i <= 3; ++i) { // ... }


    Wenn Du übrigens dann nur in einen uint konvertierst, kannst Du den auch gleich statt einem int nutzen.

    Zu dem Code:

    C#-Quellcode

    1. Control = Controllers.First;

    Was genau soll das machen? Eine List<T> hat keine Property First oder so. Es gibt nur eine LINQ-Extension, die jedoch ein Predicate verlangt.

    Parmaster schrieb:

    Da fehlt doch das Handle, oder nicht?

    Nein, das gibt es in C# nicht. Da musst Du die Events manuell im Code abonnieren.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Moin,

    1.) Ja, der letzte Code ist die direkte Übersetzung.
    Da es in C# keine InputBox gibt, aber in der Klasse Interaction, wird die Klasse davor gesetzt. Aber InputBox sollte eh nicht verwendet werden.
    Bei Controllers.First vermute ich, dass das First die Extension aus System.Linq ist.

    2.) In C# gibt es kein Handles.
    Dazu musst du z.B. im Load-Event LSChanged abonnieren.
    Das geht folgendermaßen:

    VB.NET-Quellcode

    1. Control.StickChanged +=LSChanged


    Wichtig hierbei ist +=. Damit wird das Event abonniert
    StickChanged sollte das Event weiß, weiß nicht genau, wie es heißt ;)
    Grüße,
    Lukas

    Fragen über Themen im Forum per Konversation werden gelöscht und die Absender blockiert...

    C#-Quellcode

    1. foreach (int Nbr in new int[] { 0, 1, 2, 3 }) {
    2. }
    3. Control = Controllers.First();

    Dazu muss aber LINQ eingebunden sein also
    using System.Linq;

    Inputbox gibt es nur in VB. Du könntest über Add References eine Referenz auf Microsoft.VisualBasic hinzufügen und dann using Microsoft.VisualBasic (ugly)

    Handles gibt es nicht in c#. Du musst für jedes Event einmal ein Eventhandler zuweisen:

    C#-Quellcode

    1. this.Control.LeftStickChanged+= new System.EventHandler(this.LSChanged);
    Das ist meine Signatur und sie wird wunderbar sein!
    @Mono int kannste weglassen. Reicht new[] {...}. Und new EventHandler brauchste auch nicht unbedingt.
    Und statt InputBox lieber ein schöner, selbstgestalteter Dialog. ^^

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich bin mal so frei:
    Spoiler anzeigen

    C#-Quellcode

    1. public void Hand_Load(object sender, EventArgs e)
    2. {
    3. List<XboxController> Controllers = new List<XboxController>();
    4. for (int i = 0; i < 4; i++)
    5. {
    6. XboxController TempContrl = new XboxController(this, i+1)
    7. {
    8. StickMaxRadius = 34000,
    9. TrimStickLenght = true
    10. };
    11. TempContrl.Poll();
    12. if(TempContrl.StartCapturing(false))
    13. {
    14. Controllers.Add(TempContrl);
    15. }
    16. }
    17. switch(Controllers.Count)
    18. {
    19. case 0:
    20. MessageBox.Show("Es ist kein Controller angeschlossen.");
    21. this.Close();
    22. break;
    23. case 1:
    24. Control = Controllers.First();
    25. break;
    26. default:
    27. //What is happening here???
    28. //string Str = String.Empty;
    29. //uint Number = 0;
    30. //do
    31. //{
    32. // string InputString = InputBox("Es sind mehrere Controller angeschlossen\r\nBitte wählen: " + String.Join(", ", Controllers.ConvertAll(x => x.ControllerNumber)));
    33. // if(uint.TryParse(Str, out Number))
    34. // {
    35. // continue;
    36. // }
    37. //} while(Number < Controllers.Count);
    38. Control = Controllers.First();
    39. break;
    40. }
    41. }

    Was mich irritiert, ist der Part im Case Else. Da öffnest du bis zu 4 mal ne Input Box konvertierst da irgendetwas durch die Gegend, nur um dann aus der Liste den ersten Controller zu nehmen.
    Vielleicht hab ich das aufgrund meines begrenzten Wissens über die VB.NET Syntax falsch übersetzt, wenn jedoch nicht, versteh ich nicht was das alles im case else soll.

    Und ja, das mit den Events usw. läuft wie schon die Vorposter sagten etwas anders.

    Trade schrieb:

    @Mono int kannste weglassen. Reicht new[] {...}. ^^


    Ja. Würde ich aber dennoch nicht weglassen. Und so wie du es vor deinem Edit hattest geht es nur in VB :P
    (foreach (int nbr in {0,1,2,3}) {)

    Und die Inputbox ist wie ich schon sagte ugly. Würde ich nicht nehmen, aber man kann Sie nehmen, wenn man eben will (und weiss woher sie kommt).

    Und mit dem Eventhandler, ja , kann man so machen. ^^
    Das ist meine Signatur und sie wird wunderbar sein!
    Wow, so viele Antworten! Vielen Dank! :thumbup:

    Der ursprüngliche VB.NET Code ist aus dem Beispiel Projekt von Higlav mit seiner XBoxController Klasse.
    Das in dem Case Else ist halt wenn mehrere Controller angeschlossen sind. Ist hier aber unnötig, da es nur einen gibt.

    Das mit dem Eventhandler, ja, kenn ich, und total vergessen. Ist aber zugegebenermaßen auch mein erstes Projekt in C#.


    EDIT:

    @EaranMaleasi

    dein Code hier funktioniert so nicht:

    C#-Quellcode

    1. ​XboxController TempContrl = new XboxController(this, i+1)
    2. {
    3. StickMaxRadius = 34000,
    4. TrimStickLenght = true
    5. };


    Hab die geschweiften Klammern weggemacht.
    [/cs]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Parmaster“ ()

    Parmaster schrieb:

    Da fehlt doch das Handle
    In C# gibt es kein Handles, da werden die Handler dem Event im Designer hinzugefügt, darum musst Du Dich separat kümmern, jedem Control explizit zuweisen:

    C#-Quellcode

    1. this.btnX.Click += new System.EventHandler(this.btnX_Click);
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich muss doch noch mal nachfragen wegen dem Eventhandler.

    Ich hab nun in hier:

    C#-Quellcode

    1. public Form1()
    2. {
    3. InitializeComponent();
    4. Control.LeftStickChanged += LSChanged;
    5. Control.RightStickChanged += RSChanged;
    6. Control.ButtonPressed += BtnPressed;
    7. }


    Bekomme aber beim ausführen folgenden Fehler:
    ​Ein Ausnahmefehler des Typs "System.NullReferenceException" ist in XBoxCtl.exe aufgetreten.
    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


    Auch mit

    Quellcode

    1. this.Control.LeftStickChanged+= new System.EventHandler(this.LSChanged);

    funktioniert es nicht.
    Lager das mal in ein Event wie z. B. Load aus, anstatt das im Konstruktor zu machen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Parmaster schrieb:

    beim starten des Programms

    Das ist schon klar. StackTrace wäre da hilfreich.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Mehr steht nicht drin

    Quellcode

    1. ​System.NullReferenceException wurde nicht behandelt.
    2. HResult=-2147467261
    3. Message=Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    4. Source=XBoxCtl
    5. StackTrace:
    6. bei XBoxCtl.Form1.Form1_Load(Object sender, EventArgs e) in E:\User\Form1.cs:Zeile 42.
    7. bei System.Windows.Forms.Form.OnLoad(EventArgs e)
    8. bei System.Windows.Forms.Form.OnCreateControl()
    9. bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
    10. bei System.Windows.Forms.Control.CreateControl()
    11. bei System.Windows.Forms.Control.WmShowWindow(Message& m)
    12. bei System.Windows.Forms.Control.WndProc(Message& m)
    13. bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
    14. bei System.Windows.Forms.Form.WmShowWindow(Message& m)
    15. bei System.Windows.Forms.Form.WndProc(Message& m)
    16. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    17. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    18. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    19. InnerException:

    Parmaster schrieb:

    bei XBoxCtl.Form1.Form1_Load(Object sender, EventArgs e) in E:\User\Form1.cs:Zeile 42.

    Ach nein? :P Dann setze da mal einen Haltepunkt und untersuche, was Nothing ist.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Jo, Du erstellst ja auch nirgends eine Instanz davon. Kannste direkt hinter der Deklarierung machen oder dann vor irgendwelchen Aktionen in einem Event.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: