![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
---|Ветка была без названия|---
Avreliy © (2003-05-30 16:30:00)Здравствуйте мастера! (вкратце: FireBird->D7->BDE->DBGrid)
Есть подчинённая таблица и один из столбцов объявлен так:
SUMM Numeric(9,2)(он же - TableESUMM). При внесении данных без всякой самодеятельности (без попыток переприсвоить) - всё срабатывает. А вот, если я после серии проверок желаю изменить вносящиеся данные (в проц-ре OnChange), например, таким образом
TableESUMM.Value := 100 * TableESUMM.Value,
то Д7 выдаёт Debugger Fault Notification: "access violation at 0Xxxxxxxx: write of address 0Xyyyyyyy".
Когда я пытаюсь изменить данные этого поля через запрос, напр.,
QueryESUMM.Value := 100,
то всё срабатывает. В чём ошибка?
Sandman25 (2003-05-30 18:28:00) [21]2 Zacho
Вспомнил одну программку по вводу ТТН, где при изменении пользователем цены с НДС нужно было устанавливать цену без НДС, а при изменении цены без НДС устанавливать цену с НДС.
Zacho (2003-05-30 18:27:00) [22]
> Sandman25 © (30.05.03 18:03)
И еще дополнение: работать твой пример все равно не будет. Правильно было бы так:
procedure TMyForm.MyTableMyFieldChange(Sender:TField);
var
tmpOnChange:TFieldNotifyEvent;
begin
tmpChange:=Sender.OnChange;
Sender.OnChange:=nil;
try
Sender.Value:=...;
finally
Sender.OnChange:=tmpOnChange;
end;
end;
Только зачем такое извращение ?
Sandman25 (2003-05-30 18:24:00) [23]2 Zacho
Может пригодиться. В данном случае, возможно, и не нужно.
Avreliy (2003-05-30 18:21:00) [24]Если я использую TField.OnSetText, то игнорируется OnValidate и вдобавок после попытки ввести данные они исчезают.
Если использовать просто OnValidate, то вводимые данные тоже будут исчезать.
Zacho (2003-05-30 18:14:00) [25]
> Sandman25 © (30.05.03 18:03)
Зачем ??? Ведь есть OnSetText.
Sandman25 (2003-05-30 18:03:00) [26]2 Avreliy
procedure TableOnChange(...);
begin
Table.OnChange := nil;
try
TableESUMM.Value := 100 * TableESUMM.Value;
finally
Table.OnChange := TableOnChange;
end;
Zacho (2003-05-30 17:31:00) [27]
> Avreliy (30.05.03 17:26)
Изменение значения поля в OnChange приводит к вызову OnChange .. и поехало - бесконечная рекурсия.
Используй TField.OnSetText - он для этого и придуман.
Avreliy (2003-05-30 17:26:00) [28]> Sandman25
А как может происходить вызов, если я его в обработчике не указываю?
> Соловьев
Ведь такого обработчика не существует для TField-объектов?
Т.е. советуешь использовать AfterEdit для TTable?
Sandman25 (2003-05-30 17:09:00) [29]Похоже, что происходит рекурсивный вызов обработчика OnChange, пока значение TableESUMM.Value не выйдет за пределы максимально возможного.
Avreliy (2003-05-30 17:06:00) [30]> AlexSerp ©
Дело в том, что у меня уже есть существующий нединамический объект, а динамические объекты я не создавал.
Соловьев (2003-05-30 17:00:00) [31]
> данные (в проц-ре OnChange),
а не пробовал при Edit
AlexSerp (2003-05-30 16:57:00) [32]Обычно access violationвыдает Делфи. Проблема не в данных.
Я получал access violation, только тогда, когда пытался обратиться к несозданной или освобожденной переменной/объекту.
Других ошибок с access violationу меня не было.