Я работаю над приложением, которое имеет два списка. Я загружаю два списка со значениями, и когда я продолжаю щелкать элементы из списка, я получаю следующую ошибку при отладке.
Запуск 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
ИЗМЕНИТЬ2
Я не первоначальный разработчик. Иногда я просто обрабатывал код, серьезный рефакторинг невозможен.
редактировать 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;
TTimer
, и такая трата процессорного времени) ужасно для этого . В любом случае, скорее всего, у вас есть процедура, которая вызывает сама себя, или какая-то другая процедура, которая вызывает первую процедуру. Это должно быть достаточно легко найти. Вероятно, EditChange вызывает вызов EditChange, который вызывает вызов EditChange, и так далее до бесконечности. Чтобы убедиться в этом, добавьтеbeep; sleep(1000)
в начало EditChange. (продолжение) - person Andreas Rejbrand   schedule 08.03.2012try..exccept
, ты имеешь в виду? Нет, не может. Вам нужно найти причину проблемы. - person Andreas Rejbrand   schedule 08.03.2012beep; sleep(1000)
в началоEditChange
? - person Andreas Rejbrand   schedule 08.03.2012