Я работаю над приложением, которое имеет два списка. Я загружаю два списка со значениями, и когда я продолжаю щелкать элементы из списка, при отладке я получаю следующую ошибку.
Запуск exe приводит к закрытию приложения. Иногда я получаю сообщение «Access Violation».
так, что я должен сделать, чтобы избавиться от этой ошибки из моей аппликации?
EDIT
..
Основная форма имеет таймер, который обновляет все элементы управления
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
после прохождения через @Cosmin Prund и @ 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;