Текущий архив: 2002.04.18;
Скачать: CL | DM;
Вниз
Работа с DBGrid Найти похожие ветки
← →
MCFire (2002-03-28 10:58) [0]Народ!!!Помогите!!! Короче вот такая проблема:
У меня в DataSet есть два поля цена в долларах(PR_D) и цена в гривнах(PR_G) и есть некоторый курс по которому идёт пересчёт например 5.35 . Мне нужно если я меняю в DBGrid цену в долларах то она пересчитывала автоматически цену в гривнах и наоборот если я меняю цену в гривнах она персчитывала цену в длр. Если я добавляю соответсвующие коды в событие OnChange этих полей то происходит зацикливание и получается они меняют друг друга...
Помогите если сможете.....
← →
Alexandr (2002-03-28 11:08) [1]ну так убери зацикливание флагом
← →
MCFire (2002-03-28 11:23) [2]->Alexandr
В смысле использовать какую нибудь булеанскую переменную?
← →
Lusha (2002-03-28 11:25) [3]Перевожу... :)
Заведите логическую переменную и производите изменение смежного поля только при соответствующем значении переменной. Текст обработчика на OnChange при этом будет выглядеть приблизительно так:
if LockKey then Exit;
try
LockKey := True;
// Ваш код
finally
LockKey := False;
end;
где, LockKey та самая переменная...
Удачи
← →
panov (2002-03-28 11:40) [4]>MCFire (28.03.02 10:58)
Используй не OnChange, а DBGrid.OnColExit
Вот примерный код:
procedure TForm1.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;
← →
Johnmen (2002-03-28 12:03) [5]>panov © : Не будет работать, если перемещаться по гриду в вертикальном направлении не меняя текущей колонки, но изменяя значение поля...
← →
panov (2002-03-28 12:25) [6]>Johnmen © (28.03.02 12:03)
Согласен-)
Тогда еще вариант:
...
type TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure FieldValidate(Sender: TField);
...
...
procedure TForm1.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;
procedure TForm1.FormCreate(Sender: TObject);
begin
DBGrid1.DataSource.DataSet.FieldByName("a1").OnValidate :=FieldValidate;
end;
В таком виде будет работать всегда-)
← →
Lusha (2002-03-28 12:30) [7]>panov
А Вы внимательно читали, в чем, собственно, проблема?
← →
panov (2002-03-28 12:34) [8]>Lusha © (28.03.02 12:30)
Код выше именно это и делает. Пересчитывает значение одного поля при изменении другого.
← →
Lusha (2002-03-28 12:37) [9]Да. Но человеку надо, чтобы при изменении одного поля менялось значение друго и НАОБОРОТ. А Вы ему предлагаете по сути те же грабли на которые он уже и наступил.
← →
panov (2002-03-28 13:03) [10]>panov © (28.03.02 12:34)
Тогда прошу прощения.
Про наоборот упустил из виду.
В этом случае приведенный код несложно модифицировать тоже.
procedure TForm1.FieldValidate(Sender: TField);
begin
if UpperCase(TField(Sender).FieldName) ="A1" then
begin
DBGrid1.DataSource.DataSet.FieldByName("a2").OnValidate := nil;
end
else DBGrid1.DataSource.DataSet.FieldByName("a1").OnValidate := nil;
if ((DBGrid1.DataSource.DataSet.State=dsEdit) or
(DBGrid1.DataSource.DataSet.State=dsInsert)) then
begin
if UpperCase(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;
procedure TForm1.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)
-)
Страницы: 1 вся ветка
Текущий архив: 2002.04.18;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.006 c