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

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

Работа с DBGrid [D5, IB6.x]


MCFire ©   (2002-03-28 10:58:00) 

Народ!!!Помогите!!! Короче вот такая проблема:
У меня в DataSet есть два поля цена в долларах(PR_D) и цена в гривнах(PR_G) и есть некоторый курс по которому идёт пересчёт например 5.35 . Мне нужно если я меняю в DBGrid цену в долларах то она пересчитывала автоматически цену в гривнах и наоборот если я меняю цену в гривнах она персчитывала цену в длр. Если я добавляю соответсвующие коды в событие OnChange этих полей то происходит зацикливание и получается они меняют друг друга...
Помогите если сможете.....


panov   (2002-03-28 13:03:00) [1]

>panov © (28.03.02 12:34)
Тогда прошу прощения.
Про наоборотупустил из виду.

В этом случае приведенный код несложно модифицировать тоже.

procedureTForm1.FieldValidate(Sender: TField);
begin
ifUpperCase(TField(Sender).FieldName) ="A1" then
begin
DBGrid1.DataSource.DataSet.FieldByName("a2").OnValidate := nil;
end
elseDBGrid1.DataSource.DataSet.FieldByName("a1").OnValidate := nil;

if((DBGrid1.DataSource.DataSet.State=dsEdit) or
(DBGrid1.DataSource.DataSet.State=dsInsert)) then
begin
ifUpperCase(TField(Sender).FieldName) ="A1" then
DBGrid1.DataSource.DataSet.FieldByName("a2").Value :=
DBGrid1.DataSource.DataSet.FieldByName("a1").Value*5
else
DBGrid1.DataSource.DataSet.FieldByName("a1").Value :=
DBGrid1.DataSource.DataSet.FieldByName("a2").Value/5;
end;
DBGrid1.DataSource.DataSet.FieldByName("a1").OnValidate :=FieldValidate;
DBGrid1.DataSource.DataSet.FieldByName("a2").OnValidate :=FieldValidate;
end;

procedureTForm1.FormCreate(Sender: TObject);
begin
DBGrid1.DataSource.DataSet.FieldByName("a1").OnValidate :=FieldValidate;
DBGrid1.DataSource.DataSet.FieldByName("a2").OnValidate :=FieldValidate;
end;

Хотя, возможно, это и сложнее, нежели в Lusha © (28.03.02 11:25)
-)


Lusha   (2002-03-28 12:37:00) [2]

Да. Но человеку надо, чтобы при изменении одного поля менялось значение друго и НАОБОРОТ. А Вы ему предлагаете по сути те же грабли на которые он уже и наступил.


panov   (2002-03-28 12:34:00) [3]

>Lusha © (28.03.02 12:30)
Код выше именно это и делает. Пересчитывает значение одного поля при изменении другого.


Lusha   (2002-03-28 12:30:00) [4]

>panov
А Вы внимательно читали, в чем, собственно, проблема?


panov   (2002-03-28 12:25:00) [5]

>Johnmen © (28.03.02 12:03)
Согласен-)
Тогда еще вариант:

...
typeTForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedureFieldValidate(Sender: TField);
...
...


procedureTForm1.FieldValidate(Sender: TField);
begin
if((DBGrid1.DataSource.DataSet.State=dsEdit) or
(DBGrid1.DataSource.DataSet.State=dsInsert)) then
begin
DBGrid1.DataSource.DataSet.FieldByName("a2").Value :=
DBGrid1.DataSource.DataSet.FieldByName("a1").Value*5;
end;
end;

procedureTForm1.FormCreate(Sender: TObject);
begin
DBGrid1.DataSource.DataSet.FieldByName("a1").OnValidate :=FieldValidate;
end;


В таком виде будет работать всегда-)


Johnmen   (2002-03-28 12:03:00) [6]

>panov © : Не будет работать, если перемещаться по гриду в вертикальном направлении не меняя текущей колонки, но изменяя значение поля...


panov   (2002-03-28 11:40:00) [7]

>MCFire (28.03.02 10:58)
Используй не OnChange, а DBGrid.OnColExit

Вот примерный код:

procedureTForm1.DBGrid1ColExit(Sender: TObject);
begin
if((UpperCase(DBGrid1.SelectedField.FieldName) ="A1") and
((DBGrid1.DataSource.DataSet.State=dsEdit) or
(DBGrid1.DataSource.DataSet.State=dsInsert))) then
begin
DBGrid1.DataSource.DataSet.FieldByName("a2").Value :=
DBGrid1.DataSource.DataSet.FieldByName("a1").Value*5;
end;
end;


Lusha   (2002-03-28 11:25:00) [8]

Перевожу... :)
Заведите логическую переменную и производите изменение смежного поля только при соответствующем значении переменной. Текст обработчика на OnChange при этом будет выглядеть приблизительно так:

if LockKey then Exit;
try
LockKey := True;

// Ваш код

finally
LockKey := False;
end;

где, LockKey та самая переменная...

Удачи


MCFire   (2002-03-28 11:23:00) [9]

->Alexandr
В смысле использовать какую нибудь булеанскую переменную?


Alexandr   (2002-03-28 11:08:00) [10]

ну так убери зацикливание флагом


Наверх

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