2つのリストボックスを持つアプリケーションで作業しています.2つのリストボックスに値をロードし、リストボックスの項目をクリックし続けると、デバッグ中に次のエラーが発生します。
exeを実行すると、アプリケーションが閉じます。「アクセス違反」メッセージが表示されることがあります。
それで、私のアプリケーションからこのエラーを取り除くために私は何をすべきですか?
編集
..
メインフォームには、すべてのコントロールtimer_RefreshCOntrol(間隔1)を更新するタイマーがあります。
editBox_oneが変更されるたびに(値)、この関数が呼び出されます
Procedure TStringSetting.SetValue (const AValue : String);
Begin
...
If FValueControl <> Nil then
Begin
FValueControl.OnChange := VoidNotifyEvent;
FValueControl.Text := NewValue;
FValueControl.OnChange := EditChange; //<--here the stackoverflow error comes....
end;
end;
Procedure EditChange (Sender: TObject);
Begin
Value := FValueControl.Text;
If Not EditIsValid then FValueControl.Font.Color := clRed
else If Dirty then FValueControl.Font.Color := clBlue
else FValueControl.Font.Color := clWindowText;
If @OldCustomEditChange <> Nil then OldCustomEditChange(Sender);
end;`
the EditChange (Sender: TObject); <--keeps geting called and the stackoverflow error comes
EditChange
の編集ボックスに割り当てられていますFormCreate
EDIT2
私は元の開発者ではありません。時々コードを処理しただけで、主要なリファクタリングは不可能です。
編集3
コールスタックの値ですが、「???」とは何ですか
編集4
@CosminPrundと@davidを通過した後
インフィニティコールが始まる場所を手に入れました
Procedure TFloatSetting.EditChange (Sender: TObject);
Begin
SkipNextOnChange := True;
Inherited EditChange(Sender);
IfValidThenStore(FValueControl.Text);
Inherited EditChange(Sender); {<-------This is where it start}
end;
Procedure TStringSetting.EditChange (Sender: TObject);
Begin
Value := FValueControl.Text;
If Not EditIsValid then FValueControl.Font.Color := clRed
else If Dirty then FValueControl.Font.Color := clBlue
else FValueControl.Font.Color := clWindowText;
If @OldCustomEditChange <> Nil then OldCustomEditChange(Sender); {<---this keeps calling Procedure TFloatSetting.EditChange (Sender: TObject);}
end;