Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
1

Событие OnDataChange

01.05.2015, 02:28. Показов 6891. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброй ночи! В одном из Datasource, в событии OnDataChange прописан необходимый код. Данное событие вызывается при изменении значения данных. Подскажите, каким образом мне вызвать эту процедуру?

Delphi
1
OnDateChange(Sender : TObject; Field : TField)
TObject я так понимаю это сам Дата модуль, его имя, а Field - это поле, но каким образом мне его указать? Я же хочу передать имя поля, по которому будут происходить изменения, а компилятор ругается, что нужен тип TField. Подскажите/научите, как правильно передавать подобные значения?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2015, 02:28
Ответы с готовыми решениями:

Если есть форма и есть событие, а процедуры, его обрабатывающей нет в исходниках, то как это событие обрабатывается?
Друзья! Изучаю синтаксис дельфи. Ну то есть к примеру такой код: procedure...

MaskedTextBox1 событие по системным часам - что должно вызывать это событие?
Добрый день! Помогите разобраться с ситуацией пожалуйста. На форме висит элемент maskedTextBox с...

Событие выбора строки при выборе мышкой событие обрабатывается два раза
Есть JTable, обрабатываю событие выбора строки след. образом: ListSelectionModel r =...

Как обработать событие click и событие нажития стрелки?
Допустим есть кнопка влево-вправо для горизонтального листания товаров. Как нужно кроссбраузерно...

9
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
01.05.2015, 06:27 2
Лучший ответ Сообщение было отмечено Евгений Стронг как решение

Решение

Delphi
1
DateChange(DataSource,DataSource.FieldAddress({название}));
?)
1
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
01.05.2015, 12:49 3
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Подскажите, каким образом мне вызвать эту процедуру?
Зачем её вызывать самому?
1
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
01.05.2015, 14:35  [ТС] 4
Имеются два datasource, в первом добавляются записи, а во втором происходят вычисления. Второй должен реагировать на изменения в первом, что собственно он и делает в событии OnDataChange. Но проблема в том, что реагирует только тогда, когда изменяется значение поля, но если же я просто добавляю запись, то процедура не запускается. Запись добавляется уже со значениями по умолчанию, т.е. по сути есть уже что пересчитать. И вот я думал запускать эту процедуру после добавления записи, чтобы пересчитывались значения. Запустил... но они не пересчитываются... Все равно реагирует только на редактирование поля. Я считал, что когда запись добавляется со значением, запустив эту процу, она сработает. Не подскажешь, как ещё можно это сделать? Или быть может ещё какое-то событие есть, которое бы реагировало и на добавление записи?
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
01.05.2015, 14:54 5
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Имеются два datasource, в первом добавляются записи, а во втором происходят вычисления.
Это опечатка или что? В datasource не добавляются записи. И никогда ничего не пересчитывается. Это всего лишь окошко, через которое видно активную запись в наборе данных.
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
01.05.2015, 15:01  [ТС] 6
Ну это я образно написал. Записи я на самом деле добавляю вообще через query, с помощью sql. А набор данных просто перечитываю с помощью Requery.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
01.05.2015, 15:06 7
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Ну это я образно написал.
Не надо писать образно.
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Записи я на самом деле добавляю вообще через query, с помощью sql. А набор данных просто перечитываю с помощью Requery.
Ну так вот и сам ответил что и как нужно сделать. Добавил новую запись или изменил старую - вызывай Requery. А событие OnDataChange тут совсем и не при чем. Тем более что оно вызывается всякий раз когда происходит просто движение по набору данных, когда и пересчитывать ничего не надо.
1
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
01.05.2015, 15:56  [ТС] 8
У меня не все так просто реализовано. Вот давай код скину, может так станет ясно.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure TDM.dsFoodSostavDataChange(Sender: TObject; Field: TField);
var
recno : Integer;
begin
  // Если внесли изменения в ячейку, то обновляем данные и переносим курсор на ту же строку, где мы и были
  if dsFoodSostav.DataSet.Modified
    then
      begin
        recno := dsFoodSostav.DataSet.RecNo;
        dsFoodSostav.DataSet.Post;
        DM.qryFoodSostav.Requery();
        dsFoodSostav.DataSet.RecNo := recno;
        // Обновляем сумму БЖУ в питании
        DBSumFood.Active := True;
        DM.qrySQL.Close;
        DM.qrySQL.SQL.Text := 'update food set protein = :protein, fat = :fat, carbo = :carbo, cal = :cal '+
        'where id = :id';
        DM.qrySQL.Parameters.ParamByName('protein').Value := DBSumFood.SumCollection.Items[0].SumValue;
        DM.qrySQL.Parameters.ParamByName('fat').Value := DBSumFood.SumCollection.Items[1].SumValue;
        DM.qrySQL.Parameters.ParamByName('carbo').Value := DBSumFood.SumCollection.Items[2].SumValue;
        DM.qrySQL.Parameters.ParamByName('cal').Value := DBSumFood.SumCollection.Items[3].SumValue;
        DM.qrySQL.Parameters.ParamByName('id').Value := foodid;
        DM.qrySQL.ExecSQL;
 
        DBSumFood.Active := False;
 
        DM.qryFood.Refresh;
        MAIN.DBGridEh4.Row := DM.dsFood.DataSet.RecNo;
 
     end;
 
end;
А вот так добавляются данные, двойной клик в гриде на строку. Закомменченная строка - это и есть то, что я спрашивал. Но с ней все равно не происходит пересчет.:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TMAIN.DBGridEh6DblClick(Sender: TObject);
begin
 
  DM.qrySQL.Close;
  DM.qrySQL.SQL.Text := 'insert into foodsostav (food_id,protein,fat,carbo,cal,sprfood_id,foodnb,gramm,tm) '+
  'values (:food_id,:protein,:fat,:carbo,:cal,:sprfood_id,:foodnb,:gramm,:tm)';
  DM.qrySQL.Parameters.ParamByName('food_id').Value := foodid;
  DM.qrySQL.Parameters.ParamByName('protein').Value := DM.dsSprFood.DataSet.FieldByName('protein').AsFloat;
  DM.qrySQL.Parameters.ParamByName('fat').Value := DM.dsSprFood.DataSet.FieldByName('fat').AsFloat;
  DM.qrySQL.Parameters.ParamByName('carbo').Value := DM.dsSprFood.DataSet.FieldByName('carbo').AsFloat;
  DM.qrySQL.Parameters.ParamByName('cal').Value := DM.dsSprFood.DataSet.FieldByName('cal').AsFloat;
  DM.qrySQL.Parameters.ParamByName('sprfood_id').Value := DM.dsSprFood.DataSet.FieldByName('id').AsInteger;
  DM.qrySQL.Parameters.ParamByName('foodnb').Value := sDecimalSpinEdit1.Value;
  DM.qrySQL.Parameters.ParamByName('gramm').Value := 100;
  DM.qrySQL.Parameters.ParamByName('tm').Value := dtp1.DateTime;
  DM.qrySQL.ExecSQL;
 
  DM.qryFoodSostav.Requery();
 
  //DM.dsFoodSostav.OnDataChange(DM.dsFoodSostav, DM.dsFoodSostav.FieldAddress('gramm'));
 
end;

DBSumFood - это компонент от Ehlib, который считает сумму по конкретному полю, всех значений. Таких полей несколько.
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
01.05.2015, 16:04  [ТС] 9
Вот два скрина. На первом добавляется продукт, но общая сумма не обновляется. На втором скрине я поменял граммы со 100 на 50 и сумма пересчиталась.
Миниатюры
Событие OnDataChange   Событие OnDataChange  
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
01.05.2015, 17:00  [ТС] 10
Вероятней всего вот это условие мешает пересчитать
Delphi
1
if dsFoodSostav.DataSet.Modified
Но и его убрать нельзя, так как перемещаясь по строкам, ругается, что нечего менять, что датасет закрыт. Ну и это в принципе верно. К чему лишние запросы кидать, когда данные не поменялись.

Добавлено через 27 минут
Что-то я только сейчас догнал. А почему бы после двойного клика просто не выполнить:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  DBSumFood.Active := True;
        DM.qrySQL.Close;
        DM.qrySQL.SQL.Text := 'update food set protein = :protein, fat = :fat, carbo = :carbo, cal = :cal '+
        'where id = :id';
        DM.qrySQL.Parameters.ParamByName('protein').Value := DBSumFood.SumCollection.Items[0].SumValue;
        DM.qrySQL.Parameters.ParamByName('fat').Value := DBSumFood.SumCollection.Items[1].SumValue;
        DM.qrySQL.Parameters.ParamByName('carbo').Value := DBSumFood.SumCollection.Items[2].SumValue;
        DM.qrySQL.Parameters.ParamByName('cal').Value := DBSumFood.SumCollection.Items[3].SumValue;
        DM.qrySQL.Parameters.ParamByName('id').Value := foodid;
        DM.qrySQL.ExecSQL;
 
        DBSumFood.Active := False;
 
        DM.qryFood.Refresh;
И нет проблем... Всем спасибо!
0
01.05.2015, 17:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2015, 17:00
Помогаю со студенческими работами здесь

Принудительно вызвать событие, если произошло другое событие
Сразу оговорюсь, это тема про события, а НЕ про Windows Forms, да бы ни кто не переносил тему. В...

В каждом из n независимых испытаний событие А происходит с вероятностью p. Найти вероятность того, что событие А произошло
В каждом из n независимых испытаний событие А происходит с вероятностью p. Найти вероятность того,...

Класс: Как обработать событие последнего объекта в форме, не создавая в классе объекта промежуточное событие?
Итак! Проблема состоит в следующем! Имеется класс в который входит объект второго класса. В...

Событие при активации textbox. Или событие при изменения фокуса
Здравствуйте. Подскажите можно ли создать свое событие происходящий вовремя активации textbox....

Ввести структуру "историческое событие" с полями "число", "месяц", "год", "событие"
Ввести структуру ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ. Составить и...

Событие в JS
Всем доброго вечера есть форма по клику происходит событие <!DOCTYPE html PUBLIC "-//W3C//DTD...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru