Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

---|Ветка была без названия|---


Страницы:   1 2

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у меня не было.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо