![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с 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]ну так убери зацикливание флагом