Delphi DragDrop Компонент в Темах - PullRequest
3 голосов
/ 19 июля 2011

я использую этот компонент для обработки файлов перетаскивания http://melander.dk/delphi/dragdrop

unit DragThread;

interface

uses
  Classes,DragDrop, DropTarget,DragDropFile,Dialogs,SysUtils;

type
  TDragThread = class(TThread)
  private
    { Private declarations }
    ArraysLength : Integer;
    DragComponent : TDropFileTarget;
    DragArray,HashsArray : Array of string;
    Procedure FDArray;
    //Procedure FDHArray;
  protected
    procedure Execute; override;
  Public
    Constructor Create(Com: TDropFileTarget);
    Destructor Destroy; Override;
  end;

implementation

{ TDragThread }

Constructor TDragThread.Create(Com: TDropFileTarget);
begin
   inherited Create(True);
   DragComponent := Com;
end;

Destructor TDragThread.Destroy;
begin
  //DragComponent.Free;
end;

Procedure TDragThread.FDArray;
var
  A : Integer;
begin
  SetLength(DragArray,DragComponent.Files.Count);
  SetLength(HashsArray,DragComponent.Files.Count);

  ShowMessage(IntToStr(DragComponent.Files.Count)); // just working in the first time !!

for A := 0 to DragComponent.Files.Count -1 do begin
      DragArray[A] := DragComponent.Files[A];
      //ShowMessage(DragComponent.Files[A]);

   end;
  ArraysLength := DragComponent.Files.Count-1;
  //ShowMessage(DragComponent.Files[0]);
end;

procedure TDragThread.Execute;
begin
  { Place thread code here }
  FDArray;
end;

end.

странная вещь, что процесс Drop работает только один раз, тогда DragComponent.Files.Count дает 0 навсегда. !!

вот как я это называю

procedure TForm1.DropFileDrop(Sender: TObject; ShiftState: TShiftState;
  APoint: TPoint; var Effect: Integer);
var
  DropThread : TDragThread;
begin
 DropThread := TDragThread.Create(DropFile);
 DropThread.Resume;
end;

Я хочу знать, почему это произошло, и спасибо заранее :).

1 Ответ

3 голосов
/ 19 июля 2011

Не использовать компоненты VCL из других потоков.

Нет никакой гарантии, что информация о событии удаления компонента останется действительной после завершения события удаления.

Скопируйте всю необходимую информацию из компонента при создании потока (т. Е. Полностью заполните DragArray), а затем используйте эти кэшированные данные при выполнении потока. Не храните ссылку в DragComponent, иначе у вас может возникнуть желание использовать ее из метода Execute потока, чего на самом деле не следует делать.

...