Ecrire du code pour gérer les événements mineurs (tutoriel dbExpress)
Nous allons créer maintenant des gestionnaires pour les événements restants.
Sommaire
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