• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

Blackhawk50000

Spiele-Novize/Novizin
Mitglied seit
02.12.2004
Beiträge
108
Reaktionspunkte
0
C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

den quelltext packe ich unten in den anhang.. :)


also es geht sich um folgendes. ich hab da so ein programm geschrieben das per knopfdruck beeptöne abspielt die ich in den qeulltext eingebaut habe. die beeptöne werden von einer einzigen methodenzeile ausgegeben. der methodenaufruf, übergibt die einzelnen notenfrequenzen und die länge der noten. dieser aufruf wird immer und immer wieder gemacht. nun ist meine idee. die ganzen aufrufe aber, sind wiederru m in einer methode gepackt die von einef if else anweisung selectiert wird und dann aufgerufen wird. es gibt 3 radiobuttons. ist einer davon gechecked, wird die jeweilige methode dazu aufgerufen. und das ganze will ich gerne in eine eigene datei packen und dann die methodenaufrufe die die frequenzen und längen übergibt, aufrufe... ihr versteht hoffentlich was ich meine. habt ihr noch eine bessere, VIEL bessere idee, dann teilt sie mir bitte mit.. :) danke....



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Liedabspielprogramm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
if (radioEntchen.Checked == true)
{
progressBar1.Maximum = 27;
progressBar1.Value = 0;
PlayEntchen();
label1.Visible = true;
label1.Text = (progressBar1.Value + " Töne");
}
else if (radioBells.Checked == true)
{
progressBar1.Maximum = 11;
progressBar1.Value = 0;
PlayBells();
label1.Visible = true;
label1.Text = (progressBar1.Value + " Töne");
}
else if (radioElise.Checked == true)
{
//progressBar1.Maximum = 11;
//progressBar1.Value = 0;
PlayElise();
label1.Visible = true;
label1.Text = (progressBar1.Value + " Töne");
}
else MessageBox.Show("Dieses Lied ist noch nicht Vorhanden");

}




#region Alle meine Entchen
private void PlayEntchen()
{
Beep(262, 250);
progressBar1.Value += 1;
Beep(294, 250);
progressBar1.Value += 1;
Beep(330, 250);
progressBar1.Value += 1;
Beep(349, 250);
progressBar1.Value += 1;
Beep(392, 500);
progressBar1.Value += 1;
Beep(392, 500);
progressBar1.Value += 1;
Beep(440, 250);
progressBar1.Value += 1;
Beep(440, 250);
progressBar1.Value += 1;
Beep(440, 250);
progressBar1.Value += 1;
Beep(440, 250);
progressBar1.Value += 1;
Beep(392, 700);
progressBar1.Value += 1;
System.Threading.Thread.Sleep(70);
Beep(440, 250);
progressBar1.Value += 1;
Beep(440, 250);
progressBar1.Value += 1;
Beep(440, 250);
progressBar1.Value += 1;
Beep(440, 250);
progressBar1.Value += 1;
Beep(392, 700);
progressBar1.Value += 1;
System.Threading.Thread.Sleep(70);
Beep(349, 250);
progressBar1.Value += 1;
Beep(349, 250);
progressBar1.Value += 1;
Beep(349, 250);
progressBar1.Value += 1;
Beep(349, 250);
progressBar1.Value += 1;
Beep(330, 500);
progressBar1.Value += 1;
Beep(330, 500);
progressBar1.Value += 1;
Beep(392, 250);
progressBar1.Value += 1;
Beep(392, 250);
progressBar1.Value += 1;
Beep(392, 250);
progressBar1.Value += 1;
Beep(392, 250);
progressBar1.Value += 1;
Beep(262, 500);
progressBar1.Value += 1;
}
#endregion

#region Jingle Bells
private void PlayBells()
{
Beep(330, 250); // Quarter E
progressBar1.Value += 1;
Beep(330, 250); // Quarter E
progressBar1.Value += 1;
Beep(330, 500); // Half E
progressBar1.Value += 1;
Beep(330, 250); // Quarter E
progressBar1.Value += 1;
Beep(330, 250); // Quarter E
progressBar1.Value += 1;
Beep(330, 500); // Half E
progressBar1.Value += 1;
Beep(330, 250); // Quarter E
progressBar1.Value += 1;
Beep(392, 250); // Quarter G
progressBar1.Value += 1;
Beep(262, 250); // Eigth C
progressBar1.Value += 1;
Beep(294, 250); // Eigth D
progressBar1.Value += 1;
Beep(330, 500); // Quarter E
progressBar1.Value += 1;
}
#endregion

#region Für Elise
private void PlayElise()
{
System.Threading.Thread.Sleep(120);
Beep(659, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(622, 120); // Treble D#
System.Threading.Thread.Sleep(120);
Beep(659, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(622, 120); // Treble D#
System.Threading.Thread.Sleep(120);
Beep(659, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(494, 120); // Treble B
System.Threading.Thread.Sleep(120);
Beep(587, 120); // Treble D
System.Threading.Thread.Sleep(120);
Beep(523, 120); // Treble C
System.Threading.Thread.Sleep(120);
Beep(440, 120); // Treble A
System.Threading.Thread.Sleep(140);
Beep(262, 120); // Middle C
System.Threading.Thread.Sleep(120);
Beep(330, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(440, 120); // Treble A
System.Threading.Thread.Sleep(120);
Beep(494, 120); // Treble B
System.Threading.Thread.Sleep(140);
Beep(330, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(415, 120); // Treble G#
System.Threading.Thread.Sleep(120);
Beep(494, 120); // Treble B
System.Threading.Thread.Sleep(120);
Beep(523, 120); // Treble C
System.Threading.Thread.Sleep(140);
Beep(330, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(659, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(622, 120); // Treble D#
System.Threading.Thread.Sleep(120);
Beep(659, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(622, 120); // Treble D#
System.Threading.Thread.Sleep(120);
Beep(659, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(494, 120); // Treble B
System.Threading.Thread.Sleep(120);
Beep(587, 120); // Treble D
System.Threading.Thread.Sleep(120);
Beep(523, 120); // Treble C
System.Threading.Thread.Sleep(120);
Beep(440, 120); // Treble A
System.Threading.Thread.Sleep(140);
Beep(262, 120); // Middle C
System.Threading.Thread.Sleep(120);
Beep(330, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(440, 120); // Treble A
System.Threading.Thread.Sleep(120);
Beep(494, 120); // Treble B
System.Threading.Thread.Sleep(140);
Beep(330, 120); // Treble E
System.Threading.Thread.Sleep(120);
Beep(523, 120); // Treble C
System.Threading.Thread.Sleep(120);
Beep(494, 120); // Treble B
System.Threading.Thread.Sleep(140);
Beep(44, 120); // Treble A
}
#endregion

#region Tonausgabe
[DllImport("kernel32.dll")]
private static extern bool Beep(int frequenz, int dauer);
#endregion



}
}
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

Ok, ich kann nicht behaupten, das Problem jetzt zur Gänze erfasst zu haben :B
Heißt "eigene Datei", daß du das quasi in ne eigene Klasse auslagern willst? Falls ja, wo genau brauchst du da Hilfe? Falls nein, was dann?

Eigene Idee, wo wir gerade beim Übertreiben sind: ne abstrakte Klasse "Song" mit ner abstrakten Methode "Play", und dann für jedes Lied ne eigene Klasse basteln, die "Play" implementiert. Das wär aber schon arg übertrieben :B
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

DJ_of_Borg am 06.11.2007 11:24 schrieb:
Ok, ich kann nicht behaupten, das Problem jetzt zur Gänze erfasst zu haben :B
Heißt "eigene Datei", daß du das quasi in ne eigene Klasse auslagern willst? Falls ja, wo genau brauchst du da Hilfe? Falls nein, was dann?

Eigene Idee, wo wir gerade beim Übertreiben sind: ne abstrakte Klasse "Song" mit ner abstrakten Methode "Play", und dann für jedes Lied ne eigene Klasse basteln, die "Play" implementiert. Das wär aber schon arg übertrieben :B



was genau ist ne abstrakte klasse/methode?

ich kenn nur normale methoden und klassen

und mit eigene datei meine ist eine textdatei in der ich DEN c# code einsetze und das programm liest die datei und nutzt die methodenaufrufe in der datei

aber man kann auch die einzelnen klassen in klassen datein aufspalten.... dann habe ich eine *.mp3 datei als song sondern eine *.cs datei als song... meinst du das so?
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

Blackhawk50000 am 06.11.2007 11:35 schrieb:
was genau ist ne abstrakte klasse/methode?

ich kenn nur normale methoden und klassen
In dem Fall lassen wir das erstmal weg ;)
Falls es dich doch gleich interessiert: du hast ja hier im Forum afaik schon ein paar gute Bücher verlinkt bekommen, lies es dir da durch. Dürfte besser sein, als wenn ich mir hier ne Erklärung abbrech ;)

und mit eigene datei meine ist eine textdatei in der ich DEN c# code einsetze und das programm liest die datei und nutzt die methodenaufrufe in der datei
Ja, also quasi ne eigene Klasse. Gibt dann zwei nur leicht unterschiedliche Möglichkeiten: entweder ne Klasse, die alle "Lied-abspiel-Methoden" enthält, von der du dann ein Objekt erstellst und die Methoden aufrufst, oder du machst die Methoden static und sparst dir dabei die Objekterstellung.

aber man kann auch die einzelnen klassen in klassen datein aufspalten.... dann habe ich eine *.mp3 datei als song sondern eine *.cs datei als song... meinst du das so?
Sehr grob betrachtet wär das bei der Sache mit der abstrakten Klasse rausgekommen.
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

DJ_of_Borg am 06.11.2007 11:42 schrieb:
Blackhawk50000 am 06.11.2007 11:35 schrieb:
was genau ist ne abstrakte klasse/methode?

ich kenn nur normale methoden und klassen
In dem Fall lassen wir das erstmal weg ;)
Falls es dich doch gleich interessiert: du hast ja hier im Forum afaik schon ein paar gute Bücher verlinkt bekommen, lies es dir da durch. Dürfte besser sein, als wenn ich mir hier ne Erklärung abbrech ;)

und mit eigene datei meine ist eine textdatei in der ich DEN c# code einsetze und das programm liest die datei und nutzt die methodenaufrufe in der datei
Ja, also quasi ne eigene Klasse. Gibt dann zwei nur leicht unterschiedliche Möglichkeiten: entweder ne Klasse, die alle "Lied-abspiel-Methoden" enthält, von der du dann ein Objekt erstellst und die Methoden aufrufst, oder du machst die Methoden static und sparst dir dabei die Objekterstellung.

aber man kann auch die einzelnen klassen in klassen datein aufspalten.... dann habe ich eine *.mp3 datei als song sondern eine *.cs datei als song... meinst du das so?
Sehr grob betrachtet wär das bei der Sache mit der abstrakten Klasse rausgekommen.


ja das ist gut, ich versuchs mal mit den einzelnen cs datein... :)
ach und noch n problem... (kannst den code ja mal kopieren und testen) wenn das lied spielt, hängt das ganze programm bis das lied zuende ist und ich kann solange nichts beenden oder was auch immer.... und ehm.... ich habe keine ahnung wie und wo und welchen code ich einsezuen muss damit der stop button geht den ich eingebaut habe...

http://img255.imageshack.us/my.php?image=unbenanntri8.jpg
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

Blackhawk50000 am 06.11.2007 11:54 schrieb:
ach und noch n problem... (kannst den code ja mal kopieren und testen) wenn das lied spielt, hängt das ganze programm bis das lied zuende ist und ich kann solange nichts beenden oder was auch immer.... und ehm.... ich habe keine ahnung wie und wo und welchen code ich einsezuen muss damit der stop button geht den ich eingebaut habe...

http://img255.imageshack.us/my.php?image=unbenanntri8.jpg
Das liegt einfach daran, daß du das abspielen im selben Thread laufen lässt wie den Rest des Programms. Dadurch kann das Programm erst wieder irgendwelche Eingaben verarbeiten, wenn der aktuelle Code (das beepen) durchgelaufen ist.
Lösung: die Beep-Methoden als Thread laufen lassen. Den Stop-Button kannst du dann auch einbauen, der kann den Beep-Thread dann abbrechen.
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

DJ_of_Borg am 06.11.2007 12:00 schrieb:
Blackhawk50000 am 06.11.2007 11:54 schrieb:
ach und noch n problem... (kannst den code ja mal kopieren und testen) wenn das lied spielt, hängt das ganze programm bis das lied zuende ist und ich kann solange nichts beenden oder was auch immer.... und ehm.... ich habe keine ahnung wie und wo und welchen code ich einsezuen muss damit der stop button geht den ich eingebaut habe...

http://img255.imageshack.us/my.php?image=unbenanntri8.jpg
Das liegt einfach daran, daß du das abspielen im selben Thread laufen lässt wie den Rest des Programms. Dadurch kann das Programm erst wieder irgendwelche Eingaben verarbeiten, wenn der aktuelle Code (das beepen) durchgelaufen ist.
Lösung: die Beep-Methoden als Thread laufen lassen. Den Stop-Button kannst du dann auch einbauen, der kann den Beep-Thread dann abbrechen.

oh... und... *hust*... wie mach ich das? also das in einen thread einbauen?... und.... wie geht der code für den stop buton?
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

Blackhawk50000 am 06.11.2007 12:04 schrieb:
oh... und... *hust*... wie mach ich das? also das in einen thread einbauen?... und.... wie geht der code für den stop buton?

Sieht dann etwa so aus (habs mal aufs Wesentliche gekürzt):

Code:
//usings...

namespace Liedabspielprogramm
{
    public partial class Form1 : Form
    {
        Thread playThread; //global, damit beim Stop-Button drauf zugegriffen werden kann

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            progressBar1.Visible = true;
            if (radioEntchen.Checked == true)
            {    
                playThread = new Thread(new ThreadStart(PlayEntchen));                
            }
            else if (radioBells.Checked == true)
            {
                playThread = new Thread(new ThreadStart(PlayBells));
            }
            else if (radioElise.Checked == true)
            {
                playThread = new Thread(new ThreadStart(PlayElise));
            }
            else
            { 
                MessageBox.Show("Dieses Lied ist noch nicht Vorhanden");
                playThread = null;
            }

            if(playThread != null)
                playThread.Start();
        }

        private void PlayEntchen()
        {
            //...
        }

        private void PlayBells()
        {
            //...
        }

        private void PlayElise()
        {
            //..
        }
        //...
    }
}

Und für den Stop-Button:
Code:
playThread.Abort();

Sollte so tun. Wird aber höchstwahrscheinlich ein Problem mit deiner ProgressBar geben, da auf diese nicht von einem fremden Thread zugegriffen werden kann. Lösungsstichwörter: Delegate & Invoke. Code kann ich dir da später / heut abend theoretisch zusammenbasteln, jetzt muss ich erstmal selber wieder was schaffen ;) Weiß aber auch nicht, ob das für deinen Kenntnisstand nicht etwas zu früh ist und du dir vielleicht nicht doch erst ein paar grundlegendere Kenntnisse anschaffen solltest (Stichwort Objetorientierung und solche Grundlagen).
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

DJ_of_Borg am 06.11.2007 12:23 schrieb:
Edit DJ: Quote rausgekürzt


also, du hast ja soo recht.... von delegate habe ich schon gehört, aber... HÄ WTF is that?

ich bin glaube ich zu blöd um zu programmieren, ich meine, ich habe hier das buch visual c# schritt für schritt und bin beim kapitel 8... undich raff nur sehr wenig.... ich weiß ztwar ich ich ein objekt deklariere und auch wie ich eins initialisiere, aber ich habe icht gerafft was ich damit machen kann und wozu ich das brauche.... ja klar sicher, für sowas.... aber.... boar das ist so schwer.. :(... aber wenn mal was klappt macht es sau viel spaß.....weil du selber etwas geschaffen hast..... (etwas was nicht jeder kann zum ersten, und etwas was NIEMAND sonst so hat zum zweiten)

PS: ich habe früher bei c++ nicht mal gerafft wie n unterprogramm geht und wie das gemacht wird und so.... wie bei den objekten jetzt.... und jetzt heißen die unterprogramme methoden und ich weiß wie man die verwendet und so.... (das habe ich doch hoffentlich in meinem code richtig gemacht, also methoden verwndet)
naja mit klassen wird es dann auch schon schwrer.. ich habe mir schon 2 bücher durchgelesen die sich damit beschäftigt haben, aber verflucht es ist so schwer.. :(...... oder ich bin zu blöd
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

Blackhawk50000 am 06.11.2007 12:32 schrieb:
ich bin glaube ich zu blöd um zu programmieren
Na, mal nicht zu hart zu dir selbst sein ;) Wenn ich das hier im Forum richtig mitbekommen hab machts du das ja erst ein paar Wochen, und in der Programmierung gibts einfach nen Haufen Prinzipien, die man erstmal durchschauen muss. Das geht nicht von jetzt auf sofort.

ich meine, ich habe hier das buch visual c# schritt für schritt und bin beim kapitel 8... undich raff nur sehr wenig....
Gut, ich kenn das Buch nicht, keine Ahnung wie das aufgebaut ist und wie weit "Kapitel 8" da bedeutet. Sind da Übungsaufgaben drin? Ich kann natürlich nur für mich sprechen, aber ich hab in Sachen Programmierung noch nichts wirklich kapiert, was ich nicht mindestens einmal sebst angewendet hab (am besten zweimal: einmal irgendwo abschreiben und sehen wies funktioniert, einmal etwas anderes selbst mit diesem Prinzip verwirklichen).

ich weiß ztwar ich ich ein objekt deklariere und auch wie ich eins initialisiere, aber ich habe icht gerafft was ich damit machen kann und wozu ich das brauche...
Im Prinzip soll die objektorientierte Programmierung dafür genutzt werden, die Realität möglichst genau abbilden zu können. Objekte der Realität haben verschiedene Eigenschaften und können verschiedene Dinge tun, genauso ist es mit Objekten, die du in C# (o.ä.) erstellst. Eines der ersten Beispiele dazu, an die ich mich noch aus meiner Schulzeit erinnere, ist ein Auto. Es hat verschiedene Eigenschaften (PS, Höchstgeschwindigkeit, Farbe, Tankfüllung etc.) und kann verschiedene Dinge (fahren, parken, auftanken etc.). Jedes Auto hat diese Eigenschaften, aber verschiedene Autos haben verschiedene Werte für diese Eigenschaften. Programmtechnisch hättest du eine Klasse "Auto", welche die Eigenschaften "int PS", "double Tankfüllung"... und die Methoden Fahren(double kilometer), Auftanken(double liter) hat. Jetzt kannst du verschiedene Auto-Objekte anlegen, die verschiedene Eigenschaftswerte haben, und anschliessend deren Methoden nutzen. In Fahren() hast du dann beispielsweise implementiert, ob genug Sprit für die angegebene Distanz vorhanden ist, falls ja, setzt du den Kilometerstand hoch und die vorhandene Spritmenge runter. Schon hast du die Realität (bzw. nen sehr kleinen Auschnitt davon) "nachgestellt".
Mir fällt an dieser Stelle wieder mal auf, wie wenig ich doch eigentlich zum Lehrer tauge :B

Abschliessend noch: Wenn du wirklich die objektorientierte Programmierung lernen willst, ist jetzt die Zeit gekommen, dein Beep-Programm abzuschliessen. Das war ganz gut um mal ein wenig in die Grundlegende Syntax der Sprache reinzukommen, bietet aber keinerlei Ansatz für eine sinnvolle Objektorientierung. Such dir für den Anfang irgendetwas aus der "realen Welt", das du nachbauen möchtest. Erstelle dafür eine Klasse mit Eigenschaften und Funktionen (für Fantasielose auch gerne das genannte Autobeispiel erweitern^^). Erstelle danach ein Programm, das diese Klasse nutzt, verschiedene Objekte davon anlegt und dann deren Funktionen aufruft. Wenn das soweit funktioniert, solltest du schon ein gutes Stück weiter sein mit dem Verständnis. Erst wenn das soweit mal sitzt an die ersten GUIs gehen (das war der Punkt, an dem ich in der Schule einen Arsch voll Verwaltungsprogramme hab schreiben müssen. In Fach A sollten wir Schüler, Lehrer und Stundenpläne verwalten, Fach B wollte irgendwas mit Zügen haben, Fach C ließ uns die freie Wahl, was wir verwalten wollten.... ziemlich öde auf Dauer :B ).

Falls irgendwo Fragen auftauchen: nur raus damit. Gibt hier ja ein paar Leute, die der Sache mächtig sind ;)
 
AW: C# brauche Hilfe bei einem Sehr schwerem Spaßprogramm.

ja ich weiß was du meinst und du hast recht. in dem buch gibt es über 20 kapitel, und es goibt da keine aufgaben oder übungen.... nur beispielprogramme und preudoübungen wo dir das buch sagt die und die zeile musst du einfügen und das muss dann so aussehen, aber keine aufgaben die mich fordern die mich zum denken anregen.... deswegen auch das biep programm, ich wollte selbst etwas überlegen müssen selber was schaffen. etwas was nicht vorgegeben ist. außerdem brauch ich sowas ab und zu um mal von dem erst der ganzen sache weg zu kommen und nur spaß programming zu betreiben.
ich finde das ganze problem an der programmierung lernen sache ist, das die meisten bücher das einfach nicht gut rüber bringen. ich breuche etwas oder jemanden der mich das zeigt, und auf meine fragen eingeht und mir auch aufgaben stellt an denen ich wachsen und auch lernen kann. wie du schon sagtest, wenn man etwas selber mal gemacht hat, aus der eigenen idee raus, und sich intensivst damit beschäftigt, dann versthst mans auch. aber ich brauche hilfe dabei.... ganz einfach
 
Zurück