Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.007 c
1-57811
Sergn
2002-04-06 19:34
2002.04.18
Фоновый рисунок в компоненте TCustomMemo.


7-57898
AlexanderV
2002-01-23 10:15
2002.04.18
Получение информации о правах текущего пользователя


1-57746
Geo
2002-04-05 13:18
2002.04.18
Как в Delphi 5 /6 установить компонент написанный для преведущих


1-57721
esprit_bel
2002-04-05 08:27
2002.04.18
Звездное поле


1-57728
$hiC0
2002-04-08 16:38
2002.04.18
Цвета в TChart




   Наверх