![]() |
Inhalt der Listenbox in einer Schleife fassen???
Hi leutz ich arbeite grad an einer art musikbox mit meiner mp3sammlung....
ich nutze da für mehrer listboxen ect z.b. Listbox 1: inhalt des mp3ordner (namen des interpreten) listbox 3: inhalt vom ordner des interpreten (halt seine alben) listbox 2: gibt den inhalt de ralben wieder (man klickt auf ein file und es wird abgespielt) momentan hab ich über 5000 programmzeilen fast nur in der listbox2 vielleicht weiß jemand wie ich den inhalt dieser procedur in eine schleife fassen kann... hab mal eben nur die procedur und dann noch das konplette projeckt mit kleinen einschrenkungen angehängt. (Aktuells FILE WEITER UNTEN) |
Re: Inhalt der Listenbox in einer Schleife fassen???
hallo zusammen
habe mir mal dein programm angeschaut!
Delphi-Quellcode:
sobald du auf eine reihe in deiner listbox klickst wird dir in meinem beispiel
procedure TForm1.ListBox1Click(Sender: TObject);
var i: integer; begin i := listbox1.ItemIndex; edit1.Text := listbox1.Items.Strings[i]; end; das was in dieser zeile steht in einem edit-feld angezeigt! meinst du nicht das du dies dann so umsetzen kannst und nicht mehr auf deine if abfragen, in diesem umfang, angewiesen bist! Ich denke das der vorteil ist, das du direkt weißt was ausgewählt wurde! |
Re: Inhalt der Listenbox in einer Schleife fassen???
Genauso kannst du tack1 bis track25 in folgendes zusammenfassen:
Delphi-Quellcode:
Aufgerufen wird das dann mit:
var
track : array[1..25] Of String; x : integer;
Delphi-Quellcode:
oder besser eben:
track[1] := 'mp3/cds_und_alben/01/01/01.mp3';
track[2] := 'mp3/cds_und_alben/01/01/02.mp3'; // usw.
Delphi-Quellcode:
Ps: Die 01/01/ kannst du ebenfalls auf diese Weise über listbox1.ItemIndex+1 bzw. listbox3.ItemIndex+1 automatisch einfügen.
for x := 1 to 25 do
track[x] := 'mp3/cds_und_alben/' + '01' + '/' + '01' + '/' + Format('%0:2.2d', [x]) + '.mp3'; |
Re: Inhalt der Listenbox in einer Schleife fassen???
thx.. werd das ganze mal genauer betrachten bin halt noch nen kleiner anfänger....
|
Re: Inhalt der Listenbox in einer Schleife fassen???
Ich würde Pfade nie nicht relativ angeben, sondern immer absolut. Es brauch sich nur mal das aktuelle Verzeichnis ändern und das war es dann gewesen.
Btw. Hab eich jetzt keine Lust 8202 Zeilen durch zu kucken. Hinzukommt, dass ich nochnicht mal verstehe, wie das ganze überhaupt funktionieren soll. Versuch das mal in zusammengöhrige Units aufzuteilen. Das Abspielen würde ich zum Beispiel auslagern und so programmieren, dass es vom Formular unabhängig ist. |
Re: Inhalt der Listenbox in einer Schleife fassen???
Zitat:
wenn ich die pfade die zu meinem programm gehören relativ dazu angebe dann habe ich doch den vorteil das ich das programm und die ordner hinpacken kann wo ich möchte und die pfade trotzdem stimmen! :gruebel: |
Re: Inhalt der Listenbox in einer Schleife fassen???
Stimmen schon, aber ändere mal bei einer Verknüpfung das Arbeitsverzeichnis oder benutze im Programm einen OpenDialog. Relative Pfade sind immer realtiv zum aktiellen Verzeichnis. Wird das im Laufe der Anwendung anders gestzt, war es das gewesen.
Besser:
Delphi-Quellcode:
Dann kannst du deine Anwendung auch hinpacken wohin du willst und der Pfad ist absolut.
dir := ExtractFilepath(ParamStr(0))+'\'+'mp3';
|
Re: Inhalt der Listenbox in einer Schleife fassen???
das ganze sll später halt auf eine CD mit den daten, da kann man den pfad dann eh nicht mehr ändern (eigentlich)
das ganze findet sich noch in aufbau, das momentan alles über ein Form geht liegt da ran, das ich erst mal möchte das alles so läuft dann nach kann man alles noch design und verfeinern ;) |
Re: Inhalt der Listenbox in einer Schleife fassen???
Das ist egal. Das aktuelle Verzeichnis hat nichts mit dem Verzeichnis auf dem Datenträger zu tun. das aktuelle Verzeichnis "merkt" sich Windows intern für dein Programm. Öffne mal mit Notpad eine Datei, die nicht im angezeigten Verzeichnis liegt. Dann mache das noch mal und du wirst festellen, dass dir das zu letzt geöffnete Verzeicnis angezeigt wird, das aktuelle eben. Wird jetzt aus irgendeinem Grund das aktuelle Verzeichnis deiner anwendung geändert, stimmen die relativen Pfade in deiner Anwendung nicht mehr, da sie relativ zum aktuellen Verzeichnis sind.
|
Re: Inhalt der Listenbox in einer Schleife fassen???
Übrigens:
Falls du vor hast deine MP3-Datenbank zu erweiteren oder mehrere CDs zu erstellen, dann würde ich dir eine andere vorgehensweise empfehlen. Anstatt feste Ordner anhand von Zahlen zu generieren, kannst du Delphi auch dazu bringen, den Ordner "mp3" nach tatsächlich vorhandenen Ordnern zu durchsuchen. Das geht z.B. mit FindFirst() und FindNext(), dazu findest du in der Online-Hilfe und in der DP über die Suche Informationen: ![]() |
Re: Inhalt der Listenbox in einer Schleife fassen???
Hi leutz erst mal danke für die ganze hilfe ;)
thx an @scp, auf den trick mit array wehre ich gar net gekommen, kürtz die programmzeilen auf die hilfe... den 2. post, das mit dem Firstfind schaue ich mir mal genauer an.. mal schauen ob ich drauß schlauß werde.... hast vielleicht nen tut oder nen tipp wo ich was gutes hier finde...nutze grad die suche thx an @Luckie, das mit dem pfad kapier ich jetzt, wird dann auch noch überarbeitet |
Re: Inhalt der Listenbox in einer Schleife fassen???
Da ich auf die schnelle kein zusammenhängendes Beispiel finden konnte, hab ich mal eins gebastelt:
Delphi-Quellcode:
var
SRec: TSearchRec; StlDirs: TStrings; StlFiles: TStrings; begin StlDirs := TStringList.Create; StlFiles := TStringList.Create; try If FindFirst(ExtractFilePath(ParamStr(0)) + 'MP3\' + '*.*', faAnyFile, SRec) = 0 then begin repeat If ((SRec.Attr and faDirectory) <> 0) and // Bedingung, um nur (SRec.Name <> '..') and (SRec.Name <> '.') then // Ordner zu finden StlDirs.Add(SRec.Name) else If not ((SRec.Attr and faDirectory) <> 0) then // Bedingung, um nur Dateien zu finden StlFiles.Add(SRec.Name); until FindNext(SRec) <> 0; FindClose(SRec); end; ListBox1.Items.AddStrings(StlDirs); ListBox2.Items.AddStrings(StlFiles); finally StlDirs.Free; StlFiles.Free; end; end; |
Re: Inhalt der Listenbox in einer Schleife fassen???
Liste der Anhänge anzeigen (Anzahl: 1)
thy das gleich kommentiert hat... dat muss erst mal wieder verdauen ;)
-------------------------------------- hm... so gans raff ich dat noch net @scp, hab mal eben meine laaange prcoedur gekürtz und vielleicht kannst du mir ja verraten wie ich genau dein beispiel einbinde...
Code:
diese .. heißt das da gekürtzt wurde und das ganze geht so weit das es am ende heißt ListBox1.Selceted[10] also 10 mal 5mal und 25mal (hoffe man versteht was ich meine, jedenfalls viele viele programmzeilen)
procedure TForm1.ListBox2Click(Sender: TObject);
var track : array [1..25] of String; x : Integer; begin if RadioButton1.Checked then begin if ListBox1.Selected[0] then begin if ListBox3.Selected[0] then begin for x := 1 to 25 do track[x] := 'mp3/cds_und_alben/' + '01' + '/' + '01' + '/' + Format('%0:2.2d', [x]) + '.mp3'; if Listbox2.Selected[0] then begin MediaPlayer1.FileName := track[1]; MediaPlayer1.Open; Trackbar1.Position := 0; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; . . if Listbox2.Selected[24] then begin MediaPlayer1.FileName := track[25]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; end; if ListBox3.Selected[1] then begin for x := 1 to 25 do track[x] := 'mp3/cds_und_alben/' + '01' + '/' + '02' + '/' + Format('%0:2.2d', [x]) + '.mp3'; if Listbox2.Selected[0] then begin MediaPlayer1.FileName := track[1]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; . . end; if Listbox2.Selected[24] then begin MediaPlayer1.FileName := track[25]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; end; if ListBox3.Selected[2] then begin for x := 1 to 25 do track[x] := 'mp3/cds_und_alben/' + '01' + '/' + '03' + '/' + Format('%0:2.2d', [x]) + '.mp3'; if Listbox2.Selected[0] then begin MediaPlayer1.FileName := track[1]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; . . if Listbox2.Selected[24] then begin MediaPlayer1.FileName := track[25]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; end; if ListBox3.Selected[3] then begin for x := 1 to 25 do track[x] := 'mp3/cds_und_alben/' + '01' + '/' + '04' + '/' + Format('%0:2.2d', [x]) + '.mp3'; if Listbox2.Selected[0] then begin MediaPlayer1.FileName := track[1]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; . . if Listbox2.Selected[24] then begin MediaPlayer1.FileName := track[25]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; end; if ListBox3.Selected[4] then begin for x := 1 to 25 do track[x] := 'mp3/cds_und_alben/' + '01' + '/' + '05' + '/' + Format('%0:2.2d', [x]) + '.mp3'; if Listbox2.Selected[0] then begin MediaPlayer1.FileName := track[1]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; . . end; if Listbox2.Selected[24] then begin MediaPlayer1.FileName := track[25]; MediaPlayer1.Open; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; end; end; end; end; PS: hier projektdatei nun im neuen gewand (mit array) und sorry den immer och langen code ;) |
Re: Inhalt der Listenbox in einer Schleife fassen???
Wie gesagt du kannst die anderen beiden Zahlen auch automatisch einfügen.
Hier mal die kurze Variante, ohne FindFirst() / FindNext:
Delphi-Quellcode:
Jezt vielleicht mal eine kurze Erklärung:
procedure TForm1.ListBox2Click(Sender: TObject);
var track : array [1..25] of String; x : Integer; begin if RadioButton1.Checked then begin If (ListBox1.ItemIndex > -1) and // Prüft, ob überhaupt etwas in den (ListBox3.ItemIndex > -1) then // Listboxen ausgewählt wurde for x := 1 to 25 do track[x] := 'mp3' + '/' + 'cds_und_alben' + '/' + Format('%0:2.2d',[ListBox1.ItemIndex+1]) + '/' + Format('%0:2.2d',[ListBox3.ItemIndex+1]) + '/' + Format('%0:2.2d', [x]) + '.mp3'; if (ListBox1.ItemIndex > -1) and (ListBox3.ItemIndex > -1) and (Listbox2.ItemIndex > -1) then begin // Hier wird auch noch die Song-Listbox geprüft MediaPlayer1.FileName := ExtractFilePath(ParamStr(0)) + // Den Pfad der Exe nicht vergessen track[Listbox2.ItemIndex+1]; MediaPlayer1.Open; Trackbar1.Position := 0; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; end; end; end; 1. Format, sorgt dafür, wie der Name schon sagt, das z.B. eine Zahl auf eine bestimmte Art und Weise als Text umgewandelt, ausgegeben und formatiert wird. Mit dem '%0:2.2d' gibt man an, das es eine Ganzzahl (d) ist, die immer mindestens zwei Stellen (2.2) hat, die %0 steht für die Zahl, man kann in den Eckklammern auch mehrere Zahlen angeben, die dann mit %1, %2 usw. geziehlt formatiert werden können, oder alle zusammen nur mit %, mehr dazu steht ja in der Delphi-Hilfe. 2. ListboxX.ItemIndex steht für den Eintrag, den der Benutzer ausgewählt hat, wobei die Zählung bei 0 beginnt, also muss ich ein +1 anhängen, weil deine Ordner ja mit 1 anfangen. 3. Ist ListboxX.ItemIndex -1 dann hat der Benutzer gar keinen Eintrag ausgewählt und wir brauchen erst gar nicht mit der Verarbeitung anfangen. |
Re: Inhalt der Listenbox in einer Schleife fassen???
klasse ich danke dir... habs sogar geschnallt nun hat das ganze projekt statt 8058 zeilen nur noch 369 *freu*
weiter oben ist nun das aktuelle file... vielleicht weiß jemand iwe man was noch kürtzer fassen könnte (z.b. weiter oben das auslesen der ini und einfügen in die listboxen) vielleicht kann mir ja auch noch hier bei gehlfen werden: ![]() |
Re: Inhalt der Listenbox in einer Schleife fassen???
du könntest tatsächlich das auslesen vereinfachen!
ich habe es mal so gemacht:
Delphi-Quellcode:
du mußt i natürlich deklarieren!
for i := 0 to 9 do
begin if ListBox1.Selected[i] then begin if i < 10 then ListBox3.Items.LoadFromFile(dir + '/cds_und_alben/0' + inttostr(i+1) + '/inhalt.ini') else ListBox3.Items.LoadFromFile(dir + '/cds_und_alben/' + inttostr(i+1) + '/inhalt.ini'); end; end; bei mir hat es funktioniert! |
Re: Inhalt der Listenbox in einer Schleife fassen???
Funktioniert alles ähnlich:
Delphi-Quellcode:
PS: Wenn du schon eine TRadioGroup auf deinem Formular hast, brauchst du nicht extra noch TRadioButtons draufzusetzten. Auch dort kannst du eine "inhalt.ini" per
procedure TForm1.ListBox1Click(Sender: TObject);
var inhaltini : string; begin if RadioButton1.Checked then begin If (ListBox1.ItemIndex > -1) then begin inhaltini := dir + 'mp3' + '/' + 'cds_und_alben' + '/' + Format('%0:2.2d',[ListBox1.ItemIndex+1]) + '/' + 'inhalt.ini'; If FileExists(inhaltini) then ListBox3.Items.LoadFromFile(inhaltini) else ListBox3.Items.Clear; end; end; end; procedure TForm1.ListBox3Click(Sender: TObject); var tracksini : String; begin if RadioButton1.Checked then begin If (ListBox1.ItemIndex > -1) and (ListBox3.ItemIndex > -1) then begin tracksini := dir + + 'mp3' + '/' + 'cds_und_alben' + '/' + Format('%0:2.2d',[ListBox1.ItemIndex+1]) + '/' + Format('%0:2.2d',[ListBox3.ItemIndex+1]) + '/' + 'tracks.ini'; If FileExists(tracksini) then ListBox2.Items.LoadFromFile(tracksini) else ListBox2.Items.Clear; end; end; end;
Delphi-Quellcode:
auslesen und entsprechend per RadioGroup1.ItemIndex ermitteln, welche Kategorie ausgewählt wurde.
RadioGroup1.Items.LoadFromFile(dir + 'mp3/' + 'inhalt.ini')
|
Re: Inhalt der Listenbox in einer Schleife fassen???
hab alles so weit angepasst außer das mit radio.... aktuelle exe auf seite eins... muss nun noch ein paar probs mit der lautstärke und der timeranzeige hinbekommen *g*
|
Re: Inhalt der Listenbox in einer Schleife fassen???
hi hab nun folgendes prob, möchte das wenn das lied zuende ist er automatisch das nächste abspielt... sollte die liste keine weiteren einträge haben soll das erste spiel wieder abgespielt werden...
hier ist ein kleiner ansatz, das der fehlerhaft ist weiß ich, denn ich spiel da mit leider nur den aktuellen track ab.... benutze die procedure mit arry ect wie auf eine seite da vor...
Code:
// If ProgressBar1.Position = ProgressBar1.Max then begin
// MediaPLayer1.FileName := track[ListBox2.ItemIndex+1+1]; // MediaPlayer1.Play; // end; |
Re: Inhalt der Listenbox in einer Schleife fassen???
hab nu nhier gesucht und viele beispiele getestet leider spielt das prog statt den nächten song immer nur das was grad eben lief.. hier mal ein beispielcode:
Delphi-Quellcode:
und hier der code, der die list füllt:
If ProgressBar1.Position = ProgressBar1.Max then begin
MediaPLayer1.FileName := ListBox2.Items[ListBox2.ItemIndex+1]; MediaPlayer1.Play; end;
Delphi-Quellcode:
track ist ein arry (steht in der vordere seite genauer ;)
if RadioButton1.Checked then begin
if (ListBox1.ItemIndex > -1) and // Prüft, ob überhapt etwas in den (ListBox3.ItemIndex > -1) then // Listeboxen ausgewählt ist for x := 1 to 25 do track[x] := dir+'\' +'cds_und_alben' + '\' + Format('%0:2.2d',[ListBox1.ItemIndex+1]) + '\' + Format('%0:2.2d',[ListBox3.ItemIndex+1]) + '\' + Format('%0:2.2d', [x]) + '.mp3'; if (ListBox1.ItemIndex > -1) and (ListBox3.ItemIndex > -1) and (ListBox2.ItemIndex > -1) then begin // Hier wird auch noch die MediaPLayer1.FileName := track[ListBox2.ItemIndex+1]; //Song-Listbox if ListBox2.Items.Count=0 then exit; mp3File := Concat(MediaPlayer1.FileName); if not FileExists(mp3File) then begin ShowMessage('MP3 file '+#13#10+'__'+ mp3File +'__'+#13#10+'does not exist!'); exit; end; GetID3TagInformation(mp3File, edTitle, edArtist, edAlbum, edYear, edGenre, edComment); Form3.Edit1.Text := MediaPlayer1.FileName; Edit1.Text := MediaPlayer1.FileName; MediaPlayer1.Open; SetMPVolume(MediaPlayer1, ScrollBar1.Position); //geprüft Trackbar1.Position :=0; Trackbar1.Max := MediaPlayer1.TrackLength[1]; ProgressBar1.Max := MediaPlayer1.TrackLength[1]; MediaPlayer1.Play; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz