• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[C#] Musikplayer programmiert, aber es fehlen noch Features

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.560
@Cyberfriend
Du solltest dir überlegen wo, außerhalb der Listbox du deine Daten speicherst, also das was Kapitn sagt.

Also das heißt du hast ein String Array oder was C# da so hat, und speicherst in diesem Array das folgende:
"Pfad" ('C:\mp3')
"Dateiname" ('Meine.mp3')
und oder nur
"kompletter Pfad" ('C:\mp3\Meine.mp3')

und das für jede Datei....

Wenn du dann darauf zugreifen mußt, hast du einmal den Pfad und dann den Dateinamen und auch schon alles gesichert.
Die kannst du ja auch ganz einfach verbinden, aber wichtig ist, das die Informationen außerhalb dessen liegen, was du dem Benutzer zeigst.

Der Nutzer sieht nur "Meine.mp3" - in Wirklichkeit greifst du aber immer auf "C:\mp3\Meine.mp3" in den gespeichert Werten (nicht in der Listbox selbst) zu.
Das kommt später.

Lass dich nicht entmutigen wenn es mal schwerer ist, du mußt dir dann aber halt die Zeit nehmen die Sprache zu lernen oder zu fragen und aber auch die Dokumentation zu lesen, da gibt es ja sogar gute Beispiele, und dann erst Wege zu finden wie du das, was du tun willst, umsetzen kannst.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #22
Der springende Punkt ist, dass man die Dokumentationen und Beispiele verstehen und auf sein eigenes Projekte dann übertragen muss. Genau da hapert es aber. KaPiTN weis wohl auch, wovon ich rede. Er hilft mir ja nicht das erste mal (bzw. versucht es).

Bei mir ist es halt leider so, dass sich mein Programmieren meist auf auswendig lernen des nötigen Codes beschränkt. Ganz selten klappt es dann mal, dass ich es dann doch selber durch "logisches Denken" hinbekomme oder es halt einfach mal funktioniert, weil ausnahmsweise nicht um 20 Ecken gedacht werden muss und vorher 20 Variablen mit Arrays und co. deklariert werden müssen, auf die man dann wieder umständlich zugreifen muss)

Das hier ist eigentlich was total simples und primitives und ich ärgere mich auch gerade wahnsinnig, dass ich es nicht hinbekomme.

Ich habe auch den Befehl
[src=csharp]Path.GetFullPath[/src] entdeckt, aber wie zu erwarten bekomme ich wieder was ganz anderes als ich will (nämlich den Pfad zu meiner Programm.exe. Das kotzt mich regelrecht an, weil ich was anderes erwartet habe und ich keinen anderen Befehl finde, der mir das Verzeichnis anzeigt, dass ich in der Listbox ausgewählt habe. Hätte ich das, wäre die Sache durch.)

Ich weis genau, was du meist mit
"Pfad" ('C:\mp3')
"Dateiname" ('Meine.mp3')
und oder nur
"kompletter Pfad" ('C:\mp3\Meine.mp3')
meinst
Mit PHP würde ichs sogar sehr wahrscheinlich hinekommen. Bei C# klappt es aber nicht, weil dauernd irgend ein Mist nicht beachtet wurde oder schlichtweg anders funktioniert. (Womit ein wesentlicher Unterschied zwischen Scripten und Programmieren festgestellt wäre.)
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.560
Du wirst immer Unterschiede zwischen PHP und C# haben, das sind halt beides zwei ganz unterschiedliche Sprachen.

Man muß auch gar nicht alles wissen, aber wenn man etwas nicht weiß, muß ich googlen (wenn ich weiß was das Problem ist) und die Dokumentation offen haben, am besten in einer Übersicht und dann einfach mal in ein Thema schauen was damit zu tun hat und mit dem was du genau machen willst.

Anders funktioniert es nicht und es verlangt auch niemand das du alle Befehle kennst, nur man muß selbst wissen wo nach man sucht bzw. wo man suchen kann. ;)

PHP hat doch auch nur eine Bibliothek, dafür ist in der alles mögliche enthalten und du mußt doch auch dort die Doku wälzen, wenn du gerade nicht weißt ob du nun mit einem String arbeitest, mit einer Datei, mit einer URL, mit einem Bild oder einem Array.... in jedem Kernbereich gibt es Sachen mit denen du arbeiten kannst, wie du vermutlich auch weißt - und da schaut man zu aller erst nach ob String, Datei, URL, Bild - Funktionen. Was gibt es schon, was haben andere gemacht (Google ist dein Freund) oder selbst wenn du nur die Komponenten kennst "c# listbox how to get selected item" - und schon, da bin ich mir sehr sicher, wirst du Beispiele finden oder auf die Dokumentation verwiesen.

Das kann frustrierend sein, aber man darf sich einfach nicht entmutigen lassen - im schlimmsten Fall legt man es an die Seite und ein paar Stunden später kommt einem eine Idee, ganz unbewusst. Oder man sucht nach einer Lösung weil man sich überlegt hat wie die Dinge ineinander greifen könnten.

Und wie gesagt, du kannst auch hier Fragen... :)

Ich kann dir nur halt nicht 100% helfen, da ich selbst nie C# gelernt habe, aber ich kann es mir herleiten - aber das muß man üben bzw. sich verschiedene Sprachen anschauen. So hart das klingen mag. Bis es "klick" macht. ;)

Und wenn du PHP kannst, kannst du auch aus Erfahrungen davon zurückgreifen wie ein Problem dort gehandhabt wurde. :)

Aber PHP hat auch kein UI, das ist bei C# definitiv anders.

Für dich, diese Doku Seite:
https://msdn.microsoft.com/de-de/library/mt472912(v=vs.110).aspx
 
Zuletzt bearbeitet:

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
Die reine logik ist in jeder Sprache relativ gleich....

Evtl. mal ein Beispiel:

Du hast nicht nur .mp3 in einem Verzeichnis ohne Ordner liegen (Die meisten Sortieren ja ihre Lieder z.B. nach Alben, Artist usw.)
Das heißt wenn ich nun ein Stück Code schreibe das mir alle .mp3 unter
c:\mp3\ auflistet (was du ja so ähnlich machst) - dann bekomme ich evtl. aus diesem Verzeichnis-Baum:

c:\mp3\Abba
Abba1.mp3
Abba2.mp3
c:\mp3\Beatles
Beatle1.mp3

Das ist der Listbox:
Abba1
Abba2
Beatle1

Nun hängst du beim Auswählen ein .mp3 hinten hin und versuchst die Datei Abba1.mp3 abzuspielen.
Woher soll nun eine beliebige Funktion die du Suchst - egal in welcher Sprache wissen das auf deinem pc (und das Programm soll ja auf jedem Computer laufen) die Datei Abba1.mp3 unter c:\mp3\Abba liegt?


Zur Lösung des Problemes gibt es grob 2 (evtl. auch mehr) Wege:
a) Du trennst "wissen / die Daten" von "Anzeige"
- Das heißt du Liest zuerst alle .mp3 aus und speicherst alles was du darüber in Erfahrung bringen kannst unsichtbar im Programm ab (Stichwort Dictonary oder Collection und "Eigene Klasse"
- Schreibst dann im zweiten Schritt eine Funktion die alle Namen der Lieder in deiner unsichtbaren Wissens-Quelle ausliest und in der Listbox anzeigt.
- Beim selektieren vergleichst du wieder das ausgewählte mit deiner Wissens-Quelle und liest dort den Datei-Pfad aus.

b) Du nimmst nicht eine Listbox sondern ein Data-Grid - Sprich so etwas wie Excel - machst das nur eine paar wenige Zeilen hoch und speicherst in Spalten pfad, Dabeiname usw.. und blendest dann z.B. den Pfad optisch aus.

Andere Frage die sich meinem Text von ganz oben anschließt - wie würdest du dein Problem denn in PHP lösen?
Egal welche Sprache - in der Schule lernt man das Schreiben eines Programm-Ablaufplanes - das nerft dort zwar, ist aber definitiv nicht Blöd. Zeichne einen solchen einfach einmal auf - gerne auch mit unserer Korrektur.
Ein Ablaufplan für die einzelnen Funktionen:
- Programmstart
- Doppelklick auf Lied
- Lied Abspielen

usw.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
In der Listbox steht nur noch der Dateiname ohne Dateityp (also ohne das .mp3)
Schreibst du und direkt darunter finde ich folgenden code
[src=csharp]
listBox1.Items.Add(Path.GetFileNameWithoutExtension(file));
[/src]
Sicher, dass dir da nichts besonderes auffällt?????


Gibst du deine allgemeineren Fragen immer erst bei google / stack exchange ein, bevor du hier fragst?
Dinge wie 'wie lese ich MP3 tag aus' und ähnliches meine ich.. Ich kriege bei 'read mp3 tags c sharp' per Google direkt extrem hilfreiche Beiträge..
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Da meine Hinweise in #4 und #8 nicht weitergeholfen haben, werde ich das gleich mal exemplarisch näher erläutern, basierend auf Deinem Code.

Vorab aber noch eine viel naheliegender Lösung, welche sicher funktionieren würde, aber primitiv ist.

Wenn es Dir gelungen ist, die Dateinamen in die Listbox zu bekommen und Du brauchst zu jedem Dateinamen nun den vollständigen Pfad, dann kannst Du natürlich die Informationen, an die Du jetzt programmtechnisch nicht herankommst, natürlich einfach aus Deinem vorhandenen Wissen ergänzen.
Du hast den Pfad des Ordners ja selber vorgegeben:"C:\" und daß die gesuchten Dateien alle mp3 die Endung ".mp3" haben, ist Dir ja auch klar:

string fullpath="C:\\" +filename+"\\.mp3"
oder
string fullpath=@"C:\" +filename+@"\.mp3"

Jetzt die bessere Lösung:

Als Struktur für die Lieder erstellst Du eine neu Klasse:

[src=csharp]
internal class Song
{
public string Title { get; set; }
public string Path { get; set; }
//public string Artist { get; set; }
//public string Album { get; set; }
//public string Year { get; set; }
//public string Genre { get; set; }
//public string Comment { get; set; }
}
[/src]

Durch die Eigenschaften Titel und Pfad kannst Du nun beide Informationen parallel betrachten.
Wir haben jetzt einen neuen Typ: "Song"

Jetzt erstellst Du eine Liste dieses Typs als globale Variabel Deiner Klasse Player
[src=csharp]
List<Song> _songList=new List<Song>();
string _path;
[/src]
und gleich eine Variabel vom Typ string, in der Du nachher die den Pfad der selektierten Datei speichern wirst.

Jetzt änderst Du Deinen Code, mit dem Du Deine Listbox gefüllt hast und änderst sie so, daß Du erst einmal diese ignorierst und stattdessen die Liste füllst. Diesmal nicht nur mit dem Dateinamen, sondern auch mit dem vollen Pfad der Datei:

[src=csharp]

string[] files = Directory.GetFiles(@"C:\mp3", "*.mp3");
foreach (string file in files)
{
Song song=new Song();
song.Title = Path.GetFileNameWithoutExtension(file);
song.Path = file;
_songList.Add(song);

}

listBox1.DataSource = _songList;
listBox1.DisplayMember = "Title";
listBox1.ValueMember = "Path";
[/src]

Wenn die Schleife durchlaufen ist, bindest Du nun einfach die Liste als Quelle an Deine Listbox, gibst den Titel als die Eigenschaft an, die in der Listbox angezeigt werden soll und den Pfad als die Eigenschaft, die die wichtige Information enthält.

Jetzt nimmst Du nicht einen doppelklick auf die Listbox als Ereignis, sondern Du reagierst auf das Ereignis, wenn sich der ausgewählte Song geändert hat.*

[src=csharp]
private void listBox1_SelectedValueChanged(object sender, EventArgs e)
{
_path = ((Song)listBox1.SelectedItem).Path;
}
[/src]

Klickst Du nun auf einen Musiktitel in Deiner Listbox, so hast Du anschließend den vollen Pfad dieses Liedes in _path gespeichert.




*Das ist hier jetzt unproblematisch, aber diesen Ereignis wird schon beim Füllen der Listbox ausgelößt, wenn das erste mal ein Song selektiert wird. Vorher war der Wert ja null.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #27
Ich bedanke mich zunächst für deine Mühen. Ob ich damit weiterkomme (und den Code verstehe, denn darauf kommt es an) müssen die nächsten Tage zeigen. Momentan habe ich mir was eingefangen, wollte das jetzt aber nicht tagelang so stehen lassen.

Gesunden Jahreswechsel
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Gute Besserung!

Für das Verstehen kann ich nicht garantieren, aber Copy und Paste wirst Du im Zweifelsfall ja hinbekommen.

Bevor ich Dir erkläre, wie das mit der Lautstärke und der Progressbar geht, sollten wir uns erst einmal ansehen, was Du da gemacht hast und warum das nicht funktioniert.

Im nächsten Jahr. ;)

Komm gut rüber!
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #29
So, da wäre ich wieder. War etwas länger krank, dann noch bissel abgeschlagen und dauermüde (vermutlich Sonnenmangel) und letzte Woche schlichtweg keine Lust. Am Player wird dieser Tage weitergearbeitet. Danke für den Code, den ich diese Woche noch ausprobieren werde. Mal sehen was bei rum kommt. Rückmeldung kommt.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #30
So, ich habe endlich eine Lösung gefunden. Als nächstes würde ich gerne die Fortschrittsanzeige angehen (progressBar1). Hier erstmal der aktuelle neue Code (Ja, er ist etwas anders geworden als erwartet, aber Hauptsache es funktioniert (und ich habe eine Lösung alleine gefunden)

[src=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;


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

string pfad = @"D:\SteamLibrary\steamapps\common\Stellaris\soundtrack\original_game_soundtrack\mp3";
string selectedTrack;
string selectedItem;

private void cmdPlay_Click(object sender, EventArgs e)
{
selectedItem = Path.GetFileName(listBox1.SelectedItem.ToString());
selectedTrack = pfad + "\\" + selectedItem;

if (File.Exists(selectedTrack))
{
axWindowsMediaPlayer1.URL = selectedTrack;

axWindowsMediaPlayer1.Ctlcontrols.play();
txtNowPlaying.Text = "Now playing: " + selectedItem;
}
else
{
MessageBox.Show("Datei nicht vorhanden");
}
}

private void Player_Load(object sender, EventArgs e)
{
groupBox1.Parent = pictureBox1;
groupBox1.BackColor = Color.Transparent;

groupBox2.Parent = pictureBox1;
groupBox2.BackColor = Color.Transparent;

groupBox3.Parent = pictureBox1;
groupBox3.BackColor = Color.Transparent;

groupBox4.Parent = pictureBox1;
groupBox4.BackColor = Color.Transparent;

listBox1.Items.AddRange((from x in Directory.GetFiles(pfad)
select new FileInfo(x).Name
).ToArray());
}

private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
selectedItem = Path.GetFileName(listBox1.SelectedItem.ToString());
selectedTrack = pfad + "\\" + selectedItem;

if (File.Exists(selectedTrack))
{
axWindowsMediaPlayer1.URL = selectedTrack;

axWindowsMediaPlayer1.Ctlcontrols.play();
txtNowPlaying.Text = "Now playing: " + selectedItem;
}
else
{
MessageBox.Show("Datei nicht vorhanden");
}
}

private void cmdStop_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
}
}
[/src]

Edit:

Ich bin schon relativ weit gekommen, aber bei der aktuellen Possition bekomme ich immer eine 0. Ich denke sonnst würde es funktionieren. Die Gesamtlänge habe ich:
[src=csharp] private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
int possition = (int)axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
int laenge = (int)axWindowsMediaPlayer1.currentMedia.duration;

progressBar1.Maximum = laenge;
progressBar1.Value = possition;

label1.Text = possition.ToString();
}[/src]

Edit 2: OK, ich bin ja der "Hauptsache es funktioniert"-Typ, aber ich frage mich gerade, ob ich nun gerade doch bissel arg schummel, oder ist das als Lösung durchaus OK?
[src=csharp] private void timer1_Tick(object sender, EventArgs e)
{
int possition = (int)axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
int laenge = (int)axWindowsMediaPlayer1.currentMedia.duration;

progressBar1.Maximum = laenge;
progressBar1.Value = possition;
}[/src]
 
Zuletzt bearbeitet:
Oben