Announcement

Collapse
No announcement yet.

Arbeitsverzeichnis in FormCreate definieren möglich ?

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

  • Arbeitsverzeichnis in FormCreate definieren möglich ?

    Hallo,

    ich habe folgendes Problem. Ich habe ein Programm, welches auf Knopfdruck eine Paradox-Query aufruft. Die Tabelle, die in der Query abgefragt wird, liegt in einem Verzeichnis, wo der User Schreibrechte drauf hat.

    Die Exe-Datei liegt jedoch in einem Verzeichnis, wo der User keine Schreibrechte drauf hat, nur Leserechte. In diesem Fall funktioniert das Programm nicht, da die Abfrage nicht ausgeführt wird.

    Wird das Programm jedoch über eine Verknüpfung gestartet, in der das Arbeitsverzeichnis auf ein temporäres Laufwerk gesetzt wird, wo der User Schreibrechte hat, so läuft das Prog einwandfrei.

    Wie kann ich nun per Programmcode das Arbeitsverzeichnis festlegen ? Geht das, das ich das irgendwie im FormCreate-Ereignis definieren kann ?

    Grüsse,
    Carsten

  • #2
    Hallo Carsten,

    Ich denke nicht, daß es das Arbeitsverzeichnis ist, sondern das PrivateDir des TQuery. Dies ist standardmäßig das Programmverzeichnis, oder eben das Arbeitsverzeichnis.

    Einfachste Lösung:<BR>
    Füge eine TSession hinzu und setze das PrivateDir auf ein Verzeichnis, auf dem der User Schreibrechte hat. In der Query muß dann nur noch die Session eingestellt werden. Es ist dann nicht nötig irgendetwas zur Laufzeit einzustellen.

    Grüße Joche

    Comment


    • #3
      Hallo Jochen,

      danke für Deine Antwort. Bei mir klappt dies aber noch nicht. Habe im Datenmodul eine TSession-Komponente hinzugefügt und die Query damit verbunden.

      Beim Ausführen der Abfrage erhalte ich nun den BDE-Fehler 9986 (Ungültiger Parameter Datei: O:\Schreibschutz\Test.exe).

      Das "PrivateDir"-Verzeichnis der Session-Komp. habe ich auf "C:\Temp" gesetzt. Das "NetFileDir"-Verzeichnis ist bisher nicht gesetzt.

      Bei einem User, der Schreibrechte auf das O-Laufwerk hat, funktioniert das Programm fehlerfrei.

      Grüsse,
      Carste

      Comment


      • #4
        Hallo Carsten,

        da ich hier überall Schreibrechte hab' kann ich das nicht testen. Und eigentlich sollte das so funktionieren - theoretisch.

        Hm, wenn Du schon ein Datenmodul einsetzt, ist auch eine TDatabase-Komponente mit in dem Datenmodul, mit dem die Query verbunden ist? Wenn ja, was passiert wenn die Session des TDatabase auf die TSession setzt und aus der Query die Session wieder entfernst? Das NetFileDir mußt Du gegebenfalls auch setzen.

        Überprüf doch bitte mal, ob und was für Dateien im Arbeitsverzeichnis angelegt werden, wenn Du die App. über die Verknüpfung startest. Werden dort nur Dateien angelegt, wenn Du die Query ausführst, oder schon vorher?

        Grüße Joche

        Comment


        • #5
          Aus der BCB-Hilfe:

          Header-Datei

          dir.h

          Kategorie

          Verzeichnis-Steuerroutinen

          Prototyp

          int chdir(const char *path);
          int _wchdir(const wchar_t *path);

          Beschreibung

          Wechselt das aktuelle Verzeichnis.

          chdir setzt das durch path bezeichnete Verzeichnis als aktuelles Arbeitsverzeichnis. Der Parameter path muß ein existierendes Verzeichnis enthalten.

          path kann auch eine Laufwerksangabe enthalten wie etwa:

          chdir ("a:\\BC")

          Hier wird jedoch nur das aktuelle Verzeichnis dieses Laufwerks gewechselt, nicht das aktive Laufwerk selbst.

          Unter Windows ist nur der aktive Prozeß betroffen.

          Rückgabewert

          Wenn das angegebene Verzeichnis gesetzt werden konnte, liefert chdir den Wert 0; ansonsten wird -1 zurückgeliefert, und die globale Variable errno erhält den Wert:

          ENOENT Pfad/Datei nicht gefunde

          Comment


          • #6
            Hallo Jochen,

            habe jetzt mal ein kleines Projekt mit 1 TQuery und 1 TSession erzeugt.

            Die Sache funktioniert jetzt nach einigem Herumprobieren. Erwähnenswert ist auf jeden Fall, daß das Verzeichnis, welches unter "PrivateDir" im TSession-Objekt eingegeben wurde, auch vorhanden sein muß.

            Es ergeben sich jedoch folgende Unterschiede auf 2 PC's:
            1. Auf einem "Windows NT"-Ordner mit Schreibrechten auf dem O-Laufwerk, wird bei Programmstart der fehlende Ordner auf "C:\Temp" bemängelt. Es werden auch direkt bei Programmstart die lck-Dateien angelegt, sobald der Ordner vorhanden ist.

            2. Auf einem "Windows 2000"-Rechner, wo ich auf Laufwerk "O" keine Schreibrechte habe, bemängelt das Programm hingegen die fehlenden Schreibrechte auf dem O-Laufwerk. Wieso nicht den fehlenden Temp-Ordner ? Nach Anlegen des Temp-Verzeichnisses funktioniert das Programm auch hier. Allerdings werden keine lck-Dateien im Temp-Ordner angelegt. <B< Warum ? </B>

            Bei dem anderen Projekt, wo es eben nicht funktioniert hat, wird noch zusätzlich zu der Query eine TStoredProc verwendet sowie ein TDataBase. Bei diesen beiden Objekten muß ich wahrscheinlich ebenfalls ein TSession-Objekt anlegen, oder ? Wann brauche ich jeweils ein neues TSession-Objekt? Bei jeder Query oder abhängig von den Abfragen bzw. Operationen, die man durchführt?

            Grüsse,
            Carste

            Comment


            • #7
              Hallo Jochen,

              habe soeben noch einen zweiten Test an einem anderen "Windows NT"-Rechner ohne Schreibrechte auf Laufwerk "O" durchgeführt. Dort bemängelt er auch nicht den fehlenden Temp-Ordner, sondern den Schreibschutz auf das O-Laufwerk. Warum dieser Unterschied zu dem NT-Rechner von vorhin ? Liegt es daran, daß auf dem Rechner, wo er die Temp-Datei bemängelt, Delphi installiert ist ?

              Nach Anlegen des fehlenden Temp-Ordners funzt die Sache jetzt einwandfrei. Bei dem anderen Projekt, wo es nicht funktionierte, war es übrigens der selbe Grund (der fehlende Temp-Ordner). Na ja, kann man ja eine Routine für in sein Programm einbauen...

              Trotzdem würde mich auch noch ein wenig die Theorie interessieren. Wann setze ich jeweils ein neues TSession-Objekt ein ?

              Grüsse,
              Carste

              Comment


              • #8
                Hallo Carsten,

                >daß das Verzeichnis, welches unter "PrivateDir"...

                Da die BDE grundsätzlich existierende Verzeichnisse erwartet, habe ich es nicht explizit erwähnt.

                Bei den Ausführungsproblemen vermute ich ein Rechteproblem. Hängt stark von den verwendeten OS auf Server und Clients ab. Schau Dir mal die Berechtigungen auf dem Verzeichnis an.

                >Wann setze ich jeweils ein neues TSession-Objekt ein ?

                Schau mal in der Onlinehilfe nach TSession. Dort ist beschrieben, wann und warum man Sessions einsetzt.

                Grüße Joche

                Comment


                • #9
                  Hallo,

                  ich wollte noch eben erwähnen, daß man nicht unbedingt eine TSession-Komponente auf das Formular ziehen muß, da Delphi automatisch eine Default-Session zur Verfügung stellt.

                  Es reicht folgende Quellcode-Zeile im FormCreate-Ereignis: Session1.PrivateDir:= 'C:\Temp\Test';

                  Grüsse,
                  Carsten

                  @ Jochen:
                  Der Tip ist wirklich gut

                  Comment

                  Working...
                  X