Schreiben des Quellcodes zur Behandlung von Unterereignissen (dbExpress-Tutorial)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Tutorial: Mit dbExpress Datenbanken in einer Anwendung anzeigen und aktualisieren

Im Folgenden erstellen Sie Behandlungsroutinen für die übrigen Ereignisse.

Klicken auf das Kontrollkästchen "Open"

Wählen Sie die TCheckBox-Komponente aus, und doppelklicken Sie auf der Registerkarte Ereignisse im Objektinspektor auf das Ereignis OnClick. Fügen Sie folgenden Quelltext hinzu:

Delphi

procedure TForm2.CheckBoxActiveClick(Sender: TObject);
begin
  // Wenn ausgewählt, die Client-Datenmenge aktivieren; wenn nicht, die Client-Datenmenge deaktivieren.
  ClientDataSet1.Active := CheckBoxActive.Checked
end;

C++

void __fastcall TForm1::CheckBoxActiveClick(TObject *Sender)
{
  // Wenn ausgewählt, die Client-Datenmenge aktivieren; wenn nicht, die Client-Datenmenge deaktivieren.
  ClientDataSet1->Active = CheckBoxActive->Checked;
}

Das Aktivieren der TClientDataSet-Komponente bewirkt, dass die SQL-Anweisung in der TEdit-Komponente (mit Namen SQL:) ausgeführt wird. Siehe den Abschnitt Änderung der SQL-Anweisung weiter unten für nähere Informationen.

Schließen der Datenmenge (TClientDataSet)

Dieses Ereignis wird kurz vor dem Schließen der Datenmenge (TClientDataSet) ausgelöst. Die Datenmenge wird geschlossen, wenn eine andere Tabelle ausgewählt wird.

Durch Klicken auf eine Tabellenzelle werden Daten aus der Zelle in einem Formular (MemoForm, ein TFormCurrentField-Objekt) angezeigt. Definieren Sie TFormCurrentField im Abschnitt Hinzufügen eines Formulars zum Anzeigen des Zellinhalts. Diese Ereignisbehandlungsroutine gibt das TFormCurrentField-Objekt frei.

Erzeugen Sie einen Stub für die Ereignisbehandlungsroutine, wie gewöhnlich durch Doppelklicken auf das Ereignis BeforeClose für die TClientDataSet-Komponente.

Delphi

procedure TForm2.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
  // Falls ein Formular für die Anzeige der Tabellenzelle vorhanden ist, wird es freigegeben.
  if Assigned(MemoForm) then
  begin
    MemoForm.DBMemoCurrentField.DataField := '';
    if MemoForm.Visible then
      MemoForm.Close;
  end;
end;

C++

void __fastcall TForm1::ClientDataSet1BeforeClose(TDataSet *DataSet)
{
  // Falls ein Formular für die Anzeige der Tabellenzelle vorhanden ist, wird es freigegeben.
  if (MemoForm)
  {
MemoForm->DBMemoCurrentField->DataField = "";
if (MemoForm->Visible)
      MemoForm->Close();
  }
}

Klicken auf die Schaltfläche "Apply Updates"

Durch Klicken auf die TButton-Schaltfläche Apply Updates werden Aktualisierungen in die Datenbank übernommen, d.h. die geänderten Datensätze werden in die Datenbank zurückgeschrieben. Obwohl diese Aktualisierung durch den Aufruf von TClientDataSet.ApplyUpdates erreicht wird, führt eigentlich die TDataSetProvider-Komponente die Aktualisierung der Datenmenge durch. Siehe die Bemerkungen im Abschnitt Hinzufügen von Datenbankkomponenten für die Komponente TDataSetProvider.

Doppelklicken Sie auf das Ereignis OnClick der TButton-Schaltfläche Apply Updates, und fügen Sie diesen Code in das erzeugte Skeleton ein.

Delphi

procedure TForm2.ButtonApplyClick(Sender: TObject);
var
  X, Y: Integer;
begin
  // Die Aktualisierung der Client-Datenmenge wird vom Provider ausgeführt.
  ClientDataSet1.ApplyUpdates(-1);
  Y := Self.Top + Self.ButtonApply.Top;
  X := Self.Left + Self.ButtonApply.Left;

  // Benutzer fragen, ob die Daten im Gitter aktualisiert werden sollen.
  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;

  // Die Aktualisierung der Client-Datenmenge wird vom Provider ausgeführt.
  ClientDataSet1->ApplyUpdates(-1);
  Y = this->Top + this->ButtonApply->Top;
  X = this->Left + this->ButtonApply->Left;

  // Benutzer fragen, ob die Daten im Gitter aktualisiert werden sollen.
  if (MessageDlgPos("Refresh?",mtCustom, mbYesNo, 0, X, Y) == mrYes)
  {
ClientDataSet1->Close();
ClientDataSet1->Open();
  }
}

Tipp: Anstelle dieser Schaltfläche können Sie die Schaltflächen ApplyUpdates und CancelUpdates des Vcl.DBCtrls.TDBNavigator-Steuerelements verwenden.

Änderungen im TEdit-Filter

Wenn sich der Text in dem TEdit-Steuerelement, das den Filter enthält, ändert, ändert sich auch die Liste der Tabellen im TListBox-Steuerelement. PopulateListBox ist eine Hilfsfunktion, die die aktuell gefilterten Tabellen in dem TListBox-Steuerelement anzeigt.

Doppelklicken Sie auf das Ereignis OnChange des TEdit-Filtersteuerelements, um den Stub zu erzeugen, und fügen Sie dann den folgenden Code hinzu.

Delphi

procedure TForm2.EditFilterChange(Sender: TObject);
begin
  if SQLConnection1.Connected then
    PopulateListBox;  //Tabellenlistenfeld entsprechend des neuen Filtertexts erneut füllen
end;

C++

void __fastcall TForm1::EditFilterChange(TObject *Sender)
{
  if (SQLConnection1->Connected)
PopulateListBox();  //Tabellenlistenfeld entsprechend des neuen Filtertexts erneut füllen
}

Aktivieren und Deaktivieren des TEdit-Filters

Die Ereignisse OnEnter und OnExit beziehen sich auf das Aktivieren bzw. Deaktivieren (Erhalten des Fokus und Verlieren des Fokus) des TEdit-Steuerelements (das den Filtertext enthält). Fügen Sie die benötigten Skeletons für die TEdit-Ereignisbehandlungsroutinen, wie oben beschrieben, und dann den folgenden Code hinzu:

Delphi

procedure TForm2.EditFilterEnter(Sender: TObject);
begin
  // Leerer Text, wenn das Feld aktiviert ist.
  EditFilter.Text := '';
end;
procedure TForm2.EditFilterExit(Sender: TObject);
begin
  // Wenn leer und das Feld deaktiviert ist, Text des ursprünglichen Hinweises anzeigen.
  if EditFilter.Text = '' then
    EditFilter.Text := 'Filter (* as wild)';
end;

C++

void __fastcall TForm1::EditFilterEnter(TObject *Sender)
{
  // Leerer Text, wenn das Feld aktiviert ist.
  EditFilter->Text = "";
}
void __fastcall TForm1::EditFilterExit(TObject *Sender)
{
  // Wenn leer und das Feld deaktiviert ist, Text des ursprünglichen Hinweises anzeigen.
  if (EditFilter->Text == "")
EditFilter->Text = "Filter (* as wild)";
}

Änderungen der SQL-Anweisung

Wenn sich der Text im TEdit-Steuerelement mit der SQL-Anweisung ändert, soll auch der Text der SQL-Anweisung für die TSQLDataSet-Komponente aktualisiert werden. Ist das TCheckBox-Kontrollkästchen Open aktiviert, wird die TClientDataSet-Komponente mit dem Ergebnis aktiviert, dass die neue SQL-Anweisung ausgeführt wird und die Datenbankdaten aktualisiert werden. Sie können die SQL-Anweisung ändern und dann das TCheckBox-Kontrollkästchen aktivieren, um die Anweisung auszuführen.

Doppelklicken Sie auf das Ereignis OnChange der TEdit-Komponente für die SQL-Anweisung, und fügen Sie diesen Code hinzu.

Delphi

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

C++

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

Ereignis für die Freigabe des Formulars

Wenn die Anwendung beendet wird, müssen einige Bereinigungen durchgeführt werden: Schließen der Datenbankverbindung und Freigabe der nicht mehr benötigten Objekte. Wählen Sie das Formular aus, und doppelklicken Sie dann im Objektinspektor auf das Ereignis OnDestroy. Fügen Sie den Code für dieses Ereignis hinzu.

Delphi

procedure TForm2.FormDestroy(Sender: TObject);
begin
  // Die Verbindung schließen.
  if SQLConnection1.Connected then
    SQLConnection1.Close;
  // Objekte freigeben.
  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)
{
  // Die Verbindung schließen.
  if (SQLConnection1->Connected)
SQLConnection1->Close();

  // Objekte freigeben.
  if (FMetaDataProvider)
  {
delete FMetaDataProvider;
FMetaDataProvider = NULL;
  }
  if (MemoForm)
  {
delete MemoForm;
MemoForm = NULL;
  }
  if (AllTables)
  {
delete AllTables;
AllTables = NULL;
  }
}

Zurück

Entwickeln des Quellcodes zur Behandlung von Hauptereignissen

Weiter

Schreiben des Quellcodes für Hilfsroutinen