Seite 2 von 4

Re: Preference kann nicht geöffnet werden

Verfasst: 28.12.2009 22:54
von Mok
ts-soft hat geschrieben:Also MakeSureDirectoryPathExists mit Prototypes selber importieren!
Hä?

Also ist ja alles schön und gut aber schön langsam wird alles ziemlich umständlich...

Re: Preference kann nicht geöffnet werden

Verfasst: 28.12.2009 22:55
von ts-soft
Mok hat geschrieben:Also ist ja alles schön und gut aber schön langsam wird alles ziemlich umständlich...
Nimm dies hier:

Code: Alles auswählen

Procedure ForceDirectories(Dir.s)
  If (Right(Dir.s, 1) = "\")
    Dir.s = Left(Dir.s, Len(Dir.s) - 1)
  EndIf
  If (Len(Dir.s) < 3) Or FileSize(Dir.s) = -2 Or GetPathPart(Dir.s) = Dir.s
    ProcedureReturn #False
  EndIf
  ForceDirectories(GetPathPart(Dir.s))
  CreateDirectory(Dir.s)
  ProcedureReturn #True
EndProcedure
geht auch ohne diese blöde API :wink:

Re: Preference kann nicht geöffnet werden

Verfasst: 28.12.2009 23:03
von al90
ts-soft hat geschrieben:Einspruch:
Abgelehnt. :mrgreen:
1. Unter WindowsXP und Windows 2000 als eingeschränkter User, was normal
sein sollte (aber nicht ist), gilt dasselbe wie unter Vista und höher (Win9x
in einer MU Umgebung kann ich leider nicht mehr testen :mrgreen: ), also ist
die Unterscheidung schon mal falsch.
Wie Du schon sagst, aber nicht ist :mrgreen:
Also MakeSureDirectoryPathExists mit Prototypes selber importieren!
Wie wäre es hiermit ?

Code: Alles auswählen

Procedure.l MakeDirectoryGroup(Dir$)

If Right(Dir$,1)<>"\" : Dir$+"\" : EndIf

If Mid(Dir$,2,2)=":\" And FileSize(Dir$)=-1
  c$=Left(Dir$,3)
  For i=4 To Len(Dir$)
    b$=Mid(Dir$,i,1)
    If b$<>"\"
      c$+b$
    Else
      c$+b$
      CreateDirectory(c$)
    EndIf
  Next
EndIf

ProcedureReturn FileSize(Dir$)

EndProcedure

;Debug MakeDirectoryGroup("D:\Test1\Test2\Test3\SubDir\")
Kann man sicherlich noch optimieren. Hatte ich aber noch so auf pladde tummeln. :mrgreen:

Re: Preference kann nicht geöffnet werden

Verfasst: 28.12.2009 23:11
von al90
ts-soft hat geschrieben:Nimm dies hier:
Einspruch! :mrgreen:

Wenn das Directory bereits existiert, sollte trotzdem True und nicht False zurückgegeben werden. :wink:

Re: Preference kann nicht geöffnet werden

Verfasst: 28.12.2009 23:19
von ts-soft
al90 hat geschrieben: Wenn das Directory bereits existiert, sollte trotzdem True und nicht False zurückgegeben werden. :wink:
Habs nur auf die schnelle aus dem CodeArchiv geklaut und leicht modifiziert, kann jeder
halten, mit wahr oder falsch.

Ansonsten, auf Arbeit, unter XP, haben die Programme nicht das Recht ins Progammverzeichnis
zu schreiben, was normal ist, nur auf unsicheren Homeuser (DAU) Kisten eben nicht, diese
überwiegen ja leider :mrgreen:

Re: Preference kann nicht geöffnet werden

Verfasst: 28.12.2009 23:23
von Mok
ok, ich versteh jetz gar nix mehr

Re: Preference kann nicht geöffnet werden

Verfasst: 28.12.2009 23:27
von ts-soft
Mok hat geschrieben:ok, ich versteh jetz gar nix mehr
Hier der Mix, für Nichtversteher:

Code: Alles auswählen

Procedure ForceDirectories(Dir.s)
  If (Right(Dir.s, 1) = "\")
    Dir.s = Left(Dir.s, Len(Dir.s) - 1)
  EndIf
  If (Len(Dir.s) < 3) Or FileSize(Dir.s) = -2 Or GetPathPart(Dir.s) = Dir.s
    ProcedureReturn #True
  EndIf
  ForceDirectories(GetPathPart(Dir.s))
  CreateDirectory(Dir.s)
  ProcedureReturn #True
EndProcedure

Procedure.s GetAndCreateConfigPath(FullPath$)

  Protected PrefsPath$

  If Right(FullPath$, 1) <> "\" : FullPath$ + "\" : EndIf

  PrefsPath$ = GetEnvironmentVariable("APPDATA") + "\" + StringField(FullPath$, CountString(FullPath$, "\"), "\") + "\"

  If ForceDirectories(PrefsPath$) = #True
    ProcedureReturn PrefsPath$
  EndIf

EndProcedure


MyConfigPath$ = GetAndCreateConfigPath(GetPathPart(ProgramFilename()) + "PureTEST_ConfigFolder\")
Debug MyConfigPath$ ; <--- Gibt ("") zurück bei Fehlschlag!

Ich hoffe das geht jetzt, wie es soll

Re: Preference kann nicht geöffnet werden

Verfasst: 28.12.2009 23:30
von al90
Mok hat geschrieben:ok, ich versteh jetz gar nix mehr
Du kannst ohne weiteres mein erstgenanntes beispiel nehmen. Nur statt der API MakeSurePathExists nimmst Du halt
entweder die von ts-soft beschriebene, oder meinen zuletzt genannten code zur ergänzung. :wink:

Edit:

Ah ts-soft war schneller. Na dann sollte ja alles geklärt sein. :wink:

Re: Preference kann nicht geöffnet werden

Verfasst: 29.12.2009 10:42
von Mok
Mit ein wenig Nachhilfe geht alles.
Danke euch beiden :allright:

EDIT: Sollte ich danach auch noch SetCurrentDirectory(MyConfigPath$) machen, oder gehts dann erst recht nicht?

Re: Preference kann nicht geöffnet werden

Verfasst: 29.12.2009 17:19
von al90
Mok hat geschrieben:EDIT: Sollte ich danach auch noch SetCurrentDirectory(MyConfigPath$) machen, oder gehts dann erst recht nicht?
Nein das brauchst Du dann nicht mehr, da der FullPath ja bereits in MyConfigPath$ steht.
Hier mal eine weitere kleine ergänzung zum code wie ich es machen würde. Vllt kannst Du ja was damit anfangen. :wink:

Code: Alles auswählen

Procedure ForceDirectories(Dir.s)
  If (Right(Dir.s, 1) = "\")
    Dir.s = Left(Dir.s, Len(Dir.s) - 1)
  EndIf
  If (Len(Dir.s) < 3) Or FileSize(Dir.s) = -2 Or GetPathPart(Dir.s) = Dir.s
    ProcedureReturn #True
  EndIf
  ForceDirectories(GetPathPart(Dir.s))
  CreateDirectory(Dir.s)
  ProcedureReturn #True
EndProcedure

Procedure.s GetAndCreateConfigPath(FullPath$)

  Protected PrefsPath$

  If Right(FullPath$, 1) <> "\" : FullPath$ + "\" : EndIf

  PrefsPath$ = GetEnvironmentVariable("APPDATA") + "\" + StringField(FullPath$, CountString(FullPath$, "\"), "\") + "\"

  If ForceDirectories(PrefsPath$) = #True
    ProcedureReturn PrefsPath$
  EndIf

EndProcedure

Procedure.l LoadPreferences(ConfigFile$)

If OpenPreferences(ConfigFile$)
  If PreferenceGroup("MyGroup")
    MyValue.l = ReadPreferenceLong("MyKeyword",0)
  EndIf
  ClosePreferences()
EndIf

EndProcedure

; Pfad für Prefs ermitteln.

MyConfigPath$ = GetAndCreateConfigPath(GetPathPart(ProgramFilename()) + "Mok\")

; Werte aus Preferences einlesen.

LoadPreferences(MyConfigPath$ + "MyConfig.ini")

Die Prefs-Befehle habe ich in einer Proc gepackt, damit es übersichtlicher wird. Diese brauchst Du dann nur noch nach
eigenbedarf anzupassen. Als Parameter wird der FullPath+Name der Configuration übergeben. Alternativ könntest Du aber
auch z.b. MyConfigPath$ Globalisieren. Dann bräuchtest du den namen nicht immer mit in den Proc-Params mit angeben.
Ausserdem empfehle ich noch eine SavePreferences() Proc als ergänzung dazu zu schreiben. Dann kannst Du immer &
überall vom Hauptproggi aus darauf zugreifen und es wäre eine "Saubere" programmierung. :wink: