gpt4 book ai didi

multithreading - 线程中的 Delphi DragDrop 组件

转载 作者:行者123 更新时间:2023-12-03 15:55:14 25 4
gpt4 key购买 nike

我使用这个组件来处理拖放文件 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;

我想知道为什么会发生这种情况,并提前致谢:)。

最佳答案

不要从其他线程操作VCL组件。

一旦放置事件完成,无法保证组件的放置事件信息将继续有效。

在构造线程时从组件中复制所需的所有信息(即完全填充 DragArray),然后在执行线程时使用缓存的数据。不要在 DragComponent 中存储引用,否则您可能会想从线程的 Execute 方法中使用它,而您确实不应该这样做。

关于multithreading - 线程中的 Delphi DragDrop 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6739219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com