喫茶XRAYトップページ

[スレッド全体
]

[7613] Re3:StringGridと格闘中…結果報告返信 削除
2014/5/21 (水) 15:00:13 taki
続編です。
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()でも大丈夫
でした。


[7614] Re4:StringGridと格闘中…結果報告返信 削除
2014/5/21 (水) 17:42:51 taki
度々すみません。これらのコードを試す人はいないとは思いますが念のため。

ErrSW:boolean;はグローバル変数として定義してください。
そしてFormCreate手続き内でfalseにセットしてください。



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82