Seite 1 von 1

Preference - verschachtelte OpenPreferences möglich?

Verfasst: 26.12.2009 02:27
von STARGÅTE
Tachchen,

ich nutze gerne die Preference-Lib um halt Datein in diesem Format auszulesen.

Nun würde ich aber auch gerne mehrere OpenPreferences verschachteln, also:

zuerst wird die Hauptdatei geöffnet mit OpenPreferences
dann ließt er ein paar Daten aus, und dann unter anderem auch ein String in dem eine weitere Datei steht.
Diese soll er dann auch öffnen und bearbeiten und nach dem schließen wieder zur Hauptdatei springen.

Leider gibt es ja nicht wie bei File eine Nummer (vllt was für die nächste PB-version ?)

Ist das nur so auf diesem umständlichen weg möglich:

Code: Alles auswählen

If OpenPreferences("Main.ini")
  PreferenceGroup("Group1")
  SubFile$ = ReadPreferenceString("File", "")
  Debug SubFile$
  If SubFile$
    ClosePreferences()
    If OpenPreferences(SubFile$)
      PreferenceGroup("Group1")
      Debug ReadPreferenceString("Value", "")
      ClosePreferences()
    EndIf
    OpenPreferences("Main.ini")
  EndIf
  PreferenceGroup("Group2")
  Debug ReadPreferenceString("Value", "")
  ClosePreferences()
EndIf
ich wünsche mir halt sowas:

Code: Alles auswählen

If OpenPreferences(1, "Main.ini")
  PreferenceGroup(1, "Group1")
  SubFile$ = ReadPreferenceString(1, "File", "")
  Debug SubFile$
  If SubFile$ And OpenPreferences(2, SubFile$)
    PreferenceGroup(2, "Group1")
    Debug ReadPreferenceString(2, "Value", "")
    ClosePreferences(2)
  EndIf
  PreferenceGroup(1, "Group2")
  Debug ReadPreferenceString(1, "Value", "")
  ClosePreferences(1)
EndIf

Vorallem wäre es wichtig wenn man zB ein Include schreibt welches in einer Procedure eine Preference öffnet.
Denn wenn man diese Procedure dann selber während des auslesens einer Preference ausführt geht alles kaputt!

Und ich möchte ungern selber das File analysieren und auch kein XML nutzen !

Re: Preference - verschachtelte OpenPreferences möglich?

Verfasst: 26.12.2009 02:50
von AND51
Es kann nur eine Preference-Datei gleichzeitig geöffnet sein. Ausnahme: Mehrere Threads können jeweils eine Preference-Datei bearbeiten, wenn Threadsafe aktiviert ist.

Dein Vorschlag, die Preference-Lib mit dem ID-System auszustatten, wurde bereits (mehrfach?) ins Feature Request-Forum gestellt.

Re: Preference - verschachtelte OpenPreferences möglich?

Verfasst: 27.12.2009 16:15
von mk-soft
Wenn es nur für Windows ist, geht es auch über API.

Code: Alles auswählen

;-TOP
; Kommentar     : Include INI-Dateien
; Author        : mk-soft
; Second Author : 
; Datei         : INI-File.pb
; Version       : 1.02
; Erstellt      : 02.10.2006
; Geändert      : 27.12.2009
; 
; Compilermode  :
;
; ***************************************************************************************

Procedure GetSectionsNames(path.s, List OutList.s())

  Protected *buffer, *adr, temp.s
  
  *buffer = AllocateMemory($4000)
  
  GetPrivateProfileSectionNames_(*buffer, $4000, path)
  
  *adr = *buffer
  Repeat
    temp = PeekS(*adr)
    If temp <> ""
      AddElement(OutList())
      OutList() = temp
    EndIf
    *adr + Len(temp) + 1
  Until temp = ""
  
  FreeMemory(*buffer)
  
EndProcedure

; ***************************************************************************************

Procedure GetSection(section.s, path.s, List OutList.s())

  Protected *buffer, *adr, temp.s
  
  *buffer = AllocateMemory($4000)
  
  GetPrivateProfileSection_(section, *buffer, $4000, path)
  
  *adr = *buffer
  Repeat
    temp.s = PeekS(*adr)
    If temp <> ""
      AddElement(OutList())
      OutList() = temp
    EndIf
    *adr + Len(temp) + 1
  Until temp = ""
  
  FreeMemory(*buffer)
  
EndProcedure

; ***************************************************************************************

Procedure.s ReadINI(lpAppName.s, lpKeyName.s, lpFileName.s, lpDefault.s = "")

  Protected *lpReturnedString
  Protected Result.s
 
  *lpReturnedString = AllocateMemory(1024)
  lpDefault = ""
  GetPrivateProfileString_(lpAppName, lpKeyName, lpDefault, *lpReturnedString, 1024, lpFileName)
  Result.s = PeekS(*lpReturnedString)
  FreeMemory(*lpReturnedString)
  ProcedureReturn Result
 
EndProcedure

; ***************************************************************************************

Procedure WriteINI(lpszSection.s, lpszKey.s, lpszString.s, lpszFile.s)

  Protected result
  
  result = WritePrivateProfileString_(lpszSection, lpszKey, lpszString, lpszFile)
 
  ProcedureReturn result
 
EndProcedure

; ***************************************************************************************

;- Test
NewList SectionsNames.s()
NewList Section.s()

path.s = OpenFileRequester("INI-Datei", "", "", 0)
GetSectionsNames(path, SectionsNames())

ForEach SectionsNames()
  Debug "*** " + SectionsNames() +" ***"
  ClearList(Section())
  GetSection(SectionsNames(), path, Section())
  ForEach Section()
    Debug Section()
  Next
Next

; ***************************************************************************************
FF :wink: