Announcement

Collapse
No announcement yet.

ExtractFilePath(ParamStr(0)) für 4 Datenmodule anwenden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ExtractFilePath(ParamStr(0)) für 4 Datenmodule anwenden

    Hallo Liebe Delphi-Gemeinde!

    Mein Programm arbeitet mit 4 Datenmodulen und 4 DB-Grids. Es funktioniert soweit auch alles. Das Ding ist jetzt, wenn man das Programm auf einem anderen PC ausführt, dann muss die Turbo-DB - .tdbd - Datei wie bei meinem PC im gleichen Pfad liegen (E:\db\...), das tut Sie aber meistens auf einem anderen System nicht.

    Bei einem einzigen Datenmodul hatt ich das bisher so gemacht:
    Code:
    procedure TForm1.FormCreate(Sender: TObject, Anzahl): integer;
     var dbfrm: string;
    
    begin
     dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
    
    FormCreate.TdbTable1.Active := False;
     try
      FormCreate.TdbTable1.DatabaseName := dbfrm;
      FormCreate.TdbTable1.TableName := 'pr';
      FormCreate.TdbTable1.Active := True;
     except
      MessageBeep(0);
      ShowMessage('Die Tabelle db.tdbd befindet' + #10#13 +'sich nicht im angegebenen Verzeichnis!')
    
     end
    
    end;
    jetzt ist mein Problem, dass ich ja 4 Datenmodule benutze. Jetzt hatte ich mir das mit meinem Freund, der FOR-Schleife, zu lösen und zwar ungefähr so:

    Code:
    procedure TForm1.FormCreate(Sender: TObject, Anzahl): integer;
     var dbfrm: string;
     var Anzahl: integer;
     var i: integer;
    begin
     Anzahl:=4;
    
     for i:=1 to Anzahl do
    
     dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
    
    FormCreate.TdbTable1.Active := False;
     try
      FormCreate.TdbTable1.DatabaseName := dbfrm;
      FormCreate.TdbTable1.TableName := 'pr';
      FormCreate.TdbTable1.Active := True;
     except
      MessageBeep(0);
      ShowMessage('Die Tabelle db.tdbd befindet' + #10#13 +'sich nicht im angegebenen Verzeichnis!')
     end
    
    end;
    jetzt sehe ich aber den Wald vor lauter Bäumen nicht mehr. Kann mir jemand helfen biddö... dangge.

  • #2
    Hallo,
    kann es sein, dass das Problem in der Verwendung von ParamStr(0) liegt?
    Wenn in einer Ordnerbezeichnung ein Leerzeichen vorkommt (z.B. "Program Files"), dann beginnt an dieser stelle nämlich schon der ParamStr(1).
    Evtl. wäre es an dieser Stelle besser CmdLine abzufragen (ist allerdings plattformspezifisch).
    Gruß
    Jens

    Comment


    • #3
      Hallo!

      @Jens:
      Nicht richtig. Es wird immer der komplette Pfad samt der Exe in paramstr(0) wiedergegeben...

      @Idan:
      Setz das Ganze doch in die Create Methode des Datenmoduls. Dann brauchst Du auch keine For Schleife!
      Wenn man den Pfad gleich in die Registry schreibt ist das Ganze noch komfortabler. Dann kann ich die Daten auch auf einem anderen Laufwerk haben...

      Man kann auch Datenmodule vererben! Also ein Basisdatenmodul mit der PfadSetzen Methode erzeugen und alle anderen Datenmodule davon ableiten.
      Diese Vorgehensweise empfiehlt sich ab dem zweiten Datenmodul im Projekt immer. Und wenns dann statt 4 mal 40 Datenmodule werden gibts Du mir bestimmt ein Bierchen aus

      BYE BERND

      Comment


      • #4
        so, jetzt habe ich das wie folgt im 1. Datenmodul angewendet:

        Code:
        unit u_dm1;
        
        interface
        
        uses
          SysUtils, Classes, DB, TdbQuery, TdbDataSet, TdbLicense;
        
        type
          TDataModule1 = class(TDataModule)
            TdbTable1: TTdbTable;
            DataSource1: TDataSource;
            procedure DataModuleCreate(Sender: TObject);
          private
            { Private-Deklarationen }
          public
            { Public-Deklarationen }
          end;
        
        var
          DataModule1: TDataModule1;
          TdbTable1: TTdbTable;
         
        implementation
        
        {$R *.dfm}
        
        procedure TDataModule1.DataModuleCreate(Sender: TObject);
        var dbfrm: string;
        begin
        dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
        self.TdbTable1.Active := False;
        self.TdbTable1.DatabaseName := dbfrm;
        self.TdbTable1.TableName := 'pr';
        self.TdbTable1.Active := True;
        end;
        end.
        Compiliert auch ohne Fehler, nur die Daten werden im DB-Grid nicht angeziegt. Hab ich noch was fundamentales vergessen?

        Comment


        • #5
          Hallo!

          Ergänz doch mal:

          self.TdbTable1.Active := True;
          if not TdbTable1.active then begin
          showmessage ( 'Nicht aktiv!')
          end
          else begin
          showmessage ( 'Aktiv! ' + inttostr(TdbTable1.recordcount));
          end;
          end;

          Und was tut sich?

          BYE BERND

          Comment


          • #6
            hi Bernd,

            da tut sich leider gar nichts *grübel

            Code:
            unit u_dm1;
            
            interface
            
            uses
              QDialogs, SysUtils, Classes, DB, TdbQuery, TdbDataSet, TdbLicense;
            
            type
              TDataModule1 = class(TDataModule)
                TdbTable1: TTdbTable;
                DataSource1: TDataSource;
                procedure DataModuleCreate(Sender: TObject);
              private
                { Private-Deklarationen }
              public
                { Public-Deklarationen }
              end;
            
            var
              DataModule1: TDataModule1;
              TdbTable1: TTdbTable;
              
            implementation
            
            {$R *.dfm}
            
            procedure TDataModule1.DataModuleCreate(Sender: TObject);
             var dbfrm: string;
            begin
             dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
             self.TdbTable1.Active := False;
             self.TdbTable1.DatabaseName := dbfrm;
             self.TdbTable1.TableName := 'pr';
             self.TdbTable1.Active := True;
             if not self.TdbTable1.active then begin
             showmessage('Nicht aktiv!')
             end
             else begin
             showmessage('Aktiv! ' + inttostr(self.TdbTable1.recordcount));
             end;
             end;
            end.

            Comment


            • #7
              Hallo!

              Garnichts => eine nicht behandelte Exception scheint die Ursache zu sein.

              self.TdbTable1.Active := True;

              Ersetzen durch

              try
              self.TdbTable1.Active := True;
              except
              on e:exception do begin
              showmessage ( 'Das ging schief:' +#13+ e.message );
              end;
              end;

              BYE BERND

              Comment


              • #8
                habe das ganze nun so geschrieben, lässt sich compilieren, startet auch, aber keine Meldung erscheint.
                Code:
                unit u_dm1;
                
                interface
                
                uses
                  Messages, SysUtils, QDialogs, Classes, TdbTable, TdbQuery, TdbDataSet, TdbLicense,
                  DB;
                
                type
                  TDataModule1 = class(TDataModule)
                    TdbTable1: TTdbTable;
                    DataSource1: TDataSource;
                    procedure DataModuleCreate(Sender: TObject);
                  private
                    { Private-Deklarationen }
                  public
                    { Public-Deklarationen }
                  end;
                
                var
                  DataModule1: TDataModule1;
                  TdbTable1: TTdbTable;
                  
                implementation
                
                {$R *.dfm}
                
                procedure TDataModule1.DataModuleCreate(Sender: TObject);
                 var dbfrm: string;
                begin
                 dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
                 self.TdbTable1.Active := False;
                 self.TdbTable1.DatabaseName := dbfrm;
                 self.TdbTable1.TableName := 'pr';
                 try
                  self.TdbTable1.Active := True;
                 except
                  on e:exception do begin
                  showmessage ( 'Das ging schief:' +#13+ e.message );
                  end;
                 end;
                 if not self.TdbTable1.active then begin
                  showmessage('Nicht aktiv!')
                 end
                  else begin
                   showmessage('Aktiv! ' + inttostr(self.TdbTable1.recordcount));
                  end;
                 end;
                end.

                Comment


                • #9
                  OK Ende

                  Auf
                  dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';

                  einen Haltepunkt setzen Debugger anwerfen und Schritt für Schritt durchgehen, was gemacht wird.

                  BYE BERND

                  Comment


                  • #10
                    habe ich gemacht, er gibt aber immer noch keine Meldung/Exception aus, sondern das Propramm startet ganz normal:
                    Code:
                    program ReQuest;
                    
                    uses
                      Forms,
                      u_form1 in 'u_form1.pas' {Form1},
                      u_dm1 in 'u_dm1.pas' {DataModule1: TDataModule},
                      u_dm2 in 'u_dm2.pas' {DataModule2: TDataModule},
                      u_dm3 in 'u_dm3.pas' {DataModule3: TDataModule},
                      u_dm4 in 'u_dm4.pas' {DataModule4: TDataModule};
                    
                    {$R *.res}
                    
                    begin
                      Application.Initialize;
                      Application.Title := 'ReQuest V1.0';
                      Application.CreateForm(TForm1, Form1);
                      Application.CreateForm(TDataModule1, DataModule1);
                      Application.CreateForm(TDataModule2, DataModule2);
                      Application.CreateForm(TDataModule3, DataModule3);
                      Application.CreateForm(TDataModule4, DataModule4);
                      Application.Run;
                    end.
                    Code:
                    unit u_dm1;
                    
                    interface
                    
                    uses
                      Messages, SysUtils, Variants, Dialogs, ExtCtrls, Classes,
                      TdbLicense, TdbTable, TdbQuery, TdbDataSet, DB;
                    
                    type
                      TDataModule1 = class(TDataModule)
                        TdbTable1: TTdbTable;
                        DataSource1: TDataSource;
                        procedure DataModuleCreate(Sender: TObject);
                      private
                        { Private-Deklarationen }
                      public
                        { Public-Deklarationen }
                      end;
                    
                    var
                      DataModule1: TDataModule1;
                      TdbTable1: TTdbTable;
                      
                    implementation
                    
                    {$R *.dfm}
                    
                    procedure TDataModule1.DataModuleCreate(Sender: TObject);
                     var dbfrm: string;
                    begin
                     dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
                     self.TdbTable1.Active := False;
                     self.TdbTable1.DatabaseName := dbfrm;
                     self.TdbTable1.TableName := 'pr';
                     try
                      self.TdbTable1.Active := True;
                     except
                      on e:exception do begin
                      ShowMessage('Das ging schief:' +#13+ e.message);
                      end;
                     end;
                     if not self.TdbTable1.active then begin
                      ShowMessage('Nicht aktiv!')
                     end
                      else begin
                       ShowMessage('Aktiv! ' + inttostr(self.TdbTable1.recordcount));
                      end;
                     end;
                    end.
                    ich blicks einfach nicht... sorry

                    Comment


                    • #11
                      Hmmm, sorry aber ich hege den leichten Verdacht, dass Du mit dem Debugger nicht richtg umgehst...

                      Setz doch mal als erste UND letzte Zeil in der Create Methode des Datenmoduls ein Showmessages ('Hallo da bin ich!') ein.

                      Dann mal das gesamte Projekt erzeugen nicht nur kompilieren.

                      So jetzt MUSS aber mindestens ein "Hallo da bin ich!" kommen...

                      BYE BERND

                      Comment


                      • #12
                        kommt aber auch nichts:
                        Code:
                        procedure TDataModule1.CreateDataModule(Sender: TObject);
                         var dbfrm: string;
                        begin
                        Showmessage('Hallo da bin ich!');
                         dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
                         self.TdbTable1.Active := False;
                         self.TdbTable1.DatabaseName := dbfrm;
                         self.TdbTable1.TableName := 'pr';
                         try
                          self.TdbTable1.Active := True;
                         except
                          on e:exception do begin
                          ShowMessage('Das ging schief:' +#13+ e.message);
                          end;
                         end;
                         if not self.TdbTable1.active then begin
                          ShowMessage('Nicht aktiv!');
                         end
                          else begin
                           ShowMessage('Aktiv! ' + inttostr(self.TdbTable1.recordcount));
                          end;
                        Showmessage('Hallo da bin ich!'); 
                         end;

                        Comment


                        • #13
                          Bitte prüf doch mal im Objektinspektor, ob die Methode wirklich in das Create des Datenmoduls eingebunden ist...

                          Erzeugst Du denn die Datenmodule?

                          BYE BERND

                          Comment


                          • #14
                            Originally posted by ldan View Post
                            Hallo Liebe Delphi-Gemeinde!

                            Mein Programm arbeitet mit 4 Datenmodulen und 4 DB-Grids. Es funktioniert soweit auch alles. Das Ding ist jetzt, wenn man das Programm auf einem anderen PC ausführt, dann muss die Turbo-DB - .tdbd - Datei wie bei meinem PC im gleichen Pfad liegen (E:\db\...), das tut Sie aber meistens auf einem anderen System nicht.

                            Bei einem einzigen Datenmodul hatt ich das bisher so gemacht:
                            Code:
                            procedure TForm1.FormCreate(Sender: TObject, Anzahl): integer;
                             var dbfrm: string;
                            
                            begin
                             dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
                            
                            FormCreate.TdbTable1.Active := False;
                             try
                              FormCreate.TdbTable1.DatabaseName := dbfrm;
                              FormCreate.TdbTable1.TableName := 'pr';
                              FormCreate.TdbTable1.Active := True;
                             except
                              MessageBeep(0);
                              ShowMessage('Die Tabelle db.tdbd befindet' + #10#13 +'sich nicht im angegebenen Verzeichnis!')
                            
                             end
                            
                            end;
                            jetzt ist mein Problem, dass ich ja 4 Datenmodule benutze. Jetzt hatte ich mir das mit meinem Freund, der FOR-Schleife, zu lösen und zwar ungefähr so:

                            Code:
                            procedure TForm1.FormCreate(Sender: TObject, Anzahl): integer;
                             var dbfrm: string;
                             var Anzahl: integer;
                             var i: integer;
                            begin
                             Anzahl:=4;
                            
                             for i:=1 to Anzahl do
                            
                             dbfrm := ExtractFilePath(ParamStr(0))+'db/db.tdbd';
                            
                            FormCreate.TdbTable1.Active := False;
                             try
                              FormCreate.TdbTable1.DatabaseName := dbfrm;
                              FormCreate.TdbTable1.TableName := 'pr';
                              FormCreate.TdbTable1.Active := True;
                             except
                              MessageBeep(0);
                              ShowMessage('Die Tabelle db.tdbd befindet' + #10#13 +'sich nicht im angegebenen Verzeichnis!')
                             end
                            
                            end;
                            jetzt sehe ich aber den Wald vor lauter Bäumen nicht mehr. Kann mir jemand helfen biddö... dangge.
                            Hallo Idan,

                            Du mußt für den Zugriff auf den Dateipfad eine TTdbDatabase-Komponente nutzen. Gib dieser Komponent einen eindeutigen Databasenamen und setze die Location auf den Datenpfad z.B. durch Auswertung von ParamStr(0).

                            Deinen Tabellen hier TdbTable weist du als Databasename den Databasnamen der Komponente TTdbDatabase zu.

                            Mit deinen Fragen zu TurboDB kannst Du Dich aber auch direkt an die herausgebende Firma dataweb wenden. Die eine Möglichkeit der Kommunikation ist über deren Forum, der andere ist über deren Support-Email-Adresse [email protected].

                            Ich/Wir haben immer zügig Antworten und Lösungsstrategien erhalten.

                            Gruß Uwe

                            Comment

                            Working...
                            X