[.NET] C# - Listbox-Objekt zurückholen oder String aufteilen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von CHied, 3. Juni 2008 .

  1. 3. Juni 2008
    C# - Listbox-Objekt zurückholen oder String aufteilen

    Guten Abend alle miteinander

    Ich habe versucht, ein objektorientiertes Programm zu erstellen, das eine art Wiedergabeliste mit Beep-Tönen erstellt.
    Beep Töne sind Töne, welche per System-Lautsprecher ausgegeben werden und mittels
    Code:
    [DllImport("kernel32.dll")]
    public static extern bool Beep(int frequency, int duration);
    Beep(1000, 500); //1000Hz, 500ms
    aufgerufen werden können.

    Für diese Wiedergabeliste habe ich eine Listbox verwendet und ihr folgendermassen die Objekte mit den hinterlegten Werten hinzugefügt:
    Code:
    lsb_Liste.Items.Add(Ton.getName());
    getName() bewirkt in diesem Zusammenhang, dass die relevanten Informationen (Frequenz, Dauer, Anzahl Wiederholungen) in einem String zusammengefasst werden und als Itemname in der Listbox verwendet werden.
    Dadurch ergeben sich Itemnamen wie z.B. "1000 Hz, 500 ms, 3x", "200 Hz, 300 ms, 2x" usw.

    Damit ich nun einzelne Beeps dieser Liste wiedergeben kann, brauche ich diese Angaben wieder. Da ich mit Objekten und nicht mit Arrays, etc. arbeite, nützt mir der Index, an dem das ausgewählte Objekt ist, leider nichts.

    Nun ist meine Überlegung, ob eine der folgenden Möglichkeiten funktioniert, und falls ja: Wie?

    1. Objekt aus Listbox zurückgewinnen
    Ich habe probiert, mittels folgendem Code, das Objekt aus der Listbox zurückzugewinnen. Leider wird mir irgendwie nur ein String geliefert, welchen ich - logischerweise - nicht in ein Objekt der Klasse "Ton" konvertieren kann:
    Code:
    Ton t = (Ton)lsb_Liste.SelectedItem;
    Mache ich etwas mit der Syntax falsch, oder ist es gar nicht möglich, Objekte aus einer Listbox zurück zu holen?

    2. Text in verschiedene Int32-Werte aufteilen
    Da ich - wie oben beschrieben - nur einen String zurückerhalte, habe ich mir als Alternative überlegt, den erhaltenen String einfach in seine 3 Teile aufzuteilen (Also in Frequenz, Dauer, Anzahl Wiederholungen).
    Nun... Wie mache ich das bei einem String? Die Werte können von 1-20000 gehen, eine fixe Anzahl Zahlen gibt es also nicht. Am Schluss müssten drei Variablen gefüllt werden...

    Kann mir vielleicht ein Routinier hier weiterhelfen? Hatte noch nie die Situation, dass ich soetwas gebraucht hätte und im Internet habe ich auch nicht wirklich viel gefunden (Ich verwende vorallem das Openbook von GalileoComputing).

    Vielen Dank im Voraus und freundlicher Gruss
    Chied
     
  2. 4. Juni 2008
    AW: C# - Listbox-Objekt zurückholen oder String aufteilen

    Hi,
    das du kein Objekt von Typ Ton aus deiner Listbox bekommst ist klar, schließlich fügst du der Liste ja auch nur einen String hinzu (man kann auch nur String hinzufügen).

    Spontan würd mir die Methode Split() der String Klasse einfallen. Als Parameter der Methode gibst du ein Trennzeichen ein, wonach die Elemente getrennt werden soll.

    So stelle ich mir das vor:
    Code:
    string ton = lsb_Liste.SelectedItem; //Der String liegt so vor: 1000, 500
    string[] tonParameter = ton.Split(',')
    
    intTonParameter1 = Convert.ToInt32(tonParameter[0]); //String zu Int Konvertierung
    intTonParameter2 = Convert.ToInt32(tonParameter[1]);
    
    Ton t = new Ton(intTonParameter1, intTonParameter0);
    Ich hoffe ich hab dein Problem richtig verstanden und konnte dir dementsprechend helfen.

    EDIT: Ich lese gerade in welcher Form deine Strings vorliegen (1000Hz, 500ms, 2x).
    Dann müsstest du noch die Methode Substring() der Klasse String zu hilfe nehmen.
     
  3. 4. Juni 2008
    AW: C# - Listbox-Objekt zurückholen oder String aufteilen

    Du brauchst noch nicht einmal den Umweg über den DLL-Import machen, nutze einfach "Console.Beep(Frequenz, DauerInMS)", dies schließt komplizierteres aus ^^

    Ach ja, den String <ton> kannst du auch folgendermaßen auseinandernehmen:

    Code:
    String[] TonParameterArray = ton.Replace(", ", ";").Split(';');
    
    So liefert dir die Abfrage "Convert.ToInt32(TonParameterArray[0]);" einen int-wert mit der Frequenz, "Convert.ToInt32(TonParameterArray[1]);" liefert auch im int-Wert die Dauer.

    Doch in deiner Listbox steht nach wie for "1000, 500".

    Mein Lösungsvorschlag Zusammengefasst:

    Code:
    string[] tonParameter = lsb_Liste.SelectedItem.Replace(", ", ";").Split(',');
    
    intTonParameter1 = Convert.ToInt32(tonParameter[0]);
    intTonParameter2 = Convert.ToInt32(tonParameter[1]);
    
    Console.Beep(intTonParameter1, intTonParameter2);
    
    Du brauchst eigentlich keine Klasse <Ton> mehr und auch nicht mehr den DLL-Import mit "kernel32.dll", du brauchst ganz oben lediglich "using System;" stehen zu haben, dies ist aber meisst schon von Visual Studio automatich im Code mit eingebunden. Das wars dann auch schon.

    Viel Spaß noch!
     
  4. 4. Juni 2008
    AW: C# - Listbox-Objekt zurückholen oder String aufteilen

    Oder du fügst der ListBox (wenn ich mich irre korregiert mich bitte, bin aber der Meinung dass das klappt) nicht den "Namen" (.getName()) hinzu, sondern das Objekt, und machst 'nen Overload der ToString()-Function. Dann dürfte sich die Anzeige in der ListBox nicht ändern, da diese grundsätzlich die .ToString() darstellt, und du könntest über den SelectedIndex wieder an das Object (die Klasse) kommen.
    Das wäre dann die Lösung für deine Variante 1 gewesen... erfordert wenig Rechenleistung, kein Herumhantieren mit Strings, Splits und Arrays, und funktioniert trotzdem.
    Kann's aber momentan leider nicht testen, hoffe das funzt so

    Gruß Roogley
     
  5. 4. Juni 2008
    AW: C# - Listbox-Objekt zurückholen oder String aufteilen

    Roogley:
    Das habe ich soo nicht usprobiert

    Die beiden oberen Varianten funktionieren (nach kleinen Anpassungen) perfekt.

    Somit ist mein Problem erledigt

    Vielen Dank an euch.
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.