locked
Outlook.. - Anhang lässt sich nicht anhängen (VFP) RRS feed

  • Frage

  • Hallo Community,

    ich habe ein problem, unzwar habe ich ein tool geschrieben, was auf outlook zugreift und selbständig e-mails versenden kann.. Das Problem ist dass ich keinen Anhang anhängen kann. Das Problem ist aber erst aufgetreten, nachdem ich einen Fehlerabfang, (der absolut notwendig ist) eingebaut habe. Ohne diesen Fehlerabfang funktioniert es!!!

    Der Code dafür lautet wie folgt:

    IF DIRECTORY(ALLTRIM(thisform.txtpfad.Value))= .F. then            

    MESSAGEBOX("Der angegebene Dateipfad ist nicht korreckt oder existiert nicht. Bitte prüfen Sie dies nocheinmal nach!") ELSE

    ...

    ENDIF

    kann mir jemand sagen, wo da der fehler ist, ich finde ihn nicht.. Und wie gesagt, ohne das funktioniert es. Aber ich kann den Fehlerabfang auch nicht weglassen!


    • Bearbeitet Schosch93 Dienstag, 23. Oktober 2012 13:27
    Dienstag, 23. Oktober 2012 13:25

Antworten

  • 1. Zwischen Entlickungszeit und Laufzeit ist ein Unterschied. Wenn Du in der IDE bist, setzt VFP CurDir() auf Home(). Wenn Du Deine EXE startest, nicht.

    2. Hast Du denn mal das angebene SYS(16,0) probiert? Auch das wird zur Entwicklungszeit den Pfad zum PRG liefern, zur Laufzeit, wo alles in einer Datei (der EXE) ist, aber den Pfad zur EXE. Wenn Du dein main.prg/start.prg direkt beim PJX Projektfile ablegst, wird das zur Entwicklungs- und Laufzeit derselbe Pfad sein.

    Daneben gibt es z.B. GETENV("USERPRFILE") und diverse weitere Systempfade, dann gibt es noch diverse Möglichkeiten, diese vom Betriebssystem abzufragen.

    Wenn Du auch bei der Installation beim Endkunden Unterverzeichnisse aufbaust, hilft Dir wiederum SYS(16) bzw. SYS(16,0).

    Außerdem sollst Du nicht SET DEFAULT machen, sondern SET PATH. SET PATH setzt eine PATH Variable ähnlich der DOS %PATH% Variable, die eine LISTE von Pfaden und nicht nur ein Einzelpfad enthalten kann.  Da kann dann z.B. SYS(16) rein, genauso wie CURDIR() und GETENV(irgendwas) oder, oder, oder.

    SET DEFAULT setzt dagegn den aktuellen Pfad, genau wie CD. Wenn eine EXE startet, dann ist soweit ich mich nicht irre CURDIR() gleich dem Pfad der EXE. In der Entwicklungsumgebung könntest Du den Pfad zur EXE, der dem Pfad zur PJX Datei entspricht auch mittels JustPath(_VFP.ActiveProject.Name) herausfinden (ich sage nicht, daß Du das hättest wissen können, ich gebe Dir das jetzt).

    Du hast gerade nur ein Problem, weil Du nicht die fertige EXE probierst, sondern den Code in der IDE testest. Das ist auch nicht verkehrt, aber hat eben andere Randbedingungen und -einstellungen. Ich gebe Dir noch etwas and die Hand: _VFP.Startmode, Du kannst damit sehen, ob der Code nun innerhalb der IDE oder als compilierte EXE läuft und entsprechend reagieren, z.B. nicht CURDIR() nehmen.

    Was übrigens noch CURDIR() beeinflusst, und worüber Du wieder volle Kontrolle während des Setups hast ist, der Pfad "Ausführen in" einer Verknüpfung im Startmenü oder einer Desktopverknüpfung.

    D.h. insgesamt gesehen musst Du Dir die auf den unterschiedlichen Systemen unterschiedlichen Pfade von Umgebungsvariablen, Startordner, Betiebssystem und und und abholen. Oder Du legst direkt bei der EXE eine INI-Datei oder eine DBF mit dem "Arbeits"-Pfad.

    Es gibt Tausend möglichkeiten, einen Pfad zu bestimmen, von dem sich alles weitere ableitet.

    Oder wie ich schon sagte: "Wenn ein Pfad nicht immer hart an einem bestimmten Ort liegt, dann sollte er in einer Konfigeinstellung sein oder wenigstens relativ zu einem konfigurierten Pfad oder relativ zur EXE, dessen Pfad Du mit SYS(16,0) herausfindest."

    Verstehst Du das jetzt?

    Tschüß, Olaf.

    • Bearbeitet Olaf Doschke Mittwoch, 31. Oktober 2012 09:49
    • Als Antwort markiert Schosch93 Mittwoch, 31. Oktober 2012 10:11
    Mittwoch, 31. Oktober 2012 09:41
  • hallo Horst, hab den fehler gefunden.

    Der Befehl "DIRECTORY() gibt nur an ob eine datei in einem verzeichnis existiert oder nicht. Mit einem Dierekten Pfad kann der nichts anfangen. Das habe ich wie folgt behoben: DIRECTORY(JUSTPATH()) = .t.
    So wird der gesammte pfad + Datei erkannt und kann auch dementsprechend eingelesen werden.

    ps.: ich bin grade erst von Object-Pascal nach FoxPro gewechselt (beruflich bedingt) und das then ist ein überbleibsel ^^

    ohne das fühl ich mch nich wohl ;P

    • Bearbeitet Schosch93 Mittwoch, 24. Oktober 2012 06:57
    • Als Antwort markiert Schosch93 Mittwoch, 24. Oktober 2012 07:18
    • Tag als Antwort aufgehoben Schosch93 Dienstag, 30. Oktober 2012 10:49
    • Als Antwort markiert Schosch93 Mittwoch, 31. Oktober 2012 10:12
    Mittwoch, 24. Oktober 2012 06:40

Alle Antworten

  • Hallo Schosch,

    Wo der Fehler steckt kann ich Dir so nicht sagen, dazu ist der Code etwas dürftig und Du müsstest präziser beschreiben was denn dann passiert. Bekommst Du immer diese Messagebox oder läuft alles gut bloss der Anhang ist nicht da oder ...? 
    Und eine Frage: warum prüfst Du nicht gleich nach der Eingabe in txtpfad ob das Verzeichnis existiert. Also z.B. im valid. Du lässt das Verlassen nur zu wenn' s leer ist (kein Anhang) oder das Directory okay ist. Dann brauchst Du Dich nicht beim Versenden drum zu kümmern. Und der User muss nicht nochmal loslegen.

    hth

    Horst

    P.S. das "then" ist für mich übrigens ganz exotisch, habs nie angewendet (aber daran liegts natürlich nicht).

    Dienstag, 23. Oktober 2012 14:41
  • hallo Horst, hab den fehler gefunden.

    Der Befehl "DIRECTORY() gibt nur an ob eine datei in einem verzeichnis existiert oder nicht. Mit einem Dierekten Pfad kann der nichts anfangen. Das habe ich wie folgt behoben: DIRECTORY(JUSTPATH()) = .t.
    So wird der gesammte pfad + Datei erkannt und kann auch dementsprechend eingelesen werden.

    ps.: ich bin grade erst von Object-Pascal nach FoxPro gewechselt (beruflich bedingt) und das then ist ein überbleibsel ^^

    ohne das fühl ich mch nich wohl ;P

    • Bearbeitet Schosch93 Mittwoch, 24. Oktober 2012 06:57
    • Als Antwort markiert Schosch93 Mittwoch, 24. Oktober 2012 07:18
    • Tag als Antwort aufgehoben Schosch93 Dienstag, 30. Oktober 2012 10:49
    • Als Antwort markiert Schosch93 Mittwoch, 31. Oktober 2012 10:12
    Mittwoch, 24. Oktober 2012 06:40
  • Hi Schosch,

    mir drängt sich die Frage auf, was denn eigentlich in

    thisform.txtpfad.Value

    drinsteht.

    Wenn dieser Wert auch den Dateinamen enthält, dann kann Dir die DIRECTORY() Funktion keinen .T. liefern, denn eine Datei ist nun einmal kein Verzeichnis.

    Sollte also tatsächlich ein Pfad + Dateiname in dieser Textbox stehen, dann kannst Du nicht mit DIRECTORY() sondern mit FILE() die Existenz abprüfen.


    Gruss / Best regards
    -Tom
    Debugging is twice as hard as writing the code in the first place.
    Therefore, if you write the code as cleverly as possible,
    you are, by definition, not smart enough to debug it. 010101100100011001010000011110000101001001101111011000110110101101110011

    • Als Antwort markiert Schosch93 Mittwoch, 24. Oktober 2012 07:18
    • Tag als Antwort aufgehoben Schosch93 Dienstag, 30. Oktober 2012 10:49
    Mittwoch, 24. Oktober 2012 07:11
  • und wie genau komme ich jetzt an einen bestimmten ordner, ganz egal wo der sich befindet?? wegen hin und her verschiebung (wegen PC ordnung ect...) kann ich definitiv keinen festen pfad nehmen, also wollte ich eine funktion, die den ordner Projekt_357 immer findet, wenn das überhaupt möglich ist und diese in einer public variabele speichern..

    • Bearbeitet Schosch93 Montag, 29. Oktober 2012 14:15
    Montag, 29. Oktober 2012 14:14
  • >also wollte ich eine funktion, die den ordner Projekt_357 immer findet, wenn das überhaupt möglich ist

    Wie würde das denn in Object Pascal oder irgendeiner Sprache gehen? Ohne eine aufwändige Suche über Ganze Partitionen zu machen? Wenn Du den Pfad zu einem bestimmten Unterordner nicht kennst, dann gibt höchstens noch der Windows Index eine Antwort auf Pfad- oder Dateisuchen.

    Wenn ein Pfad nicht immer hart an einem bestimmten Ort liegt, dann sollte er in einer Konfigeinstellung sein oder wenigstens relativ zu einem konfigurierten Pfad oder relativ zur EXE, dessen Pfad Du mit SYS(16,0) herausfindest, oder relativ zum Arbeitsverzeichnis, was in einer Startverknüpfung hinterlegt ist, oder relativ zu einem Systempfad wie dem Pfad zum Userprofil, zum Public/Öffentlichen User, Dokumenten, oder, oder, oder.

    Aber ich würde bei heutigen Festplattengrößen nie und nimmer irgendeine Funktion schreiben die nach Ordner "xyz" auf einer einer Partition sucht, der irgendwo vergraben sein könnte.

    Es gibt aber tausend Möglichkeiten einen Pfad festzulegen, sogar schon während eines Setups, ohne den Pfad  ganz hart als Konstante vorzugeben. Und sei es Du legst eine INI bereit, die ein (versierter) User anpassen kann. Inno Setup erlaubt u.a. auch Install-Interviews, mit denen Du einen Pfad vom User erfragen kannst, z.B. einen Netzwerkpfad für eine zentrale Datenbank im Multiuserbetrieb. Die zentrale Datenbank zu installieren wäre dabei ein Serversetup, was man im Gegensatz zum Clientsetup nur einmal machen muss. Noch eine häufig genutzte Variante ist eine Mulltiuserapplikation wie eine Singleuserinstallation mit EXE und Daten lokal an einem Server zu installieren und dann die EXE per Remotedesktop o.ä. von Clients nutzen zu lassen. Oder auch die EXE per Netzwerkfreigabe an Clients nutzen, wodurch dennoch klar ist, daß die Daten relativ zur EXE am selben Server zentral für alle Clients liegen. Da kommt dann wieder die Verknüpfung und dessen Arbeitsverzeichnis zu Hilfe, oder SYS(16)...

    Ähm, und die Funktionen die bestätigt, daß eine Datei existiert, und nicht ein Pfad, heißt FILE(). Und die sucht nicht nur am mitgegebenen Pfad, sondern vor allem auch im aktuellen Pfad (per CD gesetzt) und in Pfaden, die per SET PATH als Suchpfade gesetzt sind. Insofern gibt es schon eine Dateisuche, eingeschränkt auf eine Liste von Pfaden.

    Tschüß, Olaf.





    Montag, 29. Oktober 2012 19:40
  • hmm.. weil das problem wie folgt ist.. ich habe auf dem desktop einen ordner mit meinen Projekten. In diesem order befindet sich auch das Projekt an dem ich gerade arbeite. In diesem Ornder wiederum sind alle dateien gespeichert die das programm benötigt (auch wieder in unterordnern(Forms, tabellen, imeges..ect..))

    Das Bedeutet eine unverzichtbare übersichtlichkeit, hat aber auch den nachteil das ich nich einfach bei programmstart ein set  default setzten kann..weil er entweder die formulare nicht findet oder die tabellen oder was weiß ich..

    ein weiteres problem an der sache ist dass wenn ich in der befehlsleiste ?CURDIR eingebe, dann ist der nich im projektordner sondern zeigt den Pfad zum VPF installordner an.

    Das heißt ich brauche eine variabele oder funktion, die mir sagt in welchem pfad sich die unterorder befinden die bei einer suche ungefähr so aussehn sollte

    pfad+"\datei1"

    soentwas muss möglich sein. Weil wenn ich den Ordner an dritte weiter gebe würde eine harter pfad nicht mehr funtktioniern.. Und wennes nicht möglich wäre, dann hätte doch auch fast jeder entwickler, der seine producte verkauft ein schwerwiegendes problem..

    Dienstag, 30. Oktober 2012 07:29
  • 1. Zwischen Entlickungszeit und Laufzeit ist ein Unterschied. Wenn Du in der IDE bist, setzt VFP CurDir() auf Home(). Wenn Du Deine EXE startest, nicht.

    2. Hast Du denn mal das angebene SYS(16,0) probiert? Auch das wird zur Entwicklungszeit den Pfad zum PRG liefern, zur Laufzeit, wo alles in einer Datei (der EXE) ist, aber den Pfad zur EXE. Wenn Du dein main.prg/start.prg direkt beim PJX Projektfile ablegst, wird das zur Entwicklungs- und Laufzeit derselbe Pfad sein.

    Daneben gibt es z.B. GETENV("USERPRFILE") und diverse weitere Systempfade, dann gibt es noch diverse Möglichkeiten, diese vom Betriebssystem abzufragen.

    Wenn Du auch bei der Installation beim Endkunden Unterverzeichnisse aufbaust, hilft Dir wiederum SYS(16) bzw. SYS(16,0).

    Außerdem sollst Du nicht SET DEFAULT machen, sondern SET PATH. SET PATH setzt eine PATH Variable ähnlich der DOS %PATH% Variable, die eine LISTE von Pfaden und nicht nur ein Einzelpfad enthalten kann.  Da kann dann z.B. SYS(16) rein, genauso wie CURDIR() und GETENV(irgendwas) oder, oder, oder.

    SET DEFAULT setzt dagegn den aktuellen Pfad, genau wie CD. Wenn eine EXE startet, dann ist soweit ich mich nicht irre CURDIR() gleich dem Pfad der EXE. In der Entwicklungsumgebung könntest Du den Pfad zur EXE, der dem Pfad zur PJX Datei entspricht auch mittels JustPath(_VFP.ActiveProject.Name) herausfinden (ich sage nicht, daß Du das hättest wissen können, ich gebe Dir das jetzt).

    Du hast gerade nur ein Problem, weil Du nicht die fertige EXE probierst, sondern den Code in der IDE testest. Das ist auch nicht verkehrt, aber hat eben andere Randbedingungen und -einstellungen. Ich gebe Dir noch etwas and die Hand: _VFP.Startmode, Du kannst damit sehen, ob der Code nun innerhalb der IDE oder als compilierte EXE läuft und entsprechend reagieren, z.B. nicht CURDIR() nehmen.

    Was übrigens noch CURDIR() beeinflusst, und worüber Du wieder volle Kontrolle während des Setups hast ist, der Pfad "Ausführen in" einer Verknüpfung im Startmenü oder einer Desktopverknüpfung.

    D.h. insgesamt gesehen musst Du Dir die auf den unterschiedlichen Systemen unterschiedlichen Pfade von Umgebungsvariablen, Startordner, Betiebssystem und und und abholen. Oder Du legst direkt bei der EXE eine INI-Datei oder eine DBF mit dem "Arbeits"-Pfad.

    Es gibt Tausend möglichkeiten, einen Pfad zu bestimmen, von dem sich alles weitere ableitet.

    Oder wie ich schon sagte: "Wenn ein Pfad nicht immer hart an einem bestimmten Ort liegt, dann sollte er in einer Konfigeinstellung sein oder wenigstens relativ zu einem konfigurierten Pfad oder relativ zur EXE, dessen Pfad Du mit SYS(16,0) herausfindest."

    Verstehst Du das jetzt?

    Tschüß, Olaf.

    • Bearbeitet Olaf Doschke Mittwoch, 31. Oktober 2012 09:49
    • Als Antwort markiert Schosch93 Mittwoch, 31. Oktober 2012 10:11
    Mittwoch, 31. Oktober 2012 09:41