Erstellen einer Rich-Client-Benutzeroberfläche (InterBase-Tutorial)
Nach oben zu Tutorial: Eine InterBase-Datenbank in einer Delphi- oder C++-Anwendung verwenden
In diesem Abschnitt wird ein Client erstellt, der den Server verwendet. Der Client benutzt beide Funktionen des Servers:
- Aufrufen einer Stored Procedure und Rückgabe eines Wertes
- Anzeigen und Aktualisieren von Daten in einer Datenbanktabelle
Die folgende Abbildung zeigt das Formular der Client-Anwendung mit den Komponenten, die hinzugefügt werden:
Die visuellen Komponenten für die Interaktion befinden sich auf der linken Seite des Formulars. Die nicht-visuelle Komponenten für den Zugriff auf die Datenbank befinden sich auf der rechten Seite.
Führen Sie zum Erstellen der Client-Anwendung die folgenden Schritte aus.
- Um die Client-Anwendung in derselben Projektgruppe wie die Serveranwendung zu erstellen, klicken Sie die Projektgruppe in der Projektverwaltung mit der rechten Maustaste an und wählen Neues Projekt hinzufügen, oder wählen Sie Projekt > Neues Projekt hinzufügen.
- Das Dialogfeld Objektgalerie wird geöffnet.
- Delphi: Wählen Sie die Kategorie Delphi-Projekte und dann VCL-Formularanwendung.
- C++Builder: Wählen Sie die Kategorie C++Builder-Projekte und dann VCL-Formularanwendung.
- Klicken Sie auf OK. Wählen Sie das neue Formular aus, und setzen Sie im Objektinspektor die Eigenschaft Caption auf "Client demo". Wählen Sie Datei > Alles speichern, um die Dateien zu speichern:
- Delphi: Speichern Sie die Unit unter dem Namen Un_client_main.pas. Und das Projekt unter dem Namen ClientDemo.dproj.
- C++: Speichern Sie die Unit unter dem Namen Un_client_main.cpp. Und das Projekt unter dem Namen ClientDemo.cbproj.
- Führen Sie nun den Server aus, den Sie im vorherigen Abschnitt erstellt haben. Doppelklicken Sie in der Projektverwaltung auf ServerDemo.exe. Wählen Sie Start > Ohne Debugger ausführen. Sie können das angezeigte ServerForm-Dialogfeld minimieren.
Hinweis: Der Server muss ausgeführt werden, damit im nächsten Schritt eine Verbindung zum Server hergestellt und die DataSnap-Client-Klassen erzeugt werden können.
- Platzieren Sie eine TSQLConnection-Komponente auf dem neuen Formular, und legen Sie deren Eigenschaften fest:
- Setzen Sie die Eigenschaft Driver auf "Datasnap". Klicken Sie im Objektinspektor auf das
+
links neben der Eigenschaft Driver, um weitere Eigenschaften anzuzeigen:- Setzen Sie Port auf "211" (Vorgabe).
- Setzen Sie HostName auf "localhost" (Vorgabe).
- Diese Eigenschaften können auch durch Ändern der Eigenschaft Params gesetzt werden. Klicken Sie auf die Ellipsenschaltfläche (...) der Eigenschaft Params, um den Wertlisten-Editor zu öffnen. Sie können in dieses Dialogfeld die Eigenschaftswerte eingeben und dann auf OK klicken, um die Werte zu setzen.
- Setzen Sie LoginPrompt auf False, um zu verhindern, dass das Anmelde-Dialogfeld jedes Mal angezeigt wird, wenn der Client eine Verbindung zum Server herstellt.
- Setzen Sie Connected auf True.
- Klicken Sie, während der Server ausgeführt wird, mit der rechten Maustaste auf die TSQLConnection-Komponente, und wählen Sie DataSnap-Client-Klassen erzeugen aus dem Kontextmenü. Diese Aktion erzeugt eine neue Unit. Speichern Sie die neu erzeugte Unit, die die Client-Klassen enthält.
- Delphi: Speichern Sie die Unit unter dem Namen Un_client_classes.pas.
- C++: Speichern Sie die Unit unter dem Namen Un_client_classes.cpp.
- Speichern Sie die Änderungen in Un_client_main.
- Setzen Sie die Eigenschaft Driver auf "Datasnap". Klicken Sie im Objektinspektor auf das
- Verknüpfen Sie die Unit Un_client_classes mit Un_client_main.
- Delphi: Klicken Sie auf das Register Un_client_main, dann auf das Register Code und fügen Sie der
uses
-Klausel von Un_client_main den Eintrag Un_client_classes hinzu. - C++: Klicken Sie oben im Quelltext-Editor auf das Register Un_client_main.cpp und dann unten im Quelltext-Editor auf das Register Un_client_main.cpp. Fügen Sie die folgende include-Zeile nach den anderen "includes" in Un_client_main.cpp ein:
# include "Un_client_classes.h"
- Delphi: Klicken Sie auf das Register Un_client_main, dann auf das Register Code und fügen Sie der
- Erstellen Sie nun die Benutzeroberfläche, wie in der obigen Abbildung gezeigt. Klicken Sie im Un_client_main-Client auf das Register Design, und ziehen Sie die Komponenten aus der Tool-Palette auf das Formular an die in der Abbildung gezeigten Positionen:
- Ein TDBNavigator-Steuerelement zur Navigation in der Datenbank.
- Ein TDBGrid-Steuerelement zur Anzeige einer Datenbanktabelle.
- Drei TButton-Steuerelemente zum Laden der Datenbanktabelle, zum Aktualisieren der Datenbankdaten und zum Aufrufen der Stored Procedure. Setzen Sie die Eigenschaft Caption der TButton-Steuerelemente auf "Load R/W", "Apply updates" bzw. "Get project" wie in der Abbildung dargestellt.
- Ein TEdit-Steuerelement für die Mitarbeiternummer. Setzen Sie dessen Eigenschaft Text auf einen leeren Wert.
- Ein TLabel-Steuerelement zur Anzeige der Projekt-ID.
- Fügen Sie die Datenbankkomponenten für den Zugriff auf die Stored Procedure der Datenbank hinzu, und verknüpfen Sie diese Komponenten miteinander.
- Platzieren Sie eine TSqlServerMethod-Komponente auf dem Formular.
- Setzen Sie die Eigenschaft SQLConnection im Dropdown-Menü auf "SQLConnection1".
- Setzen Sie die Eigenschaft ServerMethodName. Wenn der Server ausgeführt wird, werden im Dropdown-Menü der Eigenschaft alle verfügbaren Servermethoden angezeigt. Wählen Sie "TDSServerModule1.callStoredProcedure" aus. Das ist die Funktion auf dem Server, die die Stored Procedure aufruft.
- Setzen Sie Active nicht auf True. Sie erhalten sonst eine Fehlermeldung, weil die Stored Procedure keine Datenmenge zurückgibt.
- Ziehen Sie eine TDataSetProvider-Komponente auf das Formular.
- Setzen Sie die Eigenschaft DataSet im Dropdown-Menü auf "SQLServerMethod1".
- Platzieren Sie eine TClientDataSet-Komponente auf dem Formular.
- Setzen Sie die Eigenschaft ProviderName im Dropdown-Menü auf "DataSetProvider1".
- Ziehen Sie eine TDataSource-Komponente auf das Formular.
- Setzen Sie die Eigenschaft DataSet im Dropdown-Menü auf "ClientDataSet1".
- Platzieren Sie eine TSqlServerMethod-Komponente auf dem Formular.
- Fügen Sie die Datenbankkomponenten für den Lese-/Schreibzugriff auf die Datenmenge hinzu.
- Ziehen Sie eine TDSProviderConnection-Komponente auf das Formular. Diese Provider-Komponente ermöglicht das Navigieren in der Datenbank sowie das Aktualisieren der Datenbank.
- Setzen Sie die Eigenschaft SQLConnection im Dropdown-Menü auf "SQLConnection1".
- Setzen Sie die Eigenschaft ServerClassName auf "TDSServerModule1".
Hinweis: TDSServerModule1 ist die Servermodulklasse in Un_ServerModule.
- Platzieren Sie eine weitere TClientDataSet-Komponente auf dem Formular.
- Setzen Sie im Dropdown-Menü deren Eigenschaft RemoteServer auf "DSProviderConnection1".
- Setzen Sie die Eigenschaft ProviderName im Dropdown-Menü auf "ServerDataSetProvider1".
- Ziehen Sie eine weitere TDataSource-Komponente auf das Formular.
- Setzen Sie die Eigenschaft DataSet im Dropdown-Menü auf "ClientDataSet2".
- Verbinden Sie die Komponenten TDBGrid und TDBNavigator mit der Datenquelle, indem Sie die Eigenschaft DataSource der beiden Komponenten auf "DataSource2" setzen.
- Testen Sie die Verbindungen.
- Setzen Sie die Eigenschaft Active der TClientDataSet-Komponente ClientDataSet2 auf True. Die TDBGrid-Komponente sollte nun aktiv werden und die Daten der Tabelle EMPLOYEE aus der Datenbank anzeigen.
- Setzen Sie die Eigenschaft Active von ClientDataSet2 wieder auf False. Die Client-Anwendung setzt ClientDataSet2 auf True, um die Datenbankverbindung in der Ereignisbehandlungsroutine zu aktivieren, die als Nächstes hinzugefügt wird.
- Fügen Sie das Klick-Ereignis für die Schaltfläche "Load R/W" (TButton) hinzu. Wählen Sie diese Schaltfläche aus, und doppelklicken Sie auf der Registerkarte Ereignisse des Objektinspektors auf das Ereignis
OnClick
, um den Skeleton-Code zu erzeugen. Fügen Sie die folgende Codezeile hinzu, um die TClientDataSet-Komponente in der Ereignisbehandlungsroutine zu aktivieren:
Delphi
procedure TForm2.Button3Click(Sender: TObject); begin ClientDataSet2.Active := true; end;
C++
void __fastcall TForm2::Button1Click(TObject *Sender) { ClientDataSet2->Active = true; }
- Fügen Sie auf dieselbe Weise die
OnClick
-Ereignisbehandlungsroutine für die Schaltfläche "Apply updates" (TButton) hinzu. Erzeugen Sie das Skeleton für die Ereignisbehandlungsroutine wie oben, und fügen Sie diesen Code hinzu:
Delphi
procedure TForm2.Button4Click(Sender: TObject); begin ClientDataSet2.ApplyUpdates(0); end;
C++
void __fastcall TForm2::Button2Click(TObject *Sender) { ClientDataSet2->ApplyUpdates(0); }
- Der Parameter für
ApplyUpdates
ist die Anzahl der Fehler, die toleriert werden soll, in diesem Fall Null.
- Ziehen Sie eine TDSProviderConnection-Komponente auf das Formular. Diese Provider-Komponente ermöglicht das Navigieren in der Datenbank sowie das Aktualisieren der Datenbank.
- Richten Sie den Aufruf der Stored Procedure ein.
- Erstellen Sie ein Skeleton für die Ereignisbehandlungsroutine des Ereignisses
OnClick
der Schaltfläche "Get project" (TButton). Wird auf diese TButton-Komponente geklickt, wird die auf dem Server definierte Methode aufgerufen. Weil die Stored Procedure einen Integerwert übernimmt, muss der Text im TEdit-Feld für die Mitarbeiternummer in einen Integerwert konvertiert werden. Der folgende Code für die Ereignisbehandlungsroutine führt dies aus:
procedure TForm2.Button1Click(Sender: TObject); var mykey : Integer; //Variable, die den Text aus dem Eingabefeld aufnimmt myServer : TDSServerModule1Client; //Server-Proxy, der aufgerufen wird begin mykey := StrToInt(Edit1.Text); //Umwandlung in einen Integerwert SQLConnection1.Open; // Servererstellung mit SQLConnection für die Kommunikation myServer := TDSServerModule1Client.Create(SQLConnection1.DBXConnection); try // Aufruf der Methode, die die Stored Procedure mit dem Schlüssel aufruft. // Label auf den von der Stored Procedure zurückgegebenen Wert setzen. Label1.Caption := myServer.callStoredProcedure(mykey); finally if SQLConnection1.Connected then SQLConnection1.Close; myServer.Free; //Server freigeben end; end;
C++
void __fastcall TForm2::Button3Click(TObject *Sender) { int mykey; //Variable, die den Text aus dem Eingabefeld aufnimmt TDSServerModule1Client *myServer; //Server-Proxy, der aufgerufen wird mykey = StrToInt(Edit1->Text); //Umwandlung in einen Integerwert SQLConnection1->Open(); // Servererstellung mit SQLConnection für die Kommunikation myServer = new TDSServerModule1Client(SQLConnection1->DBXConnection); try { // Aufruf der Methode, die die Stored Procedure mit dem Schlüssel aufruft. // Label auf den von der Stored Procedure zurückgegebenen Wert setzen. Label1->Caption = myServer->callStoredProcedure(mykey); } __finally { if (SQLConnection1->Connected) SQLConnection1->Close(); delete myServer; //Server freigeben } }
- Beachten Sie bitte, dass der obige Quellcode die Eigenschaft Caption des TLabel-Steuerelements auf den von der Stored Procedure zurückgegebenen Wert setzt: die Projekt-ID.
- Erstellen Sie ein Skeleton für die Ereignisbehandlungsroutine des Ereignisses
- Wählen Sie Datei > Alles speichern, um alle Dateien zu speichern.
- Rufen Sie Datenbankinformationen aus der Tabelle EMPLOYEE_PROJECT ab.
Bevor die Client-Anwendung ausgeführt werden kann, müssen Informationen aus der Datenbanktabelle ermittelt werden. Erweitern Sie im Daten-Explorer den Knoten der INTERBASE-Verbindung und dann darunter den Konten der EMPLOYEE-Verbindung. Erweitern Sie darunter den Knoten "Tabellen". Klicken Sie mit der rechten Maustaste auf EMPLOYEE_PROJECT, und wählen Sie Daten aus Tabelle abrufen, um die Daten dieser Tabelle anzuzeigen:
Notieren Sie sich einige der in der Spalte EMP_NO aufgeführten Werte. Die Stored Procedure GET_EMP_PROJ, die verwendet wird, greift auf die Tabelle EMPLOYEE_PROJECT zu. Um Daten aus dieser Tabelle mit der Stored Procedure abzurufen, benötigen Sie gültige Mitarbeiternummern.
- Erzeugen Sie das Client-Projekt, und führen Sie es aus.
- Erzeugen Sie das Client-Projekt, indem Sie in der Projektverwaltung mit der rechten Maustaste auf ClientDemo klicken und Erzeugen auswählen. Beheben Sie etwaige Fehler.
- Führen Sie die Client-Anwendung aus. Das folgende Dialogfeld wird angezeigt:
- Klicken Sie auf die Schaltfläche "Load R/W" (TButton). Dadurch wird die Datenmenge "ClientDataSet2" (TClientDataSet) aktiviert. Das TDBGrid-Steuerelement wird mit den Einträgen aus der Tabelle EMPLOYEE gefüllt. Das Steuerelement TDBNavigator wird ebenfalls aktiviert, und Sie können damit durch die Tabelleneinträge navigieren.
- Im TDBGrid können Sie eine Zelle auswählen und deren Wert ändern. Durch Klicken auf "Apply updates" (TButton) wird die Datenbanktabelle mit der Änderung aktualisiert.
- Testen Sie nun die Stored Procedure. Geben Sie in das Steuerelement TEdit eine gültige Mitarbeiternummer ein, und klicken Sie auf "Get project" (TButton). Das TLabel-Steuerelement unterhalb des TButton-Steuerelements sollte nun die entsprechende Projekt-ID aus der Tabelle EMPLOYEE_PROJECT anzeigen:
Damit ist die Ausführung der Client-Anwendung abgeschlossen.
Zurück
Erstellen eines Servers mit DataSnap
Weiter