AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem mit Opendialog und for-Schleife
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Opendialog und for-Schleife

Ein Thema von drschubi · begonnen am 16. Jun 2006 · letzter Beitrag vom 17. Jun 2006
Antwort Antwort
drschubi

Registriert seit: 18. Dez 2003
94 Beiträge
 
#1

Problem mit Opendialog und for-Schleife

  Alt 16. Jun 2006, 14:54
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.
 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é
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit Opendialog und for-Schleife

  Alt 16. Jun 2006, 15:01
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?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Problem mit Opendialog und for-Schleife

  Alt 16. Jun 2006, 15:01
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]
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Problem mit Opendialog und for-Schleife

  Alt 16. Jun 2006, 15:04
Und mach doch das Application.ProcessMessages weg, das stört bestenfalls. Oder hat es hier einen tieferen Sinn?
Uli Gerhardt
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Problem mit Opendialog und for-Schleife

  Alt 16. Jun 2006, 15:05
Da Strings die Standard-Eigenschaft von TStringList ist, geht auch folgendes:

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
drschubi

Registriert seit: 18. Dez 2003
94 Beiträge
 
#6

Re: Problem mit Opendialog und for-Schleife

  Alt 16. Jun 2006, 15:29
Hallo @ all,

danke schön, da war ich doch schon nah dran

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é
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Problem mit Opendialog und for-Schleife

  Alt 16. Jun 2006, 16:06
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?
Uli Gerhardt
  Mit Zitat antworten Zitat
drschubi

Registriert seit: 18. Dez 2003
94 Beiträge
 
#8

Re: Problem mit Opendialog und for-Schleife

  Alt 16. Jun 2006, 16:20
Stimmt sieht besser aus
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Problem mit Opendialog und for-Schleife

  Alt 17. Jun 2006, 06:45
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;
Stephan B.
  Mit Zitat antworten Zitat
drschubi

Registriert seit: 18. Dez 2003
94 Beiträge
 
#10

Re: Problem mit Opendialog und for-Schleife

  Alt 17. Jun 2006, 09:40
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é
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 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