Listbox i ExtractFileName

0

Witam :)
Mam taki oto drobny ale jakże wnerwiający problem z extractfilename
otóż zrobiłem sobie drag and drop do listboxa działa świetnie bez extractfilename, ale bez tego to mam zawaloną playliste ścieżką pliku a to zbyt ładnie na małym odtwarzacze nie wygląda, chciałem wiec dać extractfilename ale jest problem, otóż nazwa została zmieniona i nie ma już ściezki pliku w list boxie ale pliku nie mogę odtworzyć. Po dłuższych testach okazało się ze mogę ten plik odtworzyć ale muszę najpierw załadować plik normalnie przez opendialog potem go odtworzyć i już mogę tamten plik z drag and drop odtworzyć... dziwne co ? :D

Oto kod do drag and drop:

procedure Tform1.WMDROPFILES(var msg: TWMDropFiles) ;
const
MAXFILENAME = 255;
var
cnt, fileCount: integer;
fileName : array [0..MAXFILENAME] of char;
begin
fileCount := DragQueryFile(msg.Drop, $FFFFFFFF, fileName, MAXFILENAME) ;

for cnt := 0 to -1 + fileCount do
begin
DragQueryFile(msg.Drop, cnt, fileName, MAXFILENAME) ;
listbox1.Items.Add(extractfilename(filename));
end;
DragFinish(msg.Drop) ;
end;

Przycisk do opendialog:

var
i : integer;

begin
OpenDialog1.Title := 'Wybierz Utwór';
if OpenDialog1.Execute = true then
begin
for i := 0 to OpenDialog1.Files.Count-1 do listbox1.Items.Add(ExtractFilename(OpenDialog1.Files.Strings[i]));
end;
form3.listbox1.Items:=listbox1.Items;
end;

przycisk play:

begin
Bass_StreamFree(Plik);
Plik := Bass_StreamCreateFile(FALSE, pChar(listbox1.Items.Strings[PlayList]), 0, 0, 0);
Bass_ChannelPlay(Plik, False);
Label1.caption := ListBox1.Items.Strings[PlayList];
Label3.caption := ExtractFilename(label1.Caption);
RunLabel1.CaptionRun := Label3.Caption;
Miernik := Bass_ChannelBytes2Seconds(Plik, Bass_StreamGetLength(Plik));
advTrackBar1.Max := trunc(Miernik);

Wiecie może jak to naprawić. Byłbym niezmiernie wdzięczny gdyby ktoś mi pomógł z tym :|

1

Pewnie OpenDialog zmienia aktualną ścieżkę i dlatego.

Do ListBox wpisuj pełną ścieżkę do pliku ale rysuj samodzielnie tylko nazwę
Ustaw ListBox.Style na lbOwnerDrawFixed
Oprogramuj zdarzenie OnDrawItem, w którym będziesz samodzielnie rysował po Canvasie ListBoxa

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with ListBox1,Canvas do
  begin
    FillRect(Rect);
    DrawText(Handle,PChar(ExtractFileName(Items[index])),-1,Rect,0);
  end;
end;

0

Zastąp ListView na VirtualStringTree i ponad polowa róznych problemów znika bez śladu.

0

Przechowuj sobie nazwę pliku wraz ze ścieżką np. tak:

type
  TMyData = class
  private
    fFileName: string;
  public
    property FileName: string read fFileName write fFileName;
  end;

Dodajesz Item:

var
  MyData: TMyData;
begin
  MyData:= TMyData.Create;
  MyData.FileName:= EctractFilePath(Application.ExeName) + '1.mp3'; //taka sciezka dla przykladu
  ListBox1.AddItem(ExtractFileName(MyData.FileName), MyData);
end;

a tak pobierasz:

var
  MyData: TMyData;
begin
  if ListBox1.ItemIndex > -1 then
  begin
    MyData:= TMyData(ListBox1.Items.Objects[ListBox1.ItemIndex]);
    ShowMessage(MyData.FileName);
  end;
end;
0

Dokładnie takie samo rozwiązanie jak @kAzek bym zaproponował. Po to obiekty typu List, poza stringami pozwalają przechowywac obiekty, aby sobie ułatwiać życie i pozwalają zrobić więcej.

0

O nie wiedziałem że aż tak szybko dostane odpowiedz :) cieszy mnie to :D już się biorę do testowania...dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1