Nick |
Отправлено: 15.11.2003, 09:12 |
|
Машинист паровоза
Группа: Участник
Сообщений: 247
|
Есть Грид в котором отображаются две вычисляемые колонки.
Результат зависит от коефф.
Каким методом нужно пересчитать колонку по всему гриду при изменении коефф.
Вычисляемое поле создано в датасете.
В событии onCalcFields прописана формула вычисления.
Grid->Refresh не вызывает onCalcFields для каждой записи.
PageDown, PageUp спасают положение но мне это не нравится. |
|
Admin |
Отправлено: 16.11.2003, 19:21 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE |
Write an OnCalcFields event handler to take specific action when an application recalculates calculated fields. A calculated field is one that derives its value from the values in one or more fields in the dataset, sometimes with additional processing.
OnCalcFields is triggered when
A dataset is opened.
A dataset is put into dsEdit state.
A record is retrieved from a database.
When the AutoCalcFields property is true, OnCalcFields is also triggered when:
Focus moves from one visual control to another, or from one column to another is a data-aware grid control and modifications were made to the record. |
и т.д. см help
То есть я так понимаю, что коэффициэнт не в полях базы,а
какой-то внешний, например вводится в Edit1
Наверное самое простое:
Table->Close(); Table->Open();
CODE |
// t1,t2 — вычисляемые поля, в Edit1->Text — коэффициэнт
//---------------------------------------------------------------------------
void __fastcall TForm1::Table1CalcFields(TDataSet *DataSet)
{
Table1t1->Value = Edit1->Text.ToInt() * Table1PriceRub->Value + Table1Quantity->Value;
Table1t2->Value = Edit1->Text.ToInt() * Table1PriceRub->Value — Table1Quantity->Value;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if(Edit1->Text == "") Edit1->Text = "0";
Table1->Close(); Table1->Open();
}
//---------------------------------------------------------------------------
// или Table1->Refresh();
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if(Edit1->Text == "") Edit1->Text = "0";
Table1->Refresh();
}
//---
|
то есть Table1->Refresh(); а не DBGrid1->Refresh();
Отредактировано Admin — 16/11/2003, 20:28
|
|
Nick |
Отправлено: 18.11.2003, 11:46 |
|
Машинист паровоза
Группа: Участник
Сообщений: 247
|
Спасибо.
Но по команде pFIBDS_Price->Refresh() колонка обновлялась как надо и выскакивало сообщение Can't refresh row (pFIBDS_Price)
Я его заглушил молчаливым try {} catch(...){}.
Но хотелось бы знать в чем дело.
|
|
Admin |
Отправлено: 18.11.2003, 15:24 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
То есть, я понял что работаете через компоненты FIBPlus.
Если это так, то у них есть метод RefreshClientFields:
QUOTE |
procedure RefreshClientFields; Description
Call the RefreshClientFields method to refresh values of calculated
and lookup fields.
|
CODE |
pFIBDS_Price->RefreshClientFields()
|
а для быстрого переоткрытия:
CODE |
pFIBDS_Price->CloseOpen(false);
|
|
|