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,
то всё срабатывает. В чём ошибка?


Zacho   (2003-05-30 23:05:00) [1]


> Avreliy (30.05.03 22:48)
> Если помнишь, мы уже говорили на эту тему.

Уже забыл, что именно с тобой :(
Удачи !


Avreliy   (2003-05-30 22:48:00) [2]

Дело в том, что это мой первый проект БД...
и весьма вероятно, что последний с использованием BDE...
Если помнишь, мы уже говорили на эту тему.
Но в любом случае, спасибо за содействие.


Zacho   (2003-05-30 22:35:00) [3]


> Avreliy (30.05.03 22:15)

Тогда попробуй разобраться с OnSetText. Imho, это самый правильный способ.
В крайнем случае - Zacho © (30.05.03 18:27) , но это все же изврат.
P.S. А почему BDE ? Старый проект ? Если есть возможность перейти на FIBPlus или IBX - крайне рекомендую.


Avreliy   (2003-05-30 22:15:00) [4]

Я вот подумал...
BeforePost не подходит, потому что мне нужно, чтобы результат отображался незамедлительно после ввода, а не перед попыткой отправить данные на базу.


Zacho   (2003-05-30 22:14:00) [5]


> Avreliy (30.05.03 21:41)
> 2. taEMDETAILSUMM.Value := taEMDETAILSUMM.Value * (quJobCOEFF.Value
> / 100) заменить на
> Sender.Value :=StrToFloat(Text) * (quJobCOEFF.Value / 100)
> не помогает.

Странно. То ли я уже хорошенько забыл, как работает OnSetText, то ли в D7 он работает как-то по другому. То ли дело вообще в чем-то другом.
Попробуй сделать нужные тебе действия в BeforePost.
Похоже, больше ничем не могу помочь. :(


Avreliy   (2003-05-30 21:41:00) [6]

1. Это не lookup поле.
2. taEMDETAILSUMM.Value := taEMDETAILSUMM.Value * (quJobCOEFF.Value / 100) заменить на
Sender.Value :=StrToFloat(Text) * (quJobCOEFF.Value / 100) -
не помогает.
3. В BeforePost ещё не успел.


Zacho   (2003-05-30 21:26:00) [7]


> Avreliy (30.05.03 20:52)

И, в догонку, это случаем не lookup поле?


Zacho   (2003-05-30 21:21:00) [8]


> Avreliy (30.05.03 20:52)

Насколько я понял, это обработчик OnSetText именно поля taEMDETAILSUMM ?
Тогда можно попробовать следующее:
1. else taEMDETAILSUMM.Value := taEMDETAILSUMM.Value - убрать, все равно бессмысленно.
2. taEMDETAILSUMM.Value := taEMDETAILSUMM.Value * (quJobCOEFF.Value / 100) заменить на Sender.Value :=StrToFloat(Text) * (quJobCOEFF.Value / 100)

И, если не получится, как насчет обработки в BeforePost ?


Avreliy   (2003-05-30 20:52:00) [9]

if (ANSILowerCase(taEMDETAILRISETYPE.Value) = "ххххх") then begin
if quJob.Active then quJob.Close;
quJob.ParamByName("JOBTYPE").Value := taEMDETAILJOBTYPE.Value;
quJob.Open;
if (taEMPLOYEEGRADETYPE.IsNull) then
taEMDETAILSUMM.Value := taEMDETAILSUMM.Value * (quJobCOEFF.Value / 100)
else begin
if quGrade.Active then quGrade.Close;
quGrade.ParamByName("GRADETYPE").Value := taEMPLOYEEGRADETYPE.Value;
quGrade.Open;
taEMDETAILSUMM.Value := quGradeGRADESUM.Value * (quJobCOEFF.Value / 100)
end
end
else taEMDETAILSUMM.Value := taEMDETAILSUMM.Value
--------------------------------------------------
ta -таблицы, qu -запросы.
taEMDETAILSUMM.Value, quGradeGRADESUM.Value - TBCDField
quJobCOEFF.Value - TInteger


Zacho   (2003-05-30 20:01:00) [10]


> Avreliy (30.05.03 19:34)

Честно признаюсь, потребность в OnGetText/OnSetText последний раз возникала у меня довольно давно, и было это на Дельфи 3 :-)
Но помню, что никаких проблем не возникало. Приведи свой код обработчика OnSetText.
Как вариант - попробуй TDataSet.BeforePost


Avreliy   (2003-05-30 19:34:00) [11]

В OnValidate я анализирую состояние переменных и в случае чего генерирую исключительную ситуацию. Например, анализирую на предмет возможного ввода отрицательного значения.
А вот после его ввода(отриц. зн-ния) поле ввода снова, как ни в чём и не бывало, оказывается пустым и исключительная ситуация не генерируется.
И ещё. Ведь OnSetText предназначен скорее для работы с текстом, чем для работы с числовыми переменными. И как-то бессмысленно работать со свойством Text вместо Value.
Или с этим обработчиком нужно работать по-другому?
Если код из OnChange просто перебросить в OnSetText, то данные после ввода исчезают.


Zacho   (2003-05-30 19:00:00) [12]


> Avreliy (30.05.03 18:44)

Exception должен вызывать ты сам в OnValidate. Или ты о чем-то другом ?


Sandman25   (2003-05-30 18:55:00) [13]

Не, вот так :)
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);


Sandman25   (2003-05-30 18:54:00) [14]

Zacho © (30.05.03 18:44)

Естественно метод. Ошибся.
procedure TForm1.DataSource1OnChange(Sender:TObjoect; Field:TField); Примерно так надо было... вроде :)

PS. Я сегодня встал в полпятого утра и хочу спать, а с работы уйти не могу - работаю до 19-00 по мск. Вот и приходится лазить по форуму, чтобы не уснуть. Ничего, через пару минут наконец-то пойду домой :)
Счастливо!


Zacho   (2003-05-30 18:44:00) [15]


> Sandman25 © (30.05.03 18:33)

Да дело не столько в теме, сколько в том, что Table.OnChange := TableOnChange - неправильно. Возможно, ты все-таки имел в виду не процедуру, а метод ? :-)


Avreliy   (2003-05-30 18:44:00) [16]

> Zacho © (30.05.03 18:33)
В том-то и дело, что он не вызывает Exception.
Вводимые данные попросту исчезают из поля ввода, абсолютно игнорируясь.


Sandman25   (2003-05-30 18:37:00) [17]

>Avreliy (30.05.03 18:30)

См.Zacho © (30.05.03 18:27), а еще лучше
Zacho © (30.05.03 17:31) ибо Sandman25 © (30.05.03 18:33)
Прошу прощения за нежеланное запутывание


Sandman25   (2003-05-30 18:33:00) [18]

>Zacho © (30.05.03 18:27)

Я обычно ставил обработчик на DataSource.OnDataChange.
Для него и пример привел, только не в тему :)


Zacho   (2003-05-30 18:33:00) [19]


> Avreliy (30.05.03 18:21)

Значит, как-то не так используешь OnSetText, у меня проблем не было.
А OnValidate предназначен исключительно для того, чтобы вызвать Exception если введенные данные не прошли проверку.


Avreliy   (2003-05-30 18:30:00) [20]

> Sandman25
Не совсем понял твой код???
Ведь у TTable нет обработчика OnChange.
И что такое Table.OnChange?


Страницы:   1 2

Наверх

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