RAD Studio VCL Reference
ContentsIndex
PreviousUpNext
TDataSource.OnDataChange Event

Occurs when the data in a record has changed, either due to field edits or moving the cursor to a new record.

Pascal
property OnDataChange: TDataChangeEvent;
C++
__property TDataChangeEvent OnDataChange;

Write an OnDataChange event handler to take specific actions when a field in the current record has been edited and the application moves to another field, or when the current record in the associated dataset changes. OnDataChange is especially useful in applications that must synchronize data display in controls that are not data-aware. This event is typically used to make sure the control reflects the current field values in the dataset, because it is triggered by all changes.  

Methods that can trigger this event include the Next or Prior methods for the dataset. Data-aware controls notify a data source of a data change when: 

Scrolling to a new record. 

Modifications to a field's data.  

C++ Examples: 

 

/*
This example uses a button to copy the value of a field in
the previous record into the corresponding field in the
current record.  The field to copy is specified by using
FindField and the name of the field.
*/
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  TBookmark SavePlace;
  Variant PrevValue;
  // get a bookmark so that we can return to the same record
  SavePlace = Customers->GetBookmark();
  try
  {
    // move to prior record}
    Customers->FindPrior();
    // get the value
    // This is the safe way to get 'CustNo' field
    PrevValue = Customers->FindField("Field2")->Value;
    // This is *not* the safe way to change 'CustNo' field
    // PrevValue = Customers->Fields->Fields[1]->Value;
/*
    Move back to the bookmark
    this may not be the next record anymore
    if something else is changing the dataset asynchronously
*/
    Customers->GotoBookmark(SavePlace);
    // Set the value
    Customers->Edit();
    // This is the safe way to change 'CustNo' field
    Customers->FindField("Field2")->AsString = PrevValue;
    // This is *not* the safe way to change 'CustNo' field
    // Customers->Fields->Fields[1]->AsString = PrevValue;
    // Free the bookmark
  }
  __finally
  {
    Customers->FreeBookmark(SavePlace);
  };
}

/*
To ensure that the button is disabled when there is no
previous record, the OnDataChange event of the DataSource
detects when the user moves to the beginning of file (BOF
property becomes true), and disables the button.  Detection
occurs on scrolling and editing, not selection with the mouse.
*/
void __fastcall TForm1::DS2DataChange(TObject *Sender, TField *Field)
{
  if (Customers->Bof)
    Button2->Enabled = False;
  else
    Button2->Enabled = True;
}
/*
This example uses a button to copy the value of a field in
the previous record into the corresponding field in the
current record.
*/
/*
To ensure that the button is disabled when there is no
previous record, the OnDataChange event of the DataSource
detects when the user moves to the beginning of file (BOF
property becomes true), and disables the button.  Detection
occurs on scrolling and editing, not selection with the mouse.
*/
void __fastcall TForm1::DS2DataChange(TObject *Sender, TField *Field)
{
  if (Customers->Bof)
    Button2->Enabled = False;
  else
    Button2->Enabled = True;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  TBookmark SavePlace;
  Variant PrevValue;

  // get a bookmark so that we can return to the same record
  SavePlace = Customers->GetBookmark();
  Customers->FindPrior();// move to prior record
  PrevValue = Customers->FindField("Field1")->Value; // get the value
  // Move back to the bookmark
  // this may not be the next record anymore
  // if something else is changing the dataset asynchronously
  Customers->GotoBookmark(SavePlace);
  Customers->Edit();
  Customers->FindField("Field1")->Value = PrevValue; // set the value
  Customers->FreeBookmark(SavePlace);
}

 

Delphi Examples: 

{
This example uses a button to copy the value of a field in
the previous record into the corresponding field in the
current record.  The field to copy is specified by using
FindField and the name of the field.
}
procedure TForm1.Button1Click(Sender: TObject);
var
   SavePlace: TBookmark;
   PrevValue: Variant;
begin
  Close;
   with Customers do
   begin
    { get a bookmark so that we can return to the same record }
    SavePlace := GetBookmark;
    try
      { move to prior record}
      FindPrior; 
      { get the value }
      { This is the safe way to get 'CustNo' field }
      PrevValue := FindField('Field2').Value;
      { This is *not* the safe way to change 'CustNo' field }
//    PrevValue := Fields[1].Value;
      { Move back to the bookmark
      this may not be the next record anymore
      if something else is changing the dataset asynchronously }
      GotoBookmark(SavePlace);
      { Set the value }
      Edit;
      { This is the safe way to change 'CustNo' field }
      FindField('Field2').AsString := PrevValue;
      { This is *not* the safe way to change 'CustNo' field }
//      Fields[1].AsString := PrevValue;
      { Free the bookmark }
    finally
      FreeBookmark(SavePlace);
    end;
  end;
end;

{
To ensure that the button is disabled when there is no
previous record, the OnDataChange event of the DataSource
detects when the user moves to the beginning of file (BOF
property becomes true), and disables the button.  Detection
occurs on scrolling and editing, not selection with the mouse.
}
procedure TForm1.DS2DataChange(Sender: TObject; Field: TField);
begin
  if Customers.Bof then
    Button1.Enabled := False
  else
    Button1.Enabled := True;
end;
{
This example uses a button to copy the value of a field in
the previous record into the corresponding field in the
current record.
}
procedure TForm1.Button1Click(Sender: TObject);
var
   SavePlace: TBookmark;
   PrevValue: Variant;
begin
   with Customers do
   begin
    { get a bookmark so that we can return to the same record }
    SavePlace := GetBookmark;
    try
      { move to prior record}
      FindPrior; 
      { get the value }
      PrevValue := FindField('Field2').Value;
      {Move back to the bookmark
      this may not be the next record anymore 
      if something else is changing the dataset asynchronously }
      GotoBookmark(SavePlace);
      { Set the value }
      Edit;
      FindField('Field2').Value := PrevValue;
      { Free the bookmark }
    finally
      FreeBookmark(SavePlace);
    end;
  end;
end;

{
To ensure that the button is disabled when there is no
previous record, the OnDataChange event of the DataSource
detects when the user moves to the beginning of file (BOF
property becomes true), and disables the button.  Detection
occurs on scrolling and editing, not selection with the mouse.
} 
procedure TForm1.DS2DataChange(Sender: TObject; Field: TField);
begin
  if Customers.Bof then
    Button1.Enabled := False
  else
    Button1.Enabled := True;
end;

 

Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!