Avatar billede smith1 Nybegynder
12. oktober 2004 - 20:41 Der er 2 kommentarer og
1 løsning

drag filer over i min listbox

det her virker rigtig godt, men hvordan kan jeg få den til at virke med mapper?? jeg kan ikke drag en mappe med filer over i min listbox! den tilføjer bare stien til mappen og ikke filerne


unit dropfile;

interface

uses
  Windows, Messages, SysUtils, Classes,
  Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    // declare our DROPFILES message handler
    procedure AcceptFiles( var msg : TMessage );
      message WM_DROPFILES;
  end;

var
  Form1: TForm1;

implementation

uses
  ShellAPI;

{$R *.DFM}

procedure TForm1.AcceptFiles( var msg : TMessage );
const
  cnMaxFileNameLen = 255;
var
  i,
  nCount    : integer;
  acFileName : array [0..cnMaxFileNameLen] of char;
begin
  // find out how many files we're accepting
  nCount := DragQueryFile( msg.WParam,
                          $FFFFFFFF,
                          acFileName,
                          cnMaxFileNameLen );

  // query Windows one at a time for the file name
  for i := 0 to nCount-1 do
  begin
    DragQueryFile( msg.WParam, i,
                  acFileName, cnMaxFileNameLen );
   
listbox1.items.add(acFileName);
  end;
  DragFinish( msg.WParam );
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles( Handle, True );
end;

end.
Avatar billede kammeyer Nybegynder
13. oktober 2004 - 14:15 #1
Før din listbox1.items.add(acFileName) bør du selv tjekke om det er en mappe eller en fil - hvis det er en fil gør du som du plejer (listbox1.items.add) og hvis det er en mappe må du læse filerne i mappen og placere dem i listen enkeltvis.
Avatar billede kammeyer Nybegynder
13. oktober 2004 - 16:53 #2
Evt. sådan her:

procedure TForm1.AcceptFiles( var msg : TMessage );
const
  cnMaxFileNameLen = 255;
var
  i,
  nCount    : integer;
  acFileName : array [0..cnMaxFileNameLen] of char;
  attr: word;
  Rec: TSearchRec;
  FileAttrs: Integer;
  Str: string;
begin
  // find out how many files we're accepting
  nCount := DragQueryFile( msg.WParam,
                          $FFFFFFFF,
                          acFileName,
                          cnMaxFileNameLen );

  // query Windows one at a time for the file name
  for i := 0 to nCount-1 do
    begin
      DragQueryFile( msg.WParam, i,acFileName, cnMaxFileNameLen );
      attr := FileGetAttr(acFileName);
      if (attr and faDirectory = faDirectory)    then
        begin
          // Go through all files in folder
          showmessage('It''s a folder');
          FileAttrs := faArchive;
          if FindFirst(acFileName + string('\*.*'), FileAttrs, Rec) = 0 then
            repeat
              str := acFilename + string('\');
              listbox1.Items.Add(acFileName + string('\') + Rec.FindData.cFileName);
            until FindNext(rec) <> 0;
          FindClose(Rec);

        end
      else
        listbox1.items.add(acFileName);
    end;
  DragFinish( msg.WParam );
end;

men den tager ikke højde for mapper i mapper - men her er noget du kan køre videre med.
Avatar billede smith1 Nybegynder
13. oktober 2004 - 19:36 #3
og point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester