Développer du code pour gérer les événements principaux (tutoriel dbExpress)
Cette section contient le code de gestion des événements principaux associés aux composants de la fiche.
Sommaire
Sélection d'une entrée du contrôle TComboBox
La sélection de la connexion de base de données du TComboBox déclenche cet événement, qui ferme aussi le TComboBox. Sélectionnez le composant TComboBox. Sur l'onglet Evénements de l'inspecteur d'objets, double-cliquez sur l'événement OnCloseUp
pour générer le stub de ce gestionnaire d'événements. Remplissez ensuite avec le code suivant :
Delphi
procedure TForm2.ComboBoxConnectionsCloseUp(Sender: TObject);
begin
// Was a selection made?
if ComboBoxConnections.ItemIndex = -1 then
Exit;
// Initialize some utility objects.
if not Assigned(AllTables) then
AllTables := TStringList.Create;
if Assigned(FMetaDataProvider) then
FreeAndNil(FMetaDataProvider);
// If there was an open connection, close it. Indicate the connection is not active.
if SQLConnection1.Connected then
SQLConnection1.Close;
CheckBoxActive.Checked := False;
// Open the selected database connection.
SQLConnection1.ConnectionName := ComboBoxConnections.Items[ComboBoxConnections.ItemIndex];
SQLConnection1.LoadParamsOnConnect := True;
SQLConnection1.LoginPrompt := False;
SQLConnection1.Open;
SQLConnection1.GetTableNames(AllTables, False); //get the database's list of tables
// Get metadata for selected connection.
FMetaDataProvider := TDBXDataExpressMetaDataProvider.Create;
FMetaDataProvider.Connection := sqlconnection1.DBXConnection; //set to our open connection
FMetaDataProvider.Open;
// Populate the list box with the tables in this database connection.
PopulateListBox;
// Initialize some dialog items' state.
SQLDataSet1.CommandText := '';
EditSQL.Text := '';
CheckBoxActive.Enabled := False;
ButtonApply.Enabled := False;
end;
C++
void __fastcall TForm1::ComboBoxConnectionsCloseUp(TObject *Sender)
{
// Was a selection made?
if (ComboBoxConnections->ItemIndex == -1)
return;
// Initialize some utility objects.
if (!AllTables)
AllTables = new TStringList();
if (FMetaDataProvider) {
delete FMetaDataProvider;
FMetaDataProvider = NULL;
}
// If there was an open connection, close it. Indicate the connection is not active.
if (SQLConnection1->Connected)
SQLConnection1->Close();
CheckBoxActive->Checked = false;
// Open the selected database connection.
SQLConnection1->ConnectionName = ComboBoxConnections->Items->Strings[ComboBoxConnections->ItemIndex];
SQLConnection1->LoadParamsOnConnect = true;
SQLConnection1->LoginPrompt = false;
SQLConnection1->Open();
SQLConnection1->GetTableNames(AllTables, false); //get the database's list of tables
// Get metadata for selected connection.
FMetaDataProvider = new TDBXDataExpressMetaDataProvider();
FMetaDataProvider->Connection = SQLConnection1->DBXConnection; //set to our open connection
FMetaDataProvider->Open();
// Populate the list box with the tables in this database connection.
PopulateListBox();
// Initialize some dialog items' state.
SQLDataSet1->CommandText = "";
EditSQL->Text = "";
CheckBoxActive->Enabled = false;
ButtonApply->Enabled = false;
}
Commentaires sur la gestion de la sélection d'une entrée
Le code vérifie s'il existe une connexion active et la ferme, puisque nous en avons sélectionné une autre. Bien qu'une base de données a été sélectionnée, elle n'est pas encore active.
Nous ouvrons la connexion en utilisant l'élément du TComboBox que vous avez sélectionné, la connexion de base de données choisie.
- Dans le code Delphi, cette sélection TComboBox est
ComboBoxConnections.Items[ComboBoxConnections.ItemIndex]
- Dans le code C++, cette sélection TComboBox est
ComboBoxConnections->Items->Strings[ComboBoxConnections->ItemIndex]
Dès que la connexion est ouverte, nous pouvons obtenir les métadonnées (les noms des tables de la base de données) en utilisant la procédure GetTableNames. Ces données sont enregistrées dans la variable TStringList AllTables
.
Nous obtenons aussi les métadonnées avec TDBXDataExpressMetaDataProvider
, qui est dérivé de TDBXMetaDataProvider
.
PopulateListBox
est une fonction utilitaire que nous verrons plus loin. Cette fonction ajoute simplement les noms de table que nous venons d'obtenir à la zone de liste pour un accès ultérieur.
Bien que nous avons ouvert la connexion de base de données, nous n'avons pas encore lu des données. C'est pourquoi le code désactive les divers contrôles qui ne sont utilisés qu'en présence de données.
Sélection de la table
Nous sélectionnons la table en double-cliquant sur un nom de table dans la zone de liste, qui est remplie en sélectionnant la connexion de base de données. Pour écrire un gestionnaire pour cet événement, sélectionnez le composant zone de liste. Sur l'onglet Evénements de l'inspecteur d'objets, double-cliquez sur l'événement OnDblClick
pour générer le stub du gestionnaire d'événements. Voici le code du gestionnaire :
Delphi
procedure TForm2.ListBox1DblClick(Sender: TObject);
var
FieldNamesList: TStringList;
SQLStmt: String;
I: Integer;
begin
// Activate appropriate controls now that table is selected.
CheckBoxActive.Enabled := True;
ButtonApply.Enabled := True;
TableName := ListBox1.Items[ListBox1.ItemIndex]; //get table name
// Get field (column) names for this table.
FieldNamesList := TStringList.Create;
FieldNamesList.Clear;
SQLConnection1.GetFieldNames(TableName, FieldNamesList);
// Construct SQL Select statement for all fields.
if FieldNamesList.Count > 0 then
begin
SQLStmt := 'select ';
for I := 0 to FieldNamesList.Count - 1 do
begin
SQLStmt := SQLStmt + FieldNamesList[I] + ',';
end;
SQLStmt[Length(SQLStmt)] := ' ';
SQLStmt := SQLStmt + 'from '+TableName;
end
else
// Can't find field names, so use '*'
SQLStmt := 'select * from '+TableName;
FreeAndNil(FieldNamesList);
// Set up SQL statement to get all table's data.
EditSQL.Text := SQLStmt;
// Set CommandText to SQL statement.
SQLDataSet1.CommandText := EditSQL.Text;
if ClientDataSet1.Active then
ClientDataSet1.Close;
ClientDataSet1.Open;
CheckBoxActive.Checked := True;
end;
C++
void __fastcall TForm1::ListBox1DblClick(TObject *Sender)
{
TStringList *FieldNamesList;
String SQLStmt;
int I;
// Activate appropriate controls now that table is selected.
CheckBoxActive->Enabled = true;
ButtonApply->Enabled = true;
TableName = ListBox1->Items->Strings[ListBox1->ItemIndex]; //get table name
// Get field (column) names for this table.
FieldNamesList = new TStringList();
FieldNamesList->Clear();
SQLConnection1->GetFieldNames(TableName, FieldNamesList);
// Construct SQL Select statement for all fields.
if (FieldNamesList->Count > 0)
{
SQLStmt = "select ";
for (I = 0; I < FieldNamesList->Count; I++)
{
if (I == 0)
SQLStmt = SQLStmt + FieldNamesList->Strings[I];
else
SQLStmt = SQLStmt + "," + FieldNamesList->Strings[I];
}
SQLStmt = SQLStmt + " from " + TableName;
}
else
// Can't find field names, so use '*'
SQLStmt = "select * from " + TableName;
delete FieldNamesList;
FieldNamesList = NULL;
// Set up SQL statement to get all table's data.
EditSQL->Text = SQLStmt;
// Set CommandText to SQL statement.
SQLDataSet1->CommandText = EditSQL->Text;
if (ClientDataSet1->Active)
ClientDataSet1->Close();
ClientDataSet1->Open();
CheckBoxActive->Checked = true;
}
Commentaires sur la gestion de la sélection d'une table
Maintenant que nous avons sélectionné une table de base de données, nous pouvons activer les contrôles de gestion des données.
Créons une liste de tous les noms de champ (aussi appelés colonnes) de la table. Nous les utilisons pour construire une instruction SQL SELECT
afin d'obtenir les données de tous les champs de la table.
Dès qu'une instruction SQL est formatée, nous plaçons l'instruction dans la propriété CommandText du composant TSQLConnection. Nous avons déjà défini DbxCommandType sur "Dbx.SQL" lors de la conception pour indiquer que le TSQLConnection utilise les commandes SQL.
Exécutez l'instruction SELECT
formatée en ouvrant le TClientDataSet, en le fermant s'il est déjà ouvert. Ceci entraîne l'affichage des données de la table dans le TDBGrid. Le TDBNavigator est à présent aussi actif.
Clic sur une cellule de table
L'application vous permet de visualiser les données de champ en cliquant sur une cellule TDBGrid. La valeur de la cellule s'affiche dans un TDBMemo sur une fiche distincte, que nous allons créer dans Ajouter une fiche de visualisation de cellules.
Double-cliquez sur l'événement OnCellClick
du composant TDBGrid pour générer le stub de ce gestionnaire d'événements. Ajoutez ensuite le code suivant :
Delphi
procedure TForm2.DBGrid1CellClick(Column: TColumn); //Column = table column clicked
begin
if ClientDataSet1.Active then
begin
// If the form isn't displayed, create it.
if not Assigned(MemoForm) then
begin
MemoForm := TFormCurrentField.Create(Self);
MemoForm.DBMemoCurrentField.DataSource := DataSource1; //set data source
end;
// Position form just below main dialog.
MemoForm.Top := Self.Top+Self.Height;
MemoForm.Left := Self.Left;
MemoForm.Visible := False;
MemoForm.Visible := True;
MemoForm.DBMemoCurrentField.DataField := Column.FieldName;
// Format caption with information on the field.
MemoForm.Caption := Format('Field Name: %s / Record Num: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]);
MemoForm.Width := Self.Width;
end;
end;
C++
void __fastcall TForm1::DBGrid1CellClick(TColumn *Column)
{
if (ClientDataSet1->Active)
{
// If the form isn't displayed, create it.
if (!MemoForm)
{
MemoForm = new TFormCurrentField(this);
MemoForm->DBMemoCurrentField->DataSource = DataSource1; //set data source
}
// Position form just below main dialog.
MemoForm->Top = this->Top + this->Height;
MemoForm->Left = this->Left;
MemoForm->Visible = false;
MemoForm->Visible = true;
MemoForm->DBMemoCurrentField->DataField = Column->FieldName;
// Format caption with information on the field.
//MemoForm->Caption = Format("Field Name: %s / Record Num: %d",[Column->FieldName, DBGrid1->DataSource->DataSet->RecNo]);
MemoForm->Caption.sprintf(L"Field Name: %s / Record Num: %d",Column->FieldName, DBGrid1->DataSource->DataSet->RecNo);
MemoForm->Width = this->Width;
}
}
Commentaires sur un clic sur une cellule de table
Cet événement est géré principalement en définissant les propriétés de la fiche, MemoForm
, qui est un objet TFormCurrentField
. Nous définirons TFormCurrentField
dans Ajouter une fiche de visualisation de cellules. En particulier, le gestionnaire définit les propriétés du composant TDBMemo sur la fiche. La propriété DataField contient le nom de la colonne. La définition de DataSource sur la source de données permet au TDBMemo d'afficher les données de champ réelles.
Précédent
Ecrire du code pour initialiser l'application