Avatar billede eht Nybegynder
07. januar 2012 - 21:28 Der er 5 kommentarer og
1 løsning

Drop filer på form Delphi XE2

Med denne kode kan jeg droppe en eller flere filer på en form, hvis jeg compiler med Delphi 2006.
Hvis jeg benytter Delphi XE2 virker det ikke.
Er der nogen der har en forklaring og en løsning?

Mvh. Erik

unit unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Menus, ExtCtrls,
  ShellAPI;

  type
  TFileCatcher = class(TObject)
  private
    fDropHandle: HDROP;
    function GetFile(Idx: Integer): string;
    function GetFileCount: Integer;
    function GetPoint: TPoint;
  public
    constructor Create(DropHandle: HDROP);
    destructor Destroy; override;
    property FileCount: Integer read GetFileCount;
    property Files[Idx: Integer]: string read GetFile;
    property DropPoint: TPoint read GetPoint;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private


    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

constructor TFileCatcher.Create(DropHandle: HDROP);
begin
  inherited Create;
  fDropHandle := DropHandle;
end;

destructor TFileCatcher.Destroy;
begin
  DragFinish(fDropHandle);
  inherited;
end;

function TFileCatcher.GetFile(Idx: Integer): string;
var
  FileNameLength: Integer;
begin
  FileNameLength := DragQueryFile(fDropHandle, Idx, nil, 0);
  SetLength(Result, FileNameLength);
  DragQueryFile(fDropHandle, Idx, PChar(Result), FileNameLength + 1);
end;

function TFileCatcher.GetFileCount: Integer;
begin
  Result := DragQueryFile(fDropHandle, $FFFFFFFF, nil, 0);
end;

function TFileCatcher.GetPoint: TPoint;
begin
  DragQueryPoint(fDropHandle, Result);
end;



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

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DragAcceptFiles(Self.Handle, False);
end;

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
  // Handle WM_DROPFILES message
var
  I: Integer;                // loops thru all dropped files
  DropPoint: TPoint;          // point where files dropped
  Catcher: TFileCatcher;      // file catcher class
begin
  inherited;
  // Create file catcher object to hide all messy details
  Catcher := TFileCatcher.Create(Msg.Drop);
  try

    for I := 0 to Pred(Catcher.FileCount) do
    showmessage(Catcher.Files[I]);
    // Get drop point
    DropPoint := Catcher.DropPoint;
  finally
    Catcher.Free;
  end;
  // Notify Windows we handled message
  Msg.Result := 0;
end;




end.
Avatar billede a_nor Nybegynder
08. januar 2012 - 08:25 #1
Hej Erik, kan desværre ikke hjælpe
din kode virker fint både i Delphi 7 og 2010.

Kan du - ellers - anbefale at gå til XE2 ?

mvh
Anders
Avatar billede eht Nybegynder
08. januar 2012 - 12:05 #2
Så fandt jeg ud af det ved lidt læsning på nettet.

Jeg havde sat min delphi til at starte med administratorrettigheder.
Det får den betydning, at f.eks. WMDropFiles ikke fungerer, når programmet afvikles fra delphi.
Det fungerer dog fint, når programmet startet direkte fra exe-filen.

Grunden til at jeg havde sat Delphi til at starte med adminrettigheder er at jeg ellers ikke kunne compilere et af mine store programmer. Det er lidt underligt, så det skal jeg så også have fundet ud af.
Programmet er begyndt at kræve at blive startet som administrator, dog kun når det afvikles fra min PC og ikke på en anden??????
Avatar billede eht Nybegynder
08. januar 2012 - 12:22 #3
Hej Anders.

Det er ikke så længe siden jeg købte XE2, og har måtte bruge lidt tid på at få et af mine store programmer flyttet over fra Delphi 2006. Det skyldes til dels at jeg har benyttet et par 3party-components, som ikke understøttede XE2.

Grunden til at jeg skiftede, er bla. at der nu er mulighed for at skrive programmer til Windows, Mac og Ipad/IPhone med det nye Firemonkey IDE, som følger med.
Det kan gøres mere eller mindre ud fra den samme Delphi/Pascal-kode.
Det ser rigtig spændende ud. Det er også rigtig nemt at scalere sit program til forskellige størrelse skærme med Firemonkey.

Selve Delphi XE2 ligner meget sig selv. Jeg har dog ikke helt styr på hvad der ellers er kommet til, men har da opdaget et par smarte funktioner.
Bare en ting som at properties i Objektinspektor nu står i alfabetisk orden, hvor det i 2006 hvor jeg kom fra stod i logisk i grupper, men alligevel gjorde det temmlig uoverskueligt. Det var jeg rigtig træt af.

Der er desuden understøttelse af diverse grafiske formater, som jeg har brug for, uden brug af ekstern kode og komponenter.

mvh.
Erik
Avatar billede martinlind Nybegynder
11. januar 2012 - 20:01 #4
Hej Erik... lyder ellers fedt med den delphi - hvilket windows kører du på Win 7 eller ???
Avatar billede eht Nybegynder
11. januar 2012 - 22:17 #5
Hej Martin

Jeg kører Win7 64bit.
Mht. Firemonkey og programmering til MacOS go iOs er man dog nødt til at have en Mac der køre et program XCode, som compilerer programmet.
Man skal forbinde Mac op PC f.eks. via LAN og have en delt mappe.
Man skal fra starten vælge om det skal være til Windows/Mac OSx eller iOS til iPad/iPhone.

Man programmerer som normalt i Delphi og kan selvfølgelig compilere til en exe på PC'en, man kan så sende coden til Mac'en, hvor det bliver compileret til Mac mm.

Man kan vist godt sætte sin PC op så den kører MacOS virtuelt, eller omvendt.

Der er forskel på Firemonkeycomponenter og normale VCL komponenter og de kan ikke benyttes på det modsatte system.
Der er mange componenter der umiddelbart fungerer, som de plejer, men også nogen der er nye og anderledes.
Og så mangler der sikkert også nogen man plejer ar bruge.
Der er selvfølgelig heller ikke så mange 3.partskomponenter endnu.
Firemonkey er vist først kommet med her i XE2 og mon ikke den vil udvikle sig med tiden.
Delphikoden ligner sig selv, men der er selvfølgelig nogen forskelle, da man ikke benytter de sædvanlige  windowsunits under uses.
Ja spændende ser det ud og en del der skal læres.

Man kan downloade en trial, der er tidsbegrænset.

Mvh. Erik
Avatar billede a_nor Nybegynder
12. januar 2012 - 09:35 #6
Hej Erik

Tak for yderligere info.  Det er noget der skal prøves ! 
Jeg kunne nu godt tænke mig at købe fra en $-side fremfor samme beløbsstørrelse i Euro :-(  ? ?
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