Delphi tbackgroundworker组件创建事件

时间:2014-05-28 10:58:40

标签: delphi delphi-xe5

如何在tbackgroundworker中创建活动? 这是我尝试过但事件不起作用:

unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, backgroundworker;

type
  TForm1 = class(TForm)
    BackgroundWorker: TBackgroundWorker;
    procedure BackgroundWorkerWork(Worker: TBackgroundWorker);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure BackgroundWorkerWork(Worker: TBackgroundWorker);
begin
  showmessage('HOI');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
BackgroundWorker.Cancel;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
BackgroundWorker.execute;
end;

end.

我认为它不起作用,因为backgroundworker.tworkevent和过程BackgroundWorkerWork(Worker:TBackgroundWorker)过程之间没有链接。 但我该如何解决这个问题呢?我不知道如何使用backgroundworker添加活动

1 个答案:

答案 0 :(得分:3)

它“无法正常工作”(这不是一个很好的问题描述),因为您已将BackgroundWorkerWork事件声明为此处表单的方法:

type
  TForm1 = class(TForm)
    BackgroundWorker: TBackgroundWorker;
    procedure BackgroundWorkerWork(Worker: TBackgroundWorker);
    ...
  end

但是在这里宣布它是一个独立的程序(注意程序名称前面没有TForm1

procedure BackgroundWorkerWork(Worker: TBackgroundWorker);

正确创建事件处理程序的最简单方法是使用Object Inspector的Events选项卡;只需双击要为其创建处理程序的事件,IDE将为其生成声明和空实现(如果它不存在),然后转到实现。在这种情况下,它会生成这个:

procedure TForm1.BackgroundWorkerWork(Worker: TBackgroundWorker);
begin

end;

如果你没有在表单上删除TBackgroundWorker组件,而是在运行时创建它,你仍然可以基本相同的方式进行。

  • 在表单的private部分声明事件:

    type
      TForm1 = class(TForm)
        // Other stuff added by IDE
      private
        BackgroundWorker: TBackgroundWorker;
        procedure BackgroundWorkerWork(Worker: TBackgroundWorker);
      end;
    
  • 将光标放在表单声明中的任意位置,然后按 Ctrl + Shift + C 进行代码完成;它会自动添加事件处理程序的shell代码供您填写。

  • 在表单的OnCreate事件中,创建TBackgroundWorker并在代码中分配事件:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      BackgroundWorker := TBackgroundWorker.Create(Self);
      BackgroundWorker.OnWork := BackgroundWorkerWork;
      // Assign any other events to the BackgroundWorker here as well.
    end;
    

(将来当你说“不起作用”时,请解释具体它是如何工作的,包括你可能有的任何错误信息。当你有错误信息时,包括完全错误消息,并在可能的情况下指示代码的哪一行导致错误。如果您在询问时向我们提供有关问题的信息,则可以更轻松地获得问题的答案。