29. november 1999 - 00:42Der er
14 kommentarer og 1 løsning
Drag and drop files
Jeg ved hvordan man modtager filer der er trækket fra windows (explorer) til et program, men hvordan gør man det modsatter? (trække en fil fra programmet til explorer)
"filen" kan være fra en listbox, så vidt jeg ved er de filer man trække jo bare filenavnene med fuld sti
type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES; { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
uses ShellApi;
procedure TForm1.FormCreate(Sender: TObject); begin {Let Windows know we accept dropped files} DragAcceptFiles(Form1.Handle, True); end;
procedure TForm1.WMDROPFILES(var Message: TWMDROPFILES); var NumFiles : longint; i : longint; buffer : array[0..255] of char; begin {How many files are being dropped} NumFiles := DragQueryFile(Message.Drop, -1, nil, 0); {Accept the dropped files} for i := 0 to (NumFiles - 1) do begin DragQueryFile(Message.Drop, i, @buffer, sizeof(buffer)); Form1.Memo1.Lines.Add(buffer); end; end;
Eftersom du ikke kan skifte på stifinderens aktive dir, mens du trækker filnavnet fra dit program, må du altså have positioneret stifinderen i det bibliotek hvor du vil have filen placeret.
Derfor er det principielt blot et spørgsmål om at læse den fil dit filnavn "peger" på og så skrive den til default disk/dir i ondrop eventen.
Dog kan det tænkes at dit program har default disk/dir sat til startdir for dit program og derfor ikke anderkender et skift i stifinderen, men det mener jeg faktisk at det gør. Det gør den ihvertfald hvis du har fileopen/filesave dialoger i dit program og du ikke specifikt sætter initialdir for hver af dem.
Jeg har lige testet mit svar og må beklage at det ikke virker som jeg forventede. Get CurrentDir vil altid give den pågældende process (dit program) aktuelle dir.
Så det må blive noget med at finde handle til explorer winduet, få process info for den handle og derefter bruge denne process currentdir. Denne kan så bruges til at skrive filen (eller flytte den med movefileex.
Det må da være muligt.. Er der ingen der ved hvordan?
Hvis i har ACDC (billedeviewer), kan i måske bedre se hvad jeg mener. Her kan man trække filer fra ACDC til et explorer vindue, og den anden vej. (på samme måde som mellem to explorer vinduer)
Nej det er ikke fordi jeg var træt af at vente, det virker fint :-)
Og det er ikke kun \"filer\" at man kan drag\'e og droppe.. også billedere og andre ting!
Synes godt om
Ny brugerNybegynder
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.