Пожалуйста Помогите В Решении Проблемы

04.07.2013
5
0
#1
Таблица на Paradox имеет поле "сумма", которе заполняется ручками с клавиатуры и где ничего не высчитывается. При введении в это поле циферок и попытке записи в таблицу БД выдаётся ошибка о переполнении стэка. Прбовал даже через SetText проверку ввода данных делать - не помогает. Причём проблема возникает только при добавлении новой записи, а при редактировании суммы уже существующей - никаких ошибок. И део в том, что это поле автоматом проверяется БД, ничего кроме циферок, туде не введётся по определению.

Например. самый простой код:
procedure TDM.AgreemASummSetText(Sender: TField; const Text: String);
begin
DM.AgreemASumm.Value:=StrToFloat(Text);
end;
 

sinkopa

Well-Known Member
#2
Таблица на Paradox имеет поле "сумма", которе заполняется ручками с клавиатуры и где ничего не высчитывается. При введении в это поле циферок и попытке записи в таблицу БД выдаётся ошибка о переполнении стэка. Прбовал даже через SetText проверку ввода данных делать - не помогает. Причём проблема возникает только при добавлении новой записи, а при редактировании суммы уже существующей - никаких ошибок. И део в том, что это поле автоматом проверяется БД, ничего кроме циферок, туде не введётся по определению.

Например. самый простой код:
procedure TDM.AgreemASummSetText(Sender: TField; const Text: String);
begin
DM.AgreemASumm.Value:=StrToFloat(Text);
end;
TDM.AgreemASummSetText - это обработчик события которое возникает когда AgreemASumm получает из редактора поля свое строковое значение.
DM.AgreemASumm.Value := StrToFloat(Text); - это код который рождает событие которое вызывает обработчик TDM.AgreemASummSetText...
Заколдованный круг получается... который у программистов называется - stack overflow. :)
 
04.07.2013
5
0
#3
Спасибо большое. Я уже попробовал убрать процедуру целиком, т.е. чтобы БД обрабатывала ввод данных, но возникает та же самая ошибка к моему сожелению. Чёт я туплю конкретно. Ошибка возникает после выбора данных в предидущем Loockup-поле "Вид договора". Если поле "сумма" поставить и соответственно заполнить, до Loockup-поля "Вид договора", то ошибки не возниает. Вот код, который обрабатывается при вводе в Loockup-поле "Вид договора":

Код:
procedure TDM.AgreemTypeAgreemChange(Sender: TField);
begin
if TempState='dsInsert' then
begin
if DM.Types.Locate('TTypeAgreem', DM.AgreemTypeAgreem.AsString, []) then
begin

Form_Contracts.DBGrid_AGREEMENTS.Columns[6].Title.Color:=clInfoBk;
Form_Contracts.DBGrid_AGREEMENTS.Columns[6].Color:=clCream;

DM.AgreemASumm.ReadOnly:=false;

Form_Contracts.DBGrid_AGREEMENTS.SelectedIndex:=7;
Form_Contracts.DBGrid_AGREEMENTS.EditorMode:=true; //+
Form_Contracts.DBGrid_AGREEMENTS.SetFocus;
Form_Contracts.DBGrid_AGREEMENTS.Columns[7].Title.Color:=$DFFFDB;
Form_Contracts.DBGrid_AGREEMENTS.Columns[7].Color:=$DFFFDB;

Abort;
end;
end;
end;
Т.е. суть проста: после выборки данных в Loockup-поле "Вид договора", мы автоматом переходим к следуюущему поле "Сумма", в котором собственно ошибка и возникает.
 

sinkopa

Well-Known Member
#4
Т.е. суть проста: после выборки данных в Loockup-поле "Вид договора", мы автоматом переходим к следуюущему поле "Сумма", в котором собственно ошибка и возникает.
Да Вы батенька кудесник... :)
Я никак не могу себе представить (что то с экстрасенсорикой хреново сегодня) как реализовано Ваше Loockup-поле "Вид договора"...
Но зато явственно наблюдается... я бы сказал просто маниакальная тагя положить какой нибудь код в бесконечную вложенную рекурсию... :)
DM.Types это у Вас какой-то Dataset, правильно я понял? AgreemType - это видимо у Вас тот самый злополучный Loockup, да? И связан он как я подозреваю с датасетом... DM.Types?
Вы отдаете себе отчет, что метод датасета DM.Types.Locate('TTypeAgreem', DM.AgreemTypeAgreem.AsString, []) (думаю что я не ошибся) как раз и рождает событие которое приводит Вас к обработчику TDM.AgreemTypeAgreemChange(Sender: TField);
Вы не пробовали пройти Ваш код по шагам в отладчике? :)
Знаете что такое "точка останова" и как пользоваться отладчиком?