Hola.
No pude compilar y/o ejecutar tu código por que me faltan componentes, pero cuando usas la propiedad vectorial
FieldValues en el evento
OnCellClick deberías revisar que el valor del campo actual no sea nulo:
Código PHP:
void __fastcall TForm2::DBGrid1CellClick( TColumn *Column )
{
TDBGrid *GR = static_cast<TDBGrid*>( DBGrid1 );
TDataSet *DS = static_cast<TDataSet*> ( DBGrid1->DataSource->DataSet );
EditNombre->Text = VarToStrDef(DS->FieldValues["Name"], ""); // <-
EditPrecio->Text = VarToStrDef(DS->FieldValues["Area"], "0"); // <-
if ( EditUnidades->Text != "" && EditPrecio->Text != "" )
EditTotal->Text = EditUnidades->Text.ToDouble() *
EditPrecio->Text.ToDouble();
}
Por mi parte prefiero no usar la propiedad
FieldValues ya que, debido a que usa Variants, es la opción mas lenta.
Mas rápido es:
Código PHP:
...
void __fastcall TForm2::DBGrid1CellClick( TColumn *Column )
{
TDBGrid *GR = static_cast<TDBGrid*>( DBGrid1 );
TDataSet *DS = static_cast<TDataSet*>( DBGrid1->DataSource->DataSet );
EditNombre->Text = DS->FieldByName("Nombre")->AsString;
EditPrecio->Text = DS->FieldByName("Precio")->AsString;
if ( EditUnidades->Text != "" && EditPrecio->Text != "" )
EditTotal->Text = EditUnidades->Text.ToDouble() *
EditPrecio->Text.ToDouble();
}
...
Por último la opción mas eficiente es crear los campos persistentes del
TDatSet y citarlos por su nombre.
Saludos