続編です。
ErrSWを無限ループに入る前にTrueにすればいいことに気が…遅いわ!
それと、戻り先を積んだスタックが気になって実験してみました。
procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
var Value: string);
begin
beep; // このイベントが発生したことを確認するため。本来不要
wait1000; // もし暴走した時に暴走を緩やかにするため。本来不要
Listbox1.Items.Append('1');
if ErrSW then exit;
//
Listbox1.Items.Append('2');
if ACol = 1 then begin
//----------------------------------------
ErrSW := true; // 先にTrueにする
Listbox1.Items.Append('3');
StringGrid1.Cells[1,ARow] := 'aaaaa'; // 以前は無限ループした。
Listbox1.Items.Append('4');
//---------------------------------------
end;
Listbox1.Items.Append('5');
ErrSW := false;
end;
結果
1,2,5,1,2,5,1,2,3,1,4,5,1,2,5と記録されていました。
1,2,3でイベントが発生し、戻り先をスタックに積んで再び1に来てexitした後、
積んだ戻り先へ帰ってきて4,5と制御が流れたようです。
という事で、無限ループは回避できました。スタックメモリもオーバーフロー
しなくて済みそうです。
しか〜し、2列目(Col=1)には'aaaaa'は表示されませんでした。
不思議なことに、Button等をクリックして一度フォーカスを外すと'aaaaa'と
表示されます。
StringGrid1.Cells[1,ARow] := 'aaaaa';の代わりにShowmessage()でも大丈夫
でした。
|