Einzelnen Beitrag anzeigen

wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 11:07
Wenn du das etwas umstrukturierst, dann wird das auch übersichtlicher und besser dokumentiert:

In TForm3 folgendes rein:
Delphi-Quellcode:
  // Wir wollen etwas in die StatusBar schreiben
  procedure TForm3.SetStatus( const AText : string );
    begin
      StatusBar.SimpleText := AText;
      StatusBar.Refresh;
    end;

  procedure TForm3.SpeedButton9Click( Sender : TObject );
    begin
      EditDBPath.Text := g_DBPfad + '\My_IB_DB.gdb';
      // Das DataModule kümmert sich um die Anlage der Datenbank
      // Um StatusMeldungen an die Form zu liefern, nehmen wir die Methode SetStatus als Callback ;o)
      DataModule2.CreateDataBase( EditDBPath.Text, EditUserName.Text, EditPassword.Text, SetStatus );
    end;
In TDataModule2 werden die Methoden CreateDatabase und CreateTables angelegt
Delphi-Quellcode:
  // Eine Callback-Methode für Status-Meldungen
  type
    TStatusCallback = procedure( const AStatus : string ) of object;

  procedure TDataModule2.CreateTables( StatusCallback : TStatusCallback );
    begin
      // whatever
    end;

  procedure TDataModule2.CreateDataBase( const DBPath, Username, Password : string; StatusCallback : TStatusCallback );
    const
      cCreateTxt = ' %d. Versuch: Datenbank wird erstellt...';
      cReadyTxt = 'Datenbank wurde erstellt!';
      cFailureText = 'Datenbank konnte nicht erstellt werden!';
    begin
      if FileExists( DBPath )
      then
        // Keine Meldung ausgeben, sondern eine Exception
        // Dadurch kommt die Meldung eh ;o)
        raise Exception.CreateFmt( 'Die Datenbank "%s" existiert schon', DBPath );

      Screen.Cursor := crHourGlass;
      try
        IBD.LoginPrompt := FALSE;
        IBD.Connected := FALSE;
        IBD.Params.Clear;

        // StatusMeldung (Callback-Methode aufrufen)
        StatusCallback( Format( cCreateTxt, [1] ) );

        try

          IBD.DatabaseName := DBPath;
          IBD.Params.Add( Format( 'USER "%s"', [Username] ) );
          IBD.Params.Add( Format( 'PASSWORD "%s"', [Password] ) );
          IBD.SQLDialect := 1;
          IBD.Params.Add( 'PAGE_SIZE 4096' );
          IBD.Params.Add( 'DEFAULT CHARACTER SET ISO8859_1' );
          IBD.CreateDataBase;

          // StatusMeldung (Callback-Methode aufrufen)
          StatusCallback( cReadyTxt );

          // Tables_anlegen; // Tabellen werden angelegt
          CreateTables( StatusCallback );

        except
          on E : Exception do
            begin
              if FileExists( DBPath )
              then
                DeleteFile( DBPath );

              // StatusMeldung (Callback-Methode aufrufen)
              StatusCallback( cFailureText );

              raise;
            end;
        end;

      finally
        Screen.Cursor := crDefault;
      end;
    end;
Und damit ist in TForm3.SpeedButton9Click auf einen Blick klar, was da passiert -> Es wird eine Datenbank angelegt (Documentation by Code). Vorher musste man sich erst durch den Quellcode wühlen, um das festzustellen.
Lieber Sir Rufo, der SourceCode stammt fast 1:1 von Andreas Kosch (Datenbankentwicklung mit Interbase - S.338-339). Bisher hatte ich an dem Buch wenig auszusetzten.
Dennoch vielen Dank für Deine Anregungen.
Meine eigentliche Frage ist aber immer noch nicht beantwortet worden !
Wolfgang
  Mit Zitat antworten Zitat