2011-07-18 11 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. 

ちょうど1時間の作業ドロッププロセスは、その後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コンポーネントを操作しないでください。

ドロップイベントが完了すると、コンポーネントのドロップイベント情報が引き続き有効であるという保証はありません。

スレッドを作成するときに(つまり、完全に入力してDragArray)コンポーネントから必要な情報をすべてコピーしてから、スレッドを実行するときにキャッシュされたデータを使用します。 DragComponentに参照を格納しないでください。そうしないと、スレッドのExecuteメソッドから参照を使用するように誘惑される可能性があります。

+1

ありがとうございましたロブです。情報がまだ有効であるという保証はありません。私はこれをどうやって得られなかったのか分かりません!! :D – Rain

関連する問題