2011-07-18 188 views
3

我使用这个组件,用于处理文件拖放 http://melander.dk/delphi/dragdrop德尔福的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. 

的丢弃处理的工作只是一个时间则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; 

我想知道为什么会这样,并在此先感谢:)。

+0

它帮助你从主线程中的'DragComponent'中读取文件名并将处理留给工作线程?我没有这个拖放组件的经验,所以我不知道它的线程规则是什么。 –

回答

3

不要从其他线程运行VCL组件。

不能保证一旦drop事件完成,组件的drop-event信息将继续有效。

在构建线程时(即完全填充DragArray),复制组件中需要的所有信息,然后在执行线程时使用该缓存的数据。不要在DragComponent中存储参考文献,或者您可能试图使用线程的Execute方法,但您真的不应该这么做。

+1

非常感谢你罗布你是对的这不能保证信息依然有效我不知道我怎么没有这个! :d – Rain