Reported by Thorsten Engler
Delphi のオンラインヘルプにはこう書かれています:
OnStartDrag イベントハンドラは,ユーザーがコントロールまたはコントロール内のオブジェクトのドラッグを開始したときに特別の処理が実行されるようにすることができます。OnStartDrag イベントは,DragKind が dkDrag の場合にのみ発生します。
Sender は,ドラッグされるコントロール,またはドラッグされるコントロールのコンテナになっているコントロールです。
OnStartDrag イベントハンドラは,TDragControlObject のインスタンスを作成して,DragObject パラメータにドラッグカーソル,または必要な場合はドラッグイメージリストを指定することができます。ドラッグ終了時に DragObject の Free メソッドを呼び出す必要はありません。
(訳注: 日本語版 Delphi 5 のヘルプから原文に該当する部分を引用)
VCL のソースを見てみましょう:
DragDone の中に以下のコードが見つかります:
if DragFreeObject then DragSave.Free;
the only other occurrence of DragFreeObject is here:
ここ以外に DragFreeObject が現れるのは、以下の場所だけです:
procedure DragInitControl(Control: TControl; Immediate: Boolean);
var
DragObject: TDragObject;
begin
DragControl := Control;
try
DragObject := nil;
DragFreeObject := False;
Control.DoStartDrag(DragObject);
if DragObject = nil then
begin
DragObject := TDragControlObject.Create(Control);
DragFreeObject := True;
end;
DragInit(DragObject, Immediate);
except
DragControl := nil;
raise;
end;
end;
見て分かるように、Control.DoStartDrag (これが OnStartDrag を呼び出します) が呼ばれる前に DragFreeObject には False がセットされています。DragObject に nil 以外がセットされた場合(ヘルプでは独自のドラッグオブジェクトの実装を提案しています)、DragFreeObject には False がセットされます。したがってそのオブジェクトは開放されません。
|