Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi drag and drop filter funktioniert nicht (https://www.delphipraxis.net/84563-drag-drop-filter-funktioniert-nicht.html)

Marcasso 18. Jan 2007 15:30


drag and drop filter funktioniert nicht
 
hallo ich habe in die drag and drogp procedure etwas hinzugefügt, dass nur mp3 files zusallen soll,
leider funktioniert dies nicht /:

Delphi-Quellcode:
procedure TForm2.WMDROPFILES (var Msg: TMessage);
var i, j, anzahl, size: integer;
  Dateiname: PChar;
begin
  inherited;
  anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
      for i := 0 to (anzahl - 1) do
        begin
          size := DragQueryFile(Msg.WParam, i , nil, 0) + 1;
          Dateiname:= StrAlloc(size);
          if not(copy(Dateiname,0,length(Dateiname)-4) = '.mp3') then
            begin
              showmessage('nur mp3 files');
              exit;
            end
          else
            begin
              DragQueryFile(Msg.WParam,i , Dateiname, size);
              ListA.items.add(StrPas(Dateiname));
              StrDispose(Dateiname);
              DragFinish(Msg.WParam);
              ListB.Clear;
            for j := 0 to listA.Items.Count - 1 do
              ListB.Items.Add(inttostr(j+1)+'. '+extractfilename(lista.Items[j]));
            end;
      end;
end;

SirThornberry 18. Jan 2007 16:00

Re: drag and drop filter funktioniert nicht
 
die Parameter der Funktion copy stimmen nicht. Schau dir am besten mal in der Hilfe an welche Parameter erwartet werden. Zudem solltest du bedenken das es nicht nur die Endung ".mp3" sondern auch ".Mp3", ".MP3" etc. gibt.

Marcasso 18. Jan 2007 16:48

Re: drag and drop filter funktioniert nicht
 
danke für den tipp mit der schreibweise von mp3^^ hätte ich übersehen,
aber leider habe ich in der delphi hilfe nichts gefunden zu copy
aber habe in andreren threads geschaut und konnte jetzt meinen fehler nicht finden, was soll denn daran falsch sein?
lg

Blackheart 18. Jan 2007 16:54

Re: drag and drop filter funktioniert nicht
 
Schau Dir mal ExtractFileExt an damit sollte es einfacher gehn.

Marcasso 18. Jan 2007 17:30

Re: drag and drop filter funktioniert nicht
 
ich habe mit jetzt ExtractFileExt angeschaut

Delphi-Quellcode:
procedure TForm2.WMDROPFILES (var Msg: TMessage);
var i, j, anzahl, size: integer;
  Dateiname: PChar;
begin
  inherited;
  anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
      for i := 0 to (anzahl - 1) do
        begin
          size := DragQueryFile(Msg.WParam, i , nil, 0) + 1;
          Dateiname:= StrAlloc(size);
          if ExtractFileExt(StrPas(Dateiname)) = '.mp3' then
            begin
              DragQueryFile(Msg.WParam,i , Dateiname, size);
              ListA.items.add(StrPas(Dateiname));
              StrDispose(Dateiname);
              DragFinish(Msg.WParam);
              ListB.Clear;
            for j := 0 to listA.Items.Count - 1 do
              ListB.Items.Add(inttostr(j+1)+'. '+extractfilename(lista.Items[j]));
            end
          else
           begin
              showmessage('nur mp3 files');
              exit;
            end;
      end;
end;
leider funktioniert es wieder nicht,
mache wohl etwas falsch :-(

Christian Seehase 18. Jan 2007 17:40

Re: drag and drop filter funktioniert nicht
 
Moin Marcasso,

Zitat:

Zitat von Marcasso
danke für den tipp mit der schreibweise von mp3^^ hätte ich übersehen,

wieso hätte?
Die hast Du schon wieder nicht berücksichtigt ;-)

Wenn ich das richtig sehe, fabrizierst Du auch noch, je Dateiname der nicht als gültig anerkannt wird, auch noch ein Speicherloch, da Du StrDispose nur bei gültiger Datei aufrufst.

[EDIT]
Warum brichst Du eigentlich die Verarbeitung ab, wenn die Endung mal nicht .mp3 ist?
Lass' die Datei doch einfach aus, dann muss der Anwender sich nicht darum kümmern gezielt entsprechende Dateien zu markieren, was bei Standardinstallation von Windows (ausblenden von registrierten Dateiendungen) unter Umständen gar nicht so einfach ist.
[/EDIT]

[EDIT2]
Das DragFinish gehört auch nicht in die Schleife, denn sonst gibst Du bei der ersten gültigen Datei den vom System reservierten Speicher wieder frei.

So würde ich es machen (auch ohne die, inzwischen unüblichen StrAlloc, StrPas, StrDispose):

Delphi-Quellcode:
  anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
  try
    Dateiname := AllocMem(Size);
    try
      if LowerCase(ExtractFileExt(Dateiname)) = '.mp3' then begin
        DragQueryFile(Msg.WParam,i , Dateiname, size);
        ListA.items.add(Dateiname);
        ListB.Clear;
        for j := 0 to listA.Items.Count - 1 do
          ListB.Items.Add(inttostr(j+1)+'. '+extractfilename(lista.Items[j]));
      end;
    finally
      FreeMem(Dateiname,Size);
    end;
  finally
    DragFinish(Msg.WParam);
  end;
[/EDIT2]

DP-Maintenance 18. Jan 2007 17:55

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Multimedia" nach "Object-Pascal / Delphi-Language" verschoben.
Das eigentliche Problem ist eines mit der Sprache, als solcher

Marcasso 18. Jan 2007 18:40

Re: drag and drop filter funktioniert nicht
 
^wenn ich jetz egal welche files ziehe wird nichts der liste hinzugefügt /:

Delphi-Quellcode:
procedure TForm2.WMDROPFILES (var Msg: TMessage);
var i, j, anzahl, size: integer;
  Dateiname: PChar;
begin
  anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
    Dateiname := AllocMem(Size);
    try
      if LowerCase(ExtractFileExt(Dateiname)) = '.mp3' then begin
        DragQueryFile(Msg.WParam,i , Dateiname, size);
        ListA.items.add(Dateiname);
        ListB.Clear;
        for j := 0 to listA.Items.Count - 1 do
          ListB.Items.Add(inttostr(j+1)+'. ' + extractfilename(listA.Items[j]));
      end;
    finally
      FreeMem(Dateiname,Size);
    end;
  end;

xaromz 18. Jan 2007 18:50

Re: drag and drop filter funktioniert nicht
 
Hallo,

Du verwendest ja auch DragQueryFile falsch. Ich habe mal den korrekten Quellcode kommentiert:
Delphi-Quellcode:
procedure TForm2.WMDROPFILES (var Msg: TMessage);
var
  i, anzahl, size: integer;
  Dateiname: PChar;
begin
  ListA.Clear;
  // Anzahl der Dateien ermitteln
  anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, nil, 255);
  // Alle Dateien durchlaufen
  for i := 0 to Anzahl - 1 do
  begin
    // Länge des aktuellen Dateinamens ermitteln
    Size := DragQueryFile(Msg.WParam, i, nil, 0) + 1;
    // Speicher allokieren
    Dateiname := StrAlloc(Size);
    try
      // Aktuellen Dateinamen ermitteln
      DragQueryFileMsg.WParam, i, Dateiname, Size);

      // Wenn MP3 -> in Liste einfügen
      if LowerCase(ExtractFileExt(Dateiname)) = '.mp3' then
        ListA.items.add(Dateiname);
    finally
      // Speicher wieder freigeben
      StrDispose(FileName);
    end;
  end;

  // Dateien in andere Liste übertragen
  ListB.Clear;
  for i := 0 to listA.Items.Count - 1 do
    ListB.Items.Add(inttostr(i + 1)+'. ' + extractfilename(listA.Items[i]));
  end;
Gruß
xaromz

Marcasso 18. Jan 2007 19:09

Re: drag and drop filter funktioniert nicht
 
hey vielen vielen dank (:
den rest werde ich wohl mahcen können, danke :-)


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