Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mehrere Dateien vom Explorer per Drag & Drop in Listbox? (https://www.delphipraxis.net/31338-mehrere-dateien-vom-explorer-per-drag-drop-listbox.html)

Nicodius 7. Okt 2004 15:46


Mehrere Dateien vom Explorer per Drag & Drop in Listbox?
 
Wie kann ich mehrere Dateien per D&D vom desktop/explorer etc... in die Listbox bzw einen ordner reinziehen so dass nacher alle bmp und jpg dateien in die listbox kommen


vielen dank

Nicodius

toms 7. Okt 2004 15:48

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Hi,

Schau mal hier.

Nicodius 7. Okt 2004 15:49

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
den code hab ich für EINZELNE dateien verwendet oder?

API 7. Okt 2004 15:51

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Nein, auch für mehrere Dateien:

Delphi-Quellcode:
iFileCount := DragQueryFile(Msg.wParam, $FFFFFFFF, pcFileName, 255);
  for i := 0 to iFileCount - 1 do
  begin

Nicodius 7. Okt 2004 16:01

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
VIELEN VIELEN VIELEN DANK!!!


und wie mach ich das:


Ordner reinziehen - filtern und die dateipfade von allen Jpg, jpeg und Bmp files ins Listbox schreiben?

Nicodius 8. Okt 2004 21:46

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
dann kommt nur x(wiviele markiert worden sind) mal das was als ERSTES markiert worden ist


wenn ich 1.bmp, 2.jpg, 3.bmp markiere kommt 3 x 1.bmp mein quelltext :


Delphi-Quellcode:
procedure TForm1.WMDROPFILE(var msg: TMessage);
var
  hDrop : Cardinal ;
  fName : array[0..MAX_PATH] of Char ;
  iFileCount, i : Integer;
begin
   hDrop := Msg.WParam ;
   fName := '' ;
   DragQueryFile(hDrop, 0, fName, MAX_PATH);
   iFileCount := DragQueryFile(Msg.wParam, $FFFFFFFF, fname, 255);
  for i := 0 to iFileCount - 1 do
  begin
   If (ExtractFileExt(lowercase(String(fname))) = '.bmp') or (ExtractFileExt(lowercase(String(fname))) = '.jpg') or (ExtractFileExt(lowercase(String(fname))) = '.jpeg') then
     Listbox1.Items.add((String(fName)));
   end;
   DragFinish (hDrop);
end;

Luckie 9. Okt 2004 00:04

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Zieh den Ordner auf dein Listbox und im OnDrop Event rufst du die Funktion aus der Code-Lib zum Finden von Dateien auf und übergibst ihr den Ordner und zwar zweimal, einmal für die Bitmaps und einmal für die JPEGS.

SirThornberry 9. Okt 2004 07:15

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
@Nicodius: Dein Fehler ist das du FName nicht neu setzt in der Schleife sondern nur einmal vor der schleife.
Ich verwende folgenden Source in einer meiner Komponenten
Delphi-Quellcode:
type
  TNotifyDropFiles = procedure(Values: TStringlist) of Object;
[...]
FDropProc: TNotifyDropFiles;
[...]
procedure TVisualJBList.FWMDROPFILES (var Msg: TMessage);
var LCount, Lanzahl, Lsize: integer;
    LDateiname: PChar;
    LFileList: TStringlist;
begin
  If Assigned(FDropProc) then
  begin
    LFileList := TStringlist.Create;
    LDateiname := '';
    Lanzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, LDateiname, 255);
    for LCount := 0 to (Lanzahl - 1) do
    begin
      Lsize := DragQueryFile(Msg.WParam, LCount , nil, 0) + 1;
      LDateiname:= StrAlloc(Lsize);
      DragQueryFile(Msg.WParam,LCount , LDateiname, Lsize);
      LFileList.Add(string(LDateiname));
      StrDispose(LDateiname);
    end;
    LFileList.Free;
  end;
  DragFinish(Msg.WParam);
end;
in deinem Fall sollte folgendes reichen (ungetestet)
Delphi-Quellcode:
procedure TYourType.FWMDROPFILES(var Msg: TMessage);
var LCount, Lanzahl, Lsize: integer;
    LDateiname: PChar;
begin
  LDateiname := '';
  Lanzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, LDateiname, 255);
  for LCount := 0 to (Lanzahl - 1) do
  begin
    Lsize := DragQueryFile(Msg.WParam, LCount , nil, 0) + 1;
    LDateiname:= StrAlloc(Lsize);
    DragQueryFile(Msg.WParam,LCount , LDateiname, Lsize);
    // do Something with "LDateiname"
    StrDispose(LDateiname);
  end;
  FDropProc(LFileList);
  DragFinish(Msg.WParam);
end;

Nicodius 9. Okt 2004 08:48

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
danke ;) ich schau mal ;)


danke luckie!

Nicodius 9. Okt 2004 08:51

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
aber wie filtere ich jetzt daraus alle bmp und jpg/jpeg dateien?


SirThornberry: "[Fehler] Unit1.pas(204): Undefinierter Bezeichner: 'FDropProc'"

alcaeus 9. Okt 2004 08:53

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Hi Nico,

Delphi-Quellcode:
for LCount := 0 to (Lanzahl - 1) do
begin
  Lsize := DragQueryFile(Msg.WParam, LCount , nil, 0) + 1;
  LDateiname:= StrAlloc(Lsize);
  DragQueryFile(Msg.WParam,LCount , LDateiname, Lsize);
  // do Something with "LDateiname"
  StrDispose(LDateiname);
end;
Ich schätze mal, du könntest fie Dateiendung mit Delphi-Referenz durchsuchenExtractFileExt prüfen, und zwar genau da wo der Kommentar ist. Getestet habe ich den Code nicht, deshalb kann ich nicht garantieren, dass es auch funktioniert.

Greetz
alcaeus

Nicodius 9. Okt 2004 08:55

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
DANKE ES GEHT jetzt

@alcaeus danke, nicht gesehen dass das mit dem LDateiname in der Schleife war ;)



danke!


aber wie mach ich das noch mit dem ordner reinziehen und filtern.. Kommda nicht mit dem code zusammen


@luckie hast du vl den QT parat?



mfg

Nicodius

Luckie 9. Okt 2004 08:59

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Zitat:

Zitat von Nicodius
@luckie hast du vl den QT parat?

nein, habe so was noch nie gemacht. Aber steht doch alles in der Code-Lib und hier im Thread. Musst du nur noch zusammensetzten.

Nicodius 9. Okt 2004 09:06

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
guten morgen luckie,


ok danke werd schauen ob ichs schaffe sonst : :coder: ich wieder hier rein


danke ;)

Nicodius 9. Okt 2004 13:00

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
@Luckie --> wie mach ich das jetzt

Delphi-Quellcode:
procedure FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string =
  '*.*'; Recurse: Boolean = True);

--> hmm wenn ich jetzt zwei ordner reinziehe?

HILFE ;) :spin:

Luckie 9. Okt 2004 13:52

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Och manno, denk doch mal selber etwas nach.

Nicodius 9. Okt 2004 13:59

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
--> ich versteh nicht wie ich das in meinem code umsetze .... übrigens du bist um 15 jahre älter
du hast mehr erfahrung etc du kannst mich nicht mit dir vergleichen ;)

hmmm ... schnell mal nen spruch von nem Dp-User

Zitat:

die intelligenz folgte mir doch ich war schneller


ich weiß nicht wie ich das jetz tmachen soll ... mein code:




Delphi-Quellcode:
procedure FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string =
  '*.*'; Recurse: Boolean = True);

var
  SR: TSearchRec;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';
  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory = faDirectory then
            // --> ein Verzeichnis wurde gefunden
            //   der Verzeichnisname steht in SR.Name
            //   der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
            //       RootFolder + SR.Name
          if (SR.Name <> '.') and (SR.Name <> '..') then
            FindAllFiles(FileList, RootFolder + SR.Name, Mask, Recurse);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
  try
    repeat
      if SR.Attr and faDirectory <> faDirectory then
      begin
          // --> eine Datei wurde gefunden
          //   der Dateiname steht in SR.Name
          //   der vollständige Dateiname (inkl. Pfadangabe) ist
          //       RootFolder + SR.Name
        FileList.Add(RootFolder + SR.Name);
      end;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;

Delphi-Quellcode:
procedure TForm1.WMDROPFILE(var msg: TMessage);
var LCount, Lanzahl, Lsize: integer;
  LDateiname: PChar;
begin
  LDateiname := '';
  Lanzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, LDateiname, 255);
  for LCount := 0 to (Lanzahl - 1) do
  begin
    Lsize := DragQueryFile(Msg.WParam, LCount, nil, 0) + 1;
    LDateiname := StrAlloc(Lsize);
    DragQueryFile(Msg.WParam, LCount, LDateiname, Lsize);
    if (ExtractFileExt(lowercase(string(LDateiname))) = '.ico') or (ExtractFileExt(lowercase(string(LDateiname))) = '.bmp') or (ExtractFileExt(lowercase(string(LDateiname))) = '.jpg') or (ExtractFileExt(lowercase(string(LDateiname))) = '.jpeg') then
      Listbox1.Items.add((string(LDateiname)));
    StrDispose(LDateiname);
  end;
//  FDropProc(LFileList);
  DragFinish(Msg.WParam);
  {   If (ExtractFileExt(lowercase(String(fname))) = '.bmp') or (ExtractFileExt(lowercase(String(fname))) = '.jpg') or (ExtractFileExt(lowercase(String(fname))) = '.jpeg') then
     Listbox1.Items.add((String(fName)));}
end;

und was dann?

Luckie 9. Okt 2004 14:11

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Na da, wo du nach dem Ziehen deine Odner zur Verfügung hast, rufst du FindAllFiles eben auf und zwar so oft, wie du Ordner hast. Das hasst du doch schon alles mit den Dateien gemacht, nur dass du da eben Listbox1.Add() geschrieben hast. Ist es denn jetzt so schwer da FiindAllFiles hinzuschreiben?

Nicodius 9. Okt 2004 14:19

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
ja aber wie finde ich denn heraus wieviele ordner reingezogen werden?

Nicodius 9. Okt 2004 19:04

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
mein Quelltext


Delphi-Quellcode:
procedure FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string =
  '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';
  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory = faDirectory then
            // --> ein Verzeichnis wurde gefunden
            //   der Verzeichnisname steht in SR.Name
            //   der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
            //       RootFolder + SR.Name
          if (SR.Name <> '.') and (SR.Name <> '..') then
            FindAllFiles(FileList, RootFolder + SR.Name, Mask, Recurse);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
  try
    repeat
      if SR.Attr and faDirectory <> faDirectory then
      begin
       // --> eine Datei wurde gefunden
          //   der Dateiname steht in SR.Name
          //   der vollständige Dateiname (inkl. Pfadangabe) ist
          //   RootFolder + SR.Name
        FileList.Add(RootFolder + SR.Name);
      end;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;
Delphi-Quellcode:
procedure TForm1.WMDROPFILE(var msg: TMessage);
var LCount, Lanzahl, Lsize: integer;
  LDateiname: PChar;
begin
  LDateiname := '';
  Lanzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, LDateiname, 255);
  for LCount := 0 to (Lanzahl - 1) do
  begin
    Lsize := DragQueryFile(Msg.WParam, LCount, nil, 0) + 1;
    LDateiname := StrAlloc(Lsize);
    DragQueryFile(Msg.WParam, LCount, LDateiname, Lsize);
    If (ExtractFileExt(lowercase(String(Ldateiname))) = '.ico') or
       (ExtractFileExt(lowercase(String(Ldateiname))) = '.bmp') or
       (ExtractFileExt(lowercase(String(Ldateiname))) = '.jpg') or
       (ExtractFileExt(lowercase(String(Ldateiname))) = '.jpeg') then
    Listbox1.Items.add(String(Ldateiname));
// do Something with "LDateiname"
    StrDispose(LDateiname);
  end;
 // FDropProc(LFileList);
  DragFinish(Msg.WParam);
end;
und wo muss jetzt was rein? :cry: ich hasse meinen Stil ;)

Nicodius 10. Okt 2004 18:33

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
*push* nicht sauer sein luckie :P

mirage228 10. Okt 2004 18:47

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Hi,

ich hab dir mal eben was gebastelt:

Delphi-Quellcode:
  function IsDirectory(Dir: WideString): Boolean;
  var
    F: TWin32FindDataW;
    Handle: HWnd;
  begin
    Handle := FindFirstFileW(PWideChar(Dir), F);
    if Handle <> INVALID_HANDLE_VALUE then
    begin
      Result := ((f.dwFileAttributes and faDirectory) = faDirectory);
      Windows.FindClose(Handle);
    end else
    Result := False;
  end;

procedure FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string =
  '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';
  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory = faDirectory then
            // --> ein Verzeichnis wurde gefunden
            //   der Verzeichnisname steht in SR.Name
            //   der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
            //       RootFolder + SR.Name
          if (SR.Name <> '.') and (SR.Name <> '..') then
            FindAllFiles(FileList, RootFolder + SR.Name, Mask, Recurse);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
  try
    repeat
      if SR.Attr and faDirectory <> faDirectory then
      begin
       // --> eine Datei wurde gefunden
          //   der Dateiname steht in SR.Name
          //   der vollständige Dateiname (inkl. Pfadangabe) ist
          //   RootFolder + SR.Name
        FileList.Add(RootFolder + SR.Name);
      end;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;    
 
procedure TForm1.WMDROPFILE(var msg: TMessage);
var LCount, Lanzahl, Lsize: integer;
  LDateiname: PChar;
  List: TStringList;
  i: Integer;
begin
  LDateiname := '';
  Lanzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, LDateiname, 255);
  for LCount := 0 to (Lanzahl - 1) do
  begin
    Lsize := DragQueryFile(Msg.WParam, LCount, nil, 0) + 1;
    LDateiname := StrAlloc(Lsize);
    DragQueryFile(Msg.WParam, LCount, LDateiname, Lsize);
    List := TStringList.Create;
    try
      if IsDirectory(String(LDateiName)) then
        FindAllFiles(List, String(LDateiName)) else
      List.Add(String(LDateiName));
      for i := 0 to List.Count-1 do
        If (ExtractFileExt(AnsiLowerCase(List[i])) = '.ico') or
           (ExtractFileExt(AnsiLowerCase(List[i])) = '.bmp') or
           (ExtractFileExt(AnsiLowerCase(List[i])) = '.jpg') or
           (ExtractFileExt(AnsiLowerCase(List[i])) = '.jpeg') then
        Listbox1.Items.add(List[i]);
    finally
      List.Free;
    end;
// do Something with "LDateiname"
    StrDispose(LDateiname);
  end;
// FDropProc(LFileList);
  DragFinish(Msg.WParam);
end;
Ist ungetestet, sollte aber, so hoffe ich, funktionieren.

mfG
mirage228

Nicodius 10. Okt 2004 19:17

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Liste der Anhänge anzeigen (Anzahl: 1)
nee geht nid .... siehe anhang ;) das kommt nacher danke trotzdem

mirage228 10. Okt 2004 19:22

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Hi,

da warn kleiner Fehler:
Delphi-Quellcode:
Listbox1.Items.add(List[i]);
muss es heissen.

mfG
mirage228

Nicodius 10. Okt 2004 19:33

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
wohin damit?

mirage228 10. Okt 2004 19:36

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Zitat:

Zitat von Nicodius
wohin damit?

An die Schleife:
Delphi-Quellcode:
      for i := 0 to List.Count-1 do
        If (ExtractFileExt(AnsiLowerCase(List[i])) = '.ico') or
           (ExtractFileExt(AnsiLowerCase(List[i])) = '.bmp') or
           (ExtractFileExt(AnsiLowerCase(List[i])) = '.jpg') or
           (ExtractFileExt(AnsiLowerCase(List[i])) = '.jpeg') then
        Listbox1.Items.add(List[i]);
mfG
mirage228

Nicodius 10. Okt 2004 19:56

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
DAAAAAAAAAAAAAAAAAAAAAAAAAAAANNNNNNNNNNNKKKKKKKKKK KKKKEEEEEe




so viel geholfen DANKE mirage228!!! das macht ja gleich alle fragen aufeinmal dein CODE DANKEE! *umarm*

mirage228 10. Okt 2004 19:57

Re: Mehrere Dateien vom Explorer per Drag & Drop in List
 
Zitat:

Zitat von Nicodius
DAAAAAAAAAAAAAAAAAAAAAAAAAAAANNNNNNNNNNNKKKKKKKKKK KKKKEEEEEe




so viel geholfen DANKE mirage228!!! das macht ja gleich alle fragen aufeinmal dein CODE DANKEE! *umarm*

Bitte sehr :zwinker:

mfG
mirage228


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