Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Listbox mit Lieder füllen funktioniert nicht (https://www.delphipraxis.net/160508-listbox-mit-lieder-fuellen-funktioniert-nicht.html)

Metallicwar 16. Mai 2011 20:46

Listbox mit Lieder füllen funktioniert nicht
 
Hallo, ich bin gerade dabei einen MP3 Player zu programmieren.
Ich wähle in einem BrowseDialog einen Musikordner aus:
Delphi-Quellcode:
procedure TForm1.btnOpenFolderClick(Sender: TObject);
var mp3Folder : string;
begin
 mp3Folder := BrowseDialog('Wähle einen Ordner mit Liedern aus:', BIF_RETURNONLYFSDIRS);
 if mp3Folder = '' then Exit;

 txtFolder.Caption := mp3Folder;

 MP3ListeFuellen(mp3Folder, mp3List.Items);
end;
zum Schluss wird die function MP3ListeFuellen aufgerufen...
Delphi-Quellcode:
procedure MP3ListeFuellen(Folder: string; sl: TStrings);
var
  Rec : TSearchRec;
  mp3List: TListBox;
begin
 sl.Clear;
 if SysUtils.FindFirst(Folder + '*.mp3', faAnyFile, Rec) = 0 then
  try
    repeat
      sl.Add(Rec.Name);
    until SysUtils.FindNext(Rec) <> 0;
  finally
    SysUtils.FindClose(Rec);
  end;
end;
er durchläuft die Schleife, füllt mir aber nicht die ListBox ..
Kann mir bitte jemand helfen?

Luckie 16. Mai 2011 21:03

AW: Listbox mit Lieder füllen funktioniert nicht
 
Findet er denn Dateien?

Metallicwar 16. Mai 2011 21:09

AW: Listbox mit Lieder füllen funktioniert nicht
 
Hi Luckie,
ja im "Rec.Name" wird der Mp3 Name gespeichert ....
und geht alle Mp3 durch, die in dem Ordner sind.
bin schon eine ganze Weile dabei, eine Lösung zu finden ....

rollstuhlfahrer 16. Mai 2011 21:21

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von Metallicwar (Beitrag 1101232)
er durchläuft die Schleife, füllt mir aber nicht die ListBox ..
Kann mir bitte jemand helfen?

Das stimmt schon von der Logik her nicht. Entweder er durchläuft die Schleife und befüllt die Box oder er durchläuft die Schleife nicht.

Dann solltest du mal schauen, ob in deiner Ordner-Variablen der Pfad mit abschließendem '\' steht. Und in deinem Code fehlt noch ein FindClose.

Bernhard

PS: Das
Delphi-Quellcode:
SysUtils.
brauchst du eigentlich gar nicht, da ja Windows meist die erste Uses ist und SysUtils danach eingebunden wird und somit die Aufrufe aus der Windows-Unit überschreibt.

FrankJ28 17. Mai 2011 07:38

AW: Listbox mit Lieder füllen funktioniert nicht
 
Hallo,
dein Übergabeparameter sl ist nur "oneway" und liefert nicht zurück. Mach einmal ein var davor, dann sollte es klappen (var sl : TStrings)
Ciao
Frank

DeddyH 17. Mai 2011 07:39

AW: Listbox mit Lieder füllen funktioniert nicht
 
Nein, var ist nicht nötig, da es sich bei Objektinstanzen um Pointer handelt.

FrankJ28 17. Mai 2011 07:45

AW: Listbox mit Lieder füllen funktioniert nicht
 
Hallo Detlef,
mmmh, procedure MP3ListeFuellen ist für mich erst einmal nur eine Prozedur.
Ciao
Frank

DeddyH 17. Mai 2011 07:46

AW: Listbox mit Lieder füllen funktioniert nicht
 
Das hat aber nichts damit zu tun, dass Objektinstanzen als Argumente automatisch by Reference übergeben werden.

ConnorMcLeod 17. Mai 2011 07:48

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von Metallicwar (Beitrag 1101232)
Delphi-Quellcode:
procedure MP3ListeFuellen(Folder: string; sl: TStrings);
var
  Rec : TSearchRec;
  mp3List: TListBox;
begin
 sl.Clear;
 if SysUtils.FindFirst(Folder + '*.mp3', faAnyFile, Rec) = 0 then
  try
    repeat
      sl.Add(Rec.Name);
    until SysUtils.FindNext(Rec) <> 0;
  finally
    SysUtils.FindClose(Rec);
  end;
end;
er durchläuft die Schleife, füllt mir aber nicht die ListBox

Ahem. Du machst ja gar nix mit der ListBox, ausserdem ist die lokal definiert, ausserdem wird sie nicht erzeugt - so wird da nie was draus.

Wenn in den TStrings was drin steht, dann ausserhalb der Prozedur einer BESTEHENDEN TListBox zuweisen mit ListBox.Items.Assign();

DeddyH 17. Mai 2011 07:52

AW: Listbox mit Lieder füllen funktioniert nicht
 
Die Variable ist lediglich überflüssig, zugegriffen wird ja auf den Parameter.

ConnorMcLeod 17. Mai 2011 07:55

AW: Listbox mit Lieder füllen funktioniert nicht
 
Wo sieht man das? Die einzeige ListBox, deren Füllen lt. Subject nicht funktioniert ist lokal in der Prozedur.

Coffeecoder 17. Mai 2011 07:58

AW: Listbox mit Lieder füllen funktioniert nicht
 
Kann es sein, dass er kein Element in der Listbox findet?
Siehe
Delphi-Quellcode:
sl.Clear;
Oder seh ich da was falsch?

FrankJ28 17. Mai 2011 08:02

AW: Listbox mit Lieder füllen funktioniert nicht
 
Ich gehe davon aus, das die mp3list visuell auf dem Form liegt und über die Prozedur

Delphi-Quellcode:
 MP3ListeFuellen(mp3Folder, mp3List.Items);

zum Füllen übergeben wird. In der Prozedur MP3ListeFuellen steht noch eine nicht benutzte Definition.
Ciao
Frank

DeddyH 17. Mai 2011 08:04

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von FrankJ28 (Beitrag 1101282)
Ich gehe davon aus, das die mp3list visuell auf dem Form liegt und über die Prozedur

Delphi-Quellcode:
 MP3ListeFuellen(mp3Folder, mp3List.Items);

zum Füllen übergeben wird. In der Prozedur MP3ListeFuellen steht noch eine nicht benutzte Definition.

Exakt.

ConnorMcLeod 17. Mai 2011 08:06

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von FrankJ28 (Beitrag 1101282)
Ich gehe davon aus,

Stimmt schon, dass das logisch wäre, aber es steht nirgends. Also ...

himitsu 17. Mai 2011 08:22

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von Metallicwar (Beitrag 1101232)
er durchläuft die Schleife,

Und das hast du durch Debuggen rausbekommen?

Was passiert denn nun bei Folgendem?
Delphi-Quellcode:
if SysUtils.FindFirst(Folder + '/*.mp3', faAnyFile, Rec) = 0 then

DeddyH 17. Mai 2011 08:24

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1101285)
Zitat:

Zitat von FrankJ28 (Beitrag 1101282)
Ich gehe davon aus,

Stimmt schon, dass das logisch wäre, aber es steht nirgends. Also ...

Es steht im Ausgangspost.

[edit] Wie ist es denn so?
Delphi-Quellcode:
procedure MP3ListeFuellen(Folder: string; sl: TStrings);
var
  Rec : TSearchRec;
//  mp3List: TListBox;
begin
  Assert(Assigned(sl));
  sl.BeginUpdate;
  try
    Folder := IncludeTrailingPathDelimiter(Folder);
    sl.Clear;
    if SysUtils.FindFirst(Folder + '*.mp3', faAnyFile, Rec) = 0 then
      try
        repeat
          sl.Add(Rec.Name);
        until SysUtils.FindNext(Rec) <> 0;
      finally
        SysUtils.FindClose(Rec);
      end;
  finally
    sl.EndUpdate;
  end;
end;
[/edit]

Metallicwar 17. Mai 2011 09:00

AW: Listbox mit Lieder füllen funktioniert nicht
 
Hi, danke für die Rückmeldungen.
Bin auf Arbeit, werde mich heute Abend von zu Hause aus melden.

FrankJ28 17. Mai 2011 09:00

AW: Listbox mit Lieder füllen funktioniert nicht
 
Hallo,
bei mir funktioniert auch der OriginalCode..

@Detlef: Hattest Recht mit var, pointer ;-)
Ciao
Frank

DeddyH 17. Mai 2011 09:07

AW: Listbox mit Lieder füllen funktioniert nicht
 
Der Originalcode funktioniert aber nur, wenn man das Verzeichnis auch mit einem Backslash abschließt. Übergibt man als sl-Parameter nil, dann knallt es.

FrankJ28 17. Mai 2011 10:03

AW: Listbox mit Lieder füllen funktioniert nicht
 
schon klar, "bullshit in = bullshit out", ohne Backslash halt leere Liste ;-)

DeddyH 17. Mai 2011 10:20

AW: Listbox mit Lieder füllen funktioniert nicht
 
Siehste, deshalb stell ich sicher, dass das Dingen mit Backslash abschließt. Man muss ja immer mit dem Schlimmsten rechnen, am Ende gar mit Usern :lol:

Luckie 17. Mai 2011 10:25

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1101315)
Man muss ja immer mit dem Schlimmsten rechnen, am Ende gar mit Usern :lol:

Die versuche ich eigentlich immer auszuschließen. Aber irgendwie setzt die mein Chef mit Kunden gleich. Keine Ahnung, wie der auf dieses abgefahrene Konzept kommt.

DeddyH 17. Mai 2011 10:52

AW: Listbox mit Lieder füllen funktioniert nicht
 
Achja, was mir gerade einfällt: eine Listbox kann man auch prima per API (LB_DIR) mit Dateinamen befüllen.

FrankJ28 17. Mai 2011 10:54

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1101315)
am Ende gar mit Usern :lol:

Wenn man die User an die manuelle, ungeprüfte Eingabe lässt, muss man natürlich später dafür Sorge tragen :lol:

Metallicwar 17. Mai 2011 18:47

AW: Listbox mit Lieder füllen funktioniert nicht
 
Also ich möchte gerne bei dieser Methode bleiben, nicht über API.

hab den geposteten Code von DeddyH ausprobiert und zusätzlich noch im FindFirst das Backslash eingebaut, Liste wird aber nach wie vor nicht gefüllt.
Delphi-Quellcode:
procedure MP3ListeFuellen(Folder: string; sl: TStrings);
var
  Rec : TSearchRec;
begin
  Assert(Assigned(sl));
  sl.BeginUpdate;
  try
    Folder := IncludeTrailingPathDelimiter(Folder);
    sl.Clear;
    if FindFirst(Folder + '/*.mp3', faAnyFile, Rec) = 0 then
      try
        repeat
          sl.Add(Rec.Name);
        until FindNext(Rec) <> 0;
      finally
        FindClose(Rec);
      end;
  finally
    sl.EndUpdate;
  end;
end;
Zitat:

FrankJ28:
Hallo,
bei mir funktioniert auch der OriginalCode..
hmn versteh ich nicht ...

FrankJ28 17. Mai 2011 18:51

AW: Listbox mit Lieder füllen funktioniert nicht
 
Hallo,
nun hast Du ja 2 \. Eines manuell in deinem FindFirst und das 2. über IncludeTrailingPathDelimiter.
Entscheide dich für eines. Empfehlung: entferne es aus dem FindFirst.
Ciao
Frank

Metallicwar 17. Mai 2011 18:59

AW: Listbox mit Lieder füllen funktioniert nicht
 
aahhh, danke !
hab mal einen anderen Musikordner genommen und es funktioniert .. jetzte müsste ich noch herausfinden wieso es bei manchen Ordnern funktioniert, bei manchen jedoch nicht ...

FrankJ28 17. Mai 2011 19:24

AW: Listbox mit Lieder füllen funktioniert nicht
 
Hallo,
bemühe doch einmal den Debugger und steppe durch die Routine. Ich tippe einmal auf deine Folder-Variable.
Ciao
Frank

rollstuhlfahrer 17. Mai 2011 22:06

AW: Listbox mit Lieder füllen funktioniert nicht
 
Zitat:

Zitat von Metallicwar (Beitrag 1101414)
aahhh, danke !
hab mal einen anderen Musikordner genommen und es funktioniert .. jetzte müsste ich noch herausfinden wieso es bei manchen Ordnern funktioniert, bei manchen jedoch nicht ...

Ich würde mal eiskalt darauf tippen, dass in diesem Musik-Ordner einfach keine MP3s waren. :twisted::twisted:

Nein, echt. Ich benutze exakt diesen Code, wenn ich Verzeichnisse auflisten will.

Bernhard

Aphton 17. Mai 2011 23:35

AW: Listbox mit Lieder füllen funktioniert nicht
 
Diese Frage habe ich mir öfters gestellt und es ließe sich auch leicht beantworten, indem ich ein paar Tests durchführe, aber ich habe im Moment keine Lust darauf, deshalb frage ich mal -
Was ist eigentlich, wenn man per Ansi Befehle Unicode Elemente (FindFirstFileA/FindFirstFileW) findet? Werden die ignoriert oder nur anders dargestellt?

Sir Rufo 18. Mai 2011 01:19

AW: Listbox mit Lieder füllen funktioniert nicht
 
Die Unicode-Zeichen (die wo nicht nach ANSI gewandelt werden können) werden als ? dargestellt

himitsu 18. Mai 2011 06:18

AW: Listbox mit Lieder füllen funktioniert nicht
 
Dann wird der 8.3-Kurzname verwendet/aufgelistet,
aber nur wenn auch die Ansi-API genutzt wird ... sonst muß man sich selber den Kurznamen aus dem SerarchResult raussuchen, sonst hat man durch die Unicode-Ansi-Umwandlung ein paar Fragezeichen im Namen. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 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