Ecrire du code pour gérer les événements mineurs (tutoriel dbExpress)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Tutoriel : Utilisation de dbExpress pour visualiser et mettre à jour les bases de données d'une application

Nous allons créer maintenant des gestionnaires pour les événements restants.

Clic sur la case à cocher Open

Avec le composant TCheckBox sélectionné, double-cliquez sur l'événement OnClick situé sur l'onglet Evénement de l'inspecteur d'objets. Ajoutez le code suivant :

Delphi

procedure TForm2.CheckBoxActiveClick(Sender: TObject);
begin
  // If checked, activate the client data set; if unchecked, deactivate it.
  ClientDataSet1.Active := CheckBoxActive.Checked
end;

C++

void __fastcall TForm1::CheckBoxActiveClick(TObject *Sender)
{
  // If checked, activate the client data set; if unchecked, deactivate it.
  ClientDataSet1->Active = CheckBoxActive->Checked;
}

L'activation du TClientDataSet provoque l'exécution de la commande SQL du TEdit libellé par SQL:. Pour de plus amples informations, voir la rubrique Modification de la commande SQL ci-dessous.

TClientDataSet à fermer

Cet événement est déclenché juste avant la fermeture du TClientDataSet, qui se produit quand une autre table est sélectionnée.

Un clic sur une cellule de table affiche les données de cette cellule dans une fiche, MemoForm, qui est un objet TFormCurrentField. Définissez TFormCurrentField dans Ajouter une fiche de visualisation de cellules. Ce gestionnaire d'événements détruit le TFormCurrentField.

Générez le stub du gestionnaire d'événements, comme d'habitude, en double-cliquant sur l'événement BeforeClose du composant TClientDataSet.

Delphi

procedure TForm2.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
  // If a form to display the table cell contents exists, destroy it.
  if Assigned(MemoForm) then
  begin
    MemoForm.DBMemoCurrentField.DataField := '';
    if MemoForm.Visible then
      MemoForm.Close;
  end;
end;

C++

void __fastcall TForm1::ClientDataSet1BeforeClose(TDataSet *DataSet)
{
  // If a form to display the table cell contents exists, destroy it.
  if (MemoForm)
  {
MemoForm->DBMemoCurrentField->DataField = "";
if (MemoForm->Visible)
      MemoForm->Close();
  }
}

Clic sur le bouton Apply Updates

Un clic sur le TButton Apply Updates s'applique aux mises à jour de la base de données, c'est-à-dire qu'il permet d'écrire les enregistrements modifiés dans la base de données. Bien que cette mise à jour soit accomplie en appelant TClientDataSet.ApplyUpdates, le TDataSetProvider effectue réellement la mise à jour pour l'ensemble de données. Voir les commentaires Ajouter des composants de base de données sur TDataSetProvider.

Double-cliquez sur l'événement OnClick du TButton Apply Updates et ajoutez ce code au squelette de code généré.

Delphi

procedure TForm2.ButtonApplyClick(Sender: TObject);
var
  X, Y: Integer;
begin
  // Client data set has provider do update.
  ClientDataSet1.ApplyUpdates(-1);
  Y := Self.Top + Self.ButtonApply.Top;
  X := Self.Left + Self.ButtonApply.Left;

  // Ask user if data should be refreshed in grid display.
  if MessageDlgPos('Refresh?',mtCustom, [mbYes, mbNo], 0, X, Y) = mrYes then
  begin
    ClientDataSet1.Close;
    ClientDataSet1.Open;
  end;
end;

C++

void __fastcall TForm1::ButtonApplyClick(TObject *Sender)
{
  int X, Y;

  // Client data set has provider do update.
  ClientDataSet1->ApplyUpdates(-1);
  Y = this->Top + this->ButtonApply->Top;
  X = this->Left + this->ButtonApply->Left;

  // Ask user if data should be refreshed in grid display.
  if (MessageDlgPos("Refresh?",mtCustom, mbYesNo, 0, X, Y) == mrYes)
  {
ClientDataSet1->Close();
ClientDataSet1->Open();
  }
}


Conseil : A la place de ce bouton, vous pouvez utiliser les boutons ApplyUpdates et CancelUpdates du contrôle Vcl.DBCtrls.TDBNavigator.

Modification du filtre TEdit

Au fur et à mesure que le texte change dans le TEdit contenant le filtre, la liste des tables du TListBox change aussi. PopulateListBox est un utilitaire qui liste les tables actuellement filtrées dans le TListBox.

Double-cliquez sur l'événement OnChange du filtre TEdit pour créer le stub, puis ajoutez le code ci-dessous.

Delphi

procedure TForm2.EditFilterChange(Sender: TObject);
begin
  if SQLConnection1.Connected then
    PopulateListBox;  //repopulate table list box, based on new filter text
end;

C++

void __fastcall TForm1::EditFilterChange(TObject *Sender)
{
  if (SQLConnection1->Connected)
PopulateListBox();  //repopulate table list box, based on new filter text
}

Activation et désactivation du filtre TEdit

Les événements OnEnter et OnExit se réfèrent au TEdit (contenant le texte du filtre) devenant actif et inactif, c'est-à-dire obtenant et perdant la focalisation. Ajoutez les gestionnaires d'événements TEdit, comme décrit précédemment, puis ajoutez le code suivant :

Delphi

procedure TForm2.EditFilterEnter(Sender: TObject);
begin
  // Blank text when the field is activated.
  EditFilter.Text := '';
end;
procedure TForm2.EditFilterExit(Sender: TObject);
begin
  // If blank and the field is deactivated, change text back to original hint.
  if EditFilter.Text = '' then
    EditFilter.Text := 'Filter (* as wild)';
end;

C++

void __fastcall TForm1::EditFilterEnter(TObject *Sender)
{
  // Blank text when the field is activated.
  EditFilter->Text = "";
}
void __fastcall TForm1::EditFilterExit(TObject *Sender)
{
  // If blank and the field is deactivated, change text back to original hint.
  if (EditFilter->Text == "")
EditFilter->Text = "Filter (* as wild)";
}

Modification de la commande SQL

Quand le texte du TEdit contenant la commande SQL est modifié, vous voulez mettre à jour le texte de la commande SQL pour le composant TSQLDataSet. Quand vous cochez sur le TCheckBox Open, le TClientDataSet est activé, ce qui entraîne l'exécution de la nouvelle commande SQL et la mise à jour des données de la base de données. En conséquence, vous pouvez modifier la commande SQL, puis cocher la case TCheckBox pour exécuter la commande.

Double-cliquez sur l'événement OnChange de la commande SQL TEdit et ajoutez le code ci-dessous.

Delphi

procedure TForm2.EditSQLChange(Sender: TObject);
begin
  SQLDataSet1.CommandText := EditSQL.Text;
end;

C++

void __fastcall TForm1::EditSQLChange(TObject *Sender)
{
  SQLDataSet1->CommandText = EditSQL->Text;
}

Evénement de nettoyage de la fiche

Quand l'application est terminée, vous allez effectuer un nettoyage : la fermeture de la connexion de base de données et la libération des objets qui ne sont plus nécessaires. Sélectionnez la fiche, puis double-cliquez sur l'événement OnDestroy dans l'inspecteur d'objets. Ajoutez le code pour cet événement.

Delphi

procedure TForm2.FormDestroy(Sender: TObject);
begin
  // Close the connection.
  if SQLConnection1.Connected then
    SQLConnection1.Close;
  // Free objects.
  if Assigned(FMetaDataProvider) then
    FreeAndNil(FMetaDataProvider);
  if Assigned(MemoForm) then
    FreeAndNil(MemoForm);
  if Assigned(AllTables) then
    FreeAndNil(AllTables);
end;

C++

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  // Close the connection.
  if (SQLConnection1->Connected)
SQLConnection1->Close();

  // Free objects.
  if (FMetaDataProvider)
  {
delete FMetaDataProvider;
FMetaDataProvider = NULL;
  }
  if (MemoForm)
  {
delete MemoForm;
MemoForm = NULL;
  }
  if (AllTables)
  {
delete AllTables;
AllTables = NULL;
  }
}

Précédent

Développer du code pour gérer les événements principaux

Suivant

Ecrire du code utilitaire