Difference between revisions of "Asynchronous Calls/ja"

From Lazarus wiki
Jump to navigationJump to search
Line 19: Line 19:
 
== 例 ==
 
== 例 ==
  
The following program shows the use of [[doc:lcl/forms/tapplication.queueasynccall.html |QueueAsyncCall]]. If you press on the CallButton, 'Click 1', 'Click 2' and 'Async 1' is added to the LogListBox. Note that Async call is only executed after the CallButtonClick event has finished.
+
次のプログラムは [[doc:lcl/forms/tapplication.queueasynccall.html |QueueAsyncCall]] の使い方を示しています。 If you press on the CallButton, 'Click 1', 'Click 2' and 'Async 1' is added to the LogListBox. Note that Async call is only executed after the CallButtonClick event has finished.
 
<pre>
 
<pre>
 
unit TestQueueAsyncCall;
 
unit TestQueueAsyncCall;

Revision as of 12:22, 14 February 2009

日本語版メニュー
メインページ - Lazarus Documentation日本語版 - 翻訳ノート - 日本語障害情報

問題について

When handling some event, you need to do something, but you can't do it right away. Example: you need to free an object, but it is or will be referenced somewhere in the parent (or its parent etc.) later on. (日本語訳注:関連記事=http://lazarus-dev.blogspot.com/2008/01/new-0926-features-part-1-sendmessage.html

解決方法

Application.QueueAsyncCall メソッドを使用してください。

TDataEvent = procedure (Data: PtrInt) of object;

procedure QueueAsyncCall(AMethod: TDataEvent; Data: PtrInt);

This will "queue" the given method with the given parameter for execution in the main event loop, when all other events have been processed. In the example above, the reference to the object you wanted to free has gone, since the then-parent has finished execution, and the object you wanted to free can be freed safely.

Note that this is a more generic version of ReleaseComponent, and ReleaseComponent calls this method.

次のプログラムは QueueAsyncCall の使い方を示しています。 If you press on the CallButton, 'Click 1', 'Click 2' and 'Async 1' is added to the LogListBox. Note that Async call is only executed after the CallButtonClick event has finished.

unit TestQueueAsyncCall;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
  StdCtrls;

type

  { TQueueAsyncCallForm }

  TQueueAsyncCallForm = class(TForm)
    CallButton: TButton;
    LogListBox: TListBox;
    procedure CallButtonClick(Sender: TObject);
  private
    { private declarations }
    FCounter: PtrInt;
    procedure Async(Data: PtrInt);
  public
    { public declarations }
  end; 

var
  QueueAsyncCallForm: TQueueAsyncCallForm;

implementation

{ TQueueAsyncCallForm }

procedure TQueueAsyncCallForm.CallButtonClick(Sender: TObject);
begin
  LogListBox.Items.Add('Click 1');
  FCounter := FCounter+1;
  Application.QueueAsyncCall(@Async,FCounter);
  LogListBox.Items.Add('Click 2');
end;

procedure TQueueAsyncCallForm.Async(Data: PtrInt);
begin
   LogListBox.Items.Add('Async '+ IntToStr(Data));
end;

initialization
  {$I testqueueasynccall.lrs}

end.