Entwickler-Ecke

Sonstiges (Delphi) - Listbox , Object auslesen


exoduscrises - So 01.05.05 18:40
Titel: Listbox , Object auslesen
Hallo zusammen,
ich nutze jetzt folgende Prozedur um eine Datei in die Listbox zu setzen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
 type 
  TEntry = class(TObject) // Typ 
    fPath: string// Dateipfad 
end

{...} 

var 
PLitem:TEntry; 
begin 
{...} 
PLitem:=TEntry.Create(); 
PLitem.fPath:=OpenDialog1.FileName; 
ListBox1.AddObject(CutPathName(OpenDialog1.FileName), PLitem); 
end;



und dachte mir ich kann jetzt im Nachhinein den Pfad also PLitem wieder aufrufen undzwar so


Delphi-Quelltext
1:
2:
3:
4:
5:
 
i := ListBox1.ItemIndex; 
{...} 
Pfad:=listbox1.items.objects[iplay]; 
{...}




geht aber leider nicht, kann mir vielleicht jemand weiterhelfen?


hansa - So 01.05.05 19:00

Wieso benutzt Du einen schlichten Filename als Objekt ? :shock:


exoduscrises - So 01.05.05 19:10

Es ging im Prinzip darum, mit einer Listbox eine Playlist für einen Mediaplayer zu machen. Das hat auch alles ganz gut geklappt so weit. Nun wollte ich aber, dass nicht immer der ganze Pfad in der Playlist steht sondern nur der Dateiname, da ich aber zum Dateinamen den Pfad brauche, damit es abgespielt werden kann, wollte ich ihn als Objekt mit anhängen.


Keldorn - So 01.05.05 19:12

user profile iconhansa hat folgendes geschrieben:
Wieso benutzt Du einen schlichten Filename als Objekt ? :shock:

so wie ich das sehe, möchte er nur den Dateinamen (ohne Pfad) in der Listboxanzeige haben.
//edit: zu langsam ;)

was du brauchst, ist ein ein Typecast

Delphi-Quelltext
1:
Pfad:=TEntry(listbox1.items.objects[iplay]).fpath;                    


obwohl, man kann das auch etwas verfeinernen. Das Fpath finde ich unglücklich, da die variablen mit F immer die privaten sind. Außerdem könntest du dir einen eigenen constructor schreiben, wo du beim create gleich den Pfad übergibst.
Cutpathname scheint was eigenes zu sein, brauchst du nicht. gugg dir in der OH exctractfilepath/dir an.
Und ich hoffe, du hast auch an das free geadcht, die Objects werden nicht automatisch freigegeben.

Mfg Frank


exoduscrises - So 01.05.05 19:19

Ok , danke erstmal so weit, ich probiers nochmal

Edit: Funktioniert so genau wie ich es mir vorstelle, vielen Dank nochmal :)


hansa - So 01.05.05 19:30

Wieso kommt immer so Kleinkram ? :mrgreen:

Habe mal eben einen Mediaplayer gebaut :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  if FindFirst(lblEdit1.Text+'\*.MP3', faAnyFile, sr) = 0 then begin
    repeat
      ListBox1.Items.Add (sr.Name);
    until FindNext(sr) <> 0;
    FindClose(sr);
    ListBox1.ItemIndex := 0;
  end;


Zur Erläuterung : lblEdit1 ist ein TLabeledEdit und da soll der Pfad rein. Der dient dazu, ihn auch zu speichern, aber das ist jetzt egal. sr ist ein TSearchRec. Abspielen geht so :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
  MediaPlayer1.FileName := lblEdit1.Text + '\'+ ListBox1.Items [ListBox1.itemindex];
  Memo2.Lines.Add (MediaPlayer1.Filename+' wird gespielt !'); // zur Anzeige
  MediaPlayer1.Open;
  MediaPlayer1.Play;
end;


exoduscrises - So 01.05.05 19:57

Eine Frage ist dann doch noch offen

wie kann ich jetzt alle Pfade mit Hilfe von

Delphi-Quelltext
1:
Pfad:=TEntry(listbox1.items.objects[i]).fpath;                    

in einer Datei speichern?


Tino - Mo 02.05.05 08:09

In dem du alle Einträge der Listbox durchgehst und jeweils den Path liest und in die Datei speicherst. Wo liegt genau das Problem?


exoduscrises - Mo 02.05.05 13:04

Naja ich hatte mir das in etwa so vorgestellt, aber das geht nicht :oops:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 procedure TForm1.ImgBtn15Click(Sender: TObject);
  var
  TempList: TStrings;
  lbindex, lbcount:integer;
  begin
   if SaveDialog1.Execute then
    begin
     if Listbox1.ItemIndex >= 0 then
       begin
        lbcount:=Listbox1.Items.Count;         //Anzahl der Listboxeinträge
        TempList := TStringList.Create;        //Stringlist erstellen
        for Listbox1.ItemIndex='0' to Listbox1.ItemIndex=lbcount // Alle Objekte aus der Listbox in die Stringlist laden
         do
          begin
           StringList1.AddStrings(TEntry(listbox1.itemindex).fpath); 
          end;
       end;
     StringList1.savetofile(SaveDialog1.FileName); // Stringliste speichern
    end;
  end;


exoduscrises - Di 03.05.05 14:28

so ging es dann


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
 procedure TForm1.ImgBtn15Click(Sender: TObject);
  var
   sl: TStringList;
    s: string;
    e: TEntry;
  begin
   if SaveDialog1.Execute then
   begin
   sl := TStringList.Create;
   for i := 0 to Listbox1.Items.Count - 1 do begin
    e := TEntry(ListBox1.Items.Objects[i]);
    sl.Add(e.fpath);
   end;
   sl.SaveToFile(SaveDialog1.FileName);
   sl.Free;
  end;
  end;


Christian S. - Di 03.05.05 15:32

Hallo!

Du solltest mit einem Speicherschutzblock arbeiten, der sicherstellt, dass die Stringliste auch beim Auftreten einer Exception freiegegeben wird:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.ImgBtn15Click(Sender: TObject);
var
  sl: TStringList;
  s: string;
  e: TEntry;
begin
  if SaveDialog1.Execute then
  begin
    sl := TStringList.Create;
    try
      for i := 0 to Listbox1.Items.Count - 1 do
      begin
        e := TEntry(ListBox1.Items.Objects[i]);
        sl.Add(e.fpath);
      end;
      sl.SaveToFile(SaveDialog1.FileName);
    finally
      sl.Free;
    end;
  end;
end;


Außerdem habe ich den Quelltext mal anständig formatiert ;-)