Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.017 c
3-57584
Roman_tutov@mail.ru
2002-03-22 18:57
2002.04.18
Delphi & postgress


1-57722
Елена
2002-04-08 13:41
2002.04.18
Перечислимый тип


6-57829
Брыкун Дмитрий
2002-02-06 14:50
2002.04.18
Как написать письмо?


1-57673
ЕвгенийА
2002-04-07 13:10
2002.04.18
Графика


1-57745
Ptr
2002-04-05 12:59
2002.04.18
TreeView.selected ?