Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Opendialog und for-Schleife (https://www.delphipraxis.net/71535-problem-mit-opendialog-und-schleife.html)

drschubi 16. Jun 2006 13:54


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:
 stream := TFileStream.Create(opendialog.filename[i], fmOpenRead or fmShareDenyWrite);
funktioniert nicht

Delphi-Quellcode:
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;
Kann mir jemand sagen wo ich "i" aus der forschleife übergeben sollte, damit es funktioniert?

Danke René

Gausi 16. Jun 2006 14:01

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?

Klaus01 16. Jun 2006 14:01

Re: Problem mit Opendialog und for-Schleife
 
Delphi-Quellcode:
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;
dann sollte es gehen.

Grüße
Klaus

[edit] zwei xxx ein Gedanke [/edit]

uligerhardt 16. Jun 2006 14:04

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?

Hawkeye219 16. Jun 2006 14:05

Re: Problem mit Opendialog und for-Schleife
 
Da Strings die Standard-Eigenschaft von TStringList ist, geht auch folgendes:

Delphi-Quellcode:
stream := TFileStream.Create(opendialog.Files[i], fmOpenRead or fmShareDenyWrite);
Die Schleife sollte übrigens nur bis zum Wert OpenDialog.Files.Count - 1 laufen.

Gruß Hawkeye

drschubi 16. Jun 2006 14:29

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é

uligerhardt 16. Jun 2006 15:06

Re: Problem mit Opendialog und for-Schleife
 
Zitat:

Zitat von drschubi
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.

Dann wäre es doch sinnvoller, einfach mal das Begin-/EndUpdate-Pärchen wegzulassen? :-)

drschubi 16. Jun 2006 15:20

Re: Problem mit Opendialog und for-Schleife
 
Stimmt sieht besser aus :)

Sharky 17. Jun 2006 05:45

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;

drschubi 17. Jun 2006 08:40

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 01:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz