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

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

Проблемы с OnCalcFields


DelphiLexx ©   (2006-08-10 13:22:00) 

У меня при изменении значения поля Field3 должен вестись перерасчет двух других полей - Field1 и Field2.
Я разместил свой код в OnCalcFields, где и ведется перерасчет Field1 и Field2 на основании нового значения поля Field3.
Так вот как отловить именно тот момент когда в поле Filed3 будет уже новое значение, чтобы перерасчет был правильным.
Весь этот геморой из-за того, что OnCalcFields вызывается и в режиме вставки и врежиме редактирования и т.п.


DelphiLexx   (2006-08-10 17:10:00) [1]


> книжку купил бы себе какую нить чтоль!

Книжек по Delphi перечитал очень много.
А что касается того, почему на первый взглядпростые вопросы я пишу на форум, что простые решенияне всегда эффективны. Вот поэтому и хочется послушать различные варианты людей которые сталкивались с подобной проблемой.
А проблему своя я решил через OnSetText поля Field3.


evvcom   (2006-08-10 16:40:00) [2]

> [12] DelphiLexx ©   (10.08.06 14:16)

Что же ты там такого считаешь, что заметно торможение? Поля у тебя действительно Calc? Или ты это к слову приплел? Потому как, насколько я помню, значения вычисляемых полей перед OnCalcFields сбрасываются, и ты их просто обязан присвоить. Потому значения либо каждый раз придется вычислять, либо завести массив и доставать оттуда. И с этим массивом еще один можно, с флагами "значение посчитано или нет". И в After(Before)Post флаг сбрасывать, если новое значение отличается от старого, как тебе и советовали.

> [13] Сергей М. ©   (10.08.06 14:21)

В BeforePost и AfterPost значения будут одинаковы, за исключением некоторых случаев с in/out параметрами. Запоминать в BeforeEdit ты, наверное, имел ввиду.


ORMADA   (2006-08-10 15:12:00) [3]

дарагой ты наш DelphiLexx
ты только недавно начал изучать дельфи ?
очень на это похоже!
книжку купил бы себе какую нить чтоль!
а то вижу ты любой мало мальский сложный вопрос задаёшь здесь вместо того чтобы порыться в хелпе
2 All
может сразу напишем ему всю его программу :)))))


Сергей М.   (2006-08-10 14:28:00) [4]

Тогда читай внимательно справку о событиях в НД, приводящих к возбуждению OnCalcFields


DelphiLexx   (2006-08-10 14:23:00) [5]


>
> В BeforePost запоминай старое значение, в AfterPost сравнивай
> новое значение со старым

Мне кажется это извращение


Сергей М.   (2006-08-10 14:21:00) [6]


> DelphiLexx ©   (10.08.06 14:16) [12]


В BeforePost запоминай старое значение, в AfterPost сравнивай новое значение со старым


DelphiLexx   (2006-08-10 14:16:00) [7]


> Что мешает всякий раз при событии OnCalcFields выполнять
> нужные вычисления вне зависимости от того, изменилось ли
> значение интересующего поля ?

торможение


Сергей М.   (2006-08-10 14:13:00) [8]

Что мешает всякий раз при событии OnCalcFields выполнять нужные вычисления вне зависимости от того, изменилось ли значение интересующего поля ?


Плохиш   (2006-08-10 14:12:00) [9]

Кстати, всё, что описано в [8], никакого отношения к вычисляемым полям не имеет. Пора уже начать теорию учить.


Плохиш   (2006-08-10 14:11:00) [10]


> DelphiLexx ©   (10.08.06 14:01) [8]

OnBeforePost


DelphiLexx   (2006-08-10 14:01:00) [11]


> А как это соотносится с [3] ?
>
> К тому же зачем нужны все эти статусы. когда есть TField.
> OnSetText ?

Объяню просто, что мне нужно.
Пусть значение текущей записи(к примеру запись №2) поля Field3 = 37, пользователь изменяет значение на 36 и потдвержает сделанные изменения (нажатием Enter или ещё каким - либо способом), вот после этого должна вызваться моя процедура MyProcNewValue, которая изменит значения записи №2 полей Field1 и Field2 по формуле которая использует измененное значение поля Filed3 т.е. 36.
Так когда и где мне вызывать MyProcNewValue?


Сергей М.   (2006-08-10 13:51:00) [12]


> DelphiLexx ©   (10.08.06 13:40) [6]
>
>


А как это соотносится с [3] ?

К тому же зачем нужны все эти статусы. когда есть TField.OnSetText ?


DelphiLexx   (2006-08-10 13:40:00) [13]


> dataset.State in [dsBrowse]

dsBrowse - в OnCalcFields не вызывается


evvcom   (2006-08-10 13:39:00) [14]

> [2] Desdechado ©   (10.08.06 13:26)

В OnCalcFields DataSet.State = dsCalcFields, а уже после выхода возвращается к предыдущему состоянию (dsEdit, dsInsert или др.)


Сергей М.   (2006-08-10 13:38:00) [15]

dataset.State in [dsBrowse]


DelphiLexx   (2006-08-10 13:33:00) [16]


> А ты сбрасывай его в nil при входе в те режимы, где "геморрой")
> .. А по выходу из режима восстанавливай предыд.значение
> ..
> <Цитата

А какой режим считается подтверждением нового значения Field3.


Desdechado   (2006-08-10 13:26:00) [17]

может, поставить проверку
if( dataset.State in[dsEdit,dsInsert]) then Exit;


Сергей М.   (2006-08-10 13:25:00) [18]


> OnCalcFields вызывается и в режиме вставки и врежиме редактирования


А ты сбрасывай его в nil при входе в те режимы, где "геморрой") .. А по выходу из режима восстанавливай предыд.значение ..


Наверх

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