Erstellen einer Rich-Client-Benutzeroberfläche (InterBase-Tutorial)

Aus RAD Studio
Wechseln zu: Navigation, Suche

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:

TutorialInterbase-MC-ClientForm.png


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.

  1. 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.
  2. 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.
  3. 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.

  1. 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.
  2. 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"
    
  3. 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.
    Verschieben Sie die Komponenten bei Bedarf, und passen Sie deren Größe an.
  4. 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".
  5. 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.
  6. 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:
    Delphi
    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.
  7. Wählen Sie Datei > Alles speichern, um alle Dateien zu speichern.
  8. 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: TutorialInterbase-MC-DBXEmpProj.png 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.
  9. 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:
    TutorialInterbase-MC-ClientAppRunning.png
    • 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.
    TutorialInterbase-MC-ClientAppRunningTable.png
    • 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:
    TutorialInterbase-MC-StoredProcData.png Damit ist die Ausführung der Client-Anwendung abgeschlossen.

    Zurück

    Erstellen eines Servers mit DataSnap

    Weiter

    Erstellen einer Web-Benutzeroberfläche