Développer du code pour gérer les événements principaux (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

Cette section contient le code de gestion des événements principaux associés aux composants de la fiche.

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

Suivant

Ecrire du code pour gérer les événements mineurs