2011-07-18 151 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