![]() |
Problem mit Opendialog und for-Schleife
Hallo
ich füge mit untenstehender Prozedur mittels Opendialog Dateien sowie Informationen zu einem Treeview dazu. Es wird aber stets nur die letzte Datei im Treeview angezeigt und dass soft wie der Opendialog.files.count einen Wert hat. Zb. 12 mal der gleiche Titel hintereinander in der Treeview. Ich schaff es einfach nicht, daß er mir jede Datei nacheinander hinzufügt.
Delphi-Quellcode:
funktioniert nicht
stream := TFileStream.Create(opendialog.filename[i], fmOpenRead or fmShareDenyWrite);
Delphi-Quellcode:
Kann mir jemand sagen wo ich "i" aus der forschleife übergeben sollte, damit es funktioniert?
procedure TMainForm.fill_playlist;
var stream: TFilestream; l: TListItem; begin if opendialog.Execute then for i := 0 to opendialog.Files.Count do with ListView1 do begin l := ListView1.Items.Add; Items.BeginUpdate; Application.ProcessMessages; stream := TFileStream.Create(opendialog.filename, fmOpenRead or fmShareDenyWrite); if not Id3v2Tag.exists then stream.Seek(0, sobeginning) else stream.Seek(Id3v2Tag.size, soFromBeginning); MpegInfo.LoadFromStream(Stream); Id3v1Tag.ReadFromStream(stream); l.Caption := Id3v1Tag.Artist; l.Subitems.Add(Id3v1Tag.Title); l.Subitems.Add(Id3v1Tag.Album); l.Subitems.Add(Id3v1Tag.year); l.Subitems.AddStrings(opendialog.Files); Items.EndUpdate; end; stream.free; end; Danke René |
Re: Problem mit Opendialog und for-Schleife
Die Eigenschaft Files hast du doch schon gefunden. Laut OH ist das eine Stringlist, in der die einzelnen Dateinamen der markierten Dateien drinstehen. Also sollte doch files[i] anstelle von filename gehen, oder?
|
Re: Problem mit Opendialog und for-Schleife
Delphi-Quellcode:
dann sollte es gehen.
procedure TMainForm.fill_playlist;
var stream: TFilestream; l: TListItem; begin if opendialog.Execute then for i := 0 to opendialog.Files.Count do with ListView1 do begin l := ListView1.Items.Add; Items.BeginUpdate; Application.ProcessMessages; stream := TFileStream.Create(opendialog.files.strings[i], fmOpenRead or fmShareDenyWrite); // <- strings[i] if not Id3v2Tag.exists then stream.Seek(0, sobeginning) else stream.Seek(Id3v2Tag.size, soFromBeginning); MpegInfo.LoadFromStream(Stream); Id3v1Tag.ReadFromStream(stream); l.Caption := Id3v1Tag.Artist; l.Subitems.Add(Id3v1Tag.Title); l.Subitems.Add(Id3v1Tag.Album); l.Subitems.Add(Id3v1Tag.year); l.Subitems.AddStrings(opendialog.Files); Items.EndUpdate; end; stream.free; end; Grüße Klaus [edit] zwei xxx ein Gedanke [/edit] |
Re: Problem mit Opendialog und for-Schleife
Und mach doch das Application.ProcessMessages weg, das stört bestenfalls. Oder hat es hier einen tieferen Sinn?
|
Re: Problem mit Opendialog und for-Schleife
Da Strings die Standard-Eigenschaft von TStringList ist, geht auch folgendes:
Delphi-Quellcode:
Die Schleife sollte übrigens nur bis zum Wert OpenDialog.Files.Count - 1 laufen.
stream := TFileStream.Create(opendialog.Files[i], fmOpenRead or fmShareDenyWrite);
Gruß Hawkeye |
Re: Problem mit Opendialog und for-Schleife
Hallo @ all,
danke schön, da war ich doch schon nah dran :oops: Das Application.ProcessMessages habe ich drin, damit die Einträge nicht erst nach dem Durchlaufen der Schleife angezeigt werden, bei mehreren hundert Dateien kann das ja ne Weile dauern. Viele Grüße René |
Re: Problem mit Opendialog und for-Schleife
Zitat:
|
Re: Problem mit Opendialog und for-Schleife
Stimmt sieht besser aus :)
|
Re: Problem mit Opendialog und for-Schleife
Hai drschubi,
zwei Dinge sind mir an deinem Code noch aufgefallen. Zum einen: Was passiert wenn der Opendialg abgrebrochen wird? Es wird stream.free aufgerufen obwohl es keine Instanz von TFileStream gibt. Ausserdem erzeugst Du für jeden Durchlauf der For-Do-Schleife eine neue Instanz von TFileStream gibst aber nur die zuletzt erzeugte wieder frei. Du hast also massig Speicherleaks erzeugt.
Delphi-Quellcode:
procedure TMainForm.fill_playlist;
var stream: TFilestream; l: TListItem; begin if opendialog.Execute then begin for i := 0 to Pred(opendialog.Files.Count) do begin with ListView1 do begin l := Items.Add; stream := TFileStream.Create(opendialog.files.strings[i], fmOpenRead or fmShareDenyWrite); try if not Id3v2Tag.exists then stream.Seek(0, sobeginning) else stream.Seek(Id3v2Tag.size, soFromBeginning); MpegInfo.LoadFromStream(Stream); Id3v1Tag.ReadFromStream(stream); finally stream.Free; end; l.Caption := Id3v1Tag.Artist; l.Subitems.Add(Id3v1Tag.Title); l.Subitems.Add(Id3v1Tag.Album); l.Subitems.Add(Id3v1Tag.year); l.Subitems.AddStrings(opendialog.Files); end; end; end; end; |
Re: Problem mit Opendialog und for-Schleife
Hallo Sharky,
ich muss ehrlich gestehhen, daß mir das gar nicht aufgefallen ist. Aber du hast vollkommen recht, das wird Probleme geben. Werde es sofort ändern und den restlichen Code auch optimieren. Einen schönen Gruß René |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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