Voreinstellungen eines Dialoges per Skript laden möglich?

Linley

Mitglied
Registriert
09.06.04
Beiträge
3.808
Ort
Rostock
Trophäen
3* 3! {!!} {*} °
Hallo zusammen,

ist es möglich, mit einem Skript die Voreinstellungen eines Dialoges auszulesen und anzuwenden?
 
AW: Voreinstellungen eines Dialoges per Skript laden möglich?

Per Script direkt soweit ich weiß nicht.
Aber schau dir mal die FixFotoValues.ini im Params Verzeichniss an.
Da steht so einiges drin.
 
AW: Voreinstellungen eines Dialoges per Skript laden möglich?

Hallo Heinz,

wo die Werte abgelegt werden, weiss ich schon, nur will ich sie auslesen und vor allem dann auch anwenden ;)
 
AW: Voreinstellungen eines Dialoges per Skript laden möglich?

Wenn die Werte eines Dialogs in einer INI abgelegt sind, kann man sie per Script auslesen und dann diese Parameter grundsätzlich auch beim Dialog-Aufruf verwenden. Um konkret welchen Dialog geht es denn?
 
AW: Voreinstellungen eines Dialoges per Skript laden möglich?

Hallo Martin,

über die Dateioperationen mit dem FileSystemObject von WSH kein Problem. Du musst allerdings die Struktur selbst parsen. Kann sein, dass Du die Parameter umgestalten musst.
 
AW: Voreinstellungen eines Dialoges per Skript laden möglich?

Hallo zusammen,

es geht um den RAW-Import-Dialog, da würde ich gerne mit dem MultiRAW-Skript einen Haufen Bilder umwandeln.
Die Parameter selber zu parsen dürfte ziemlich aufwendig sein, nehme ich an.
@Joachim: Ist da von deiner Seite was machbar?
 
AW: Voreinstellungen eines Dialoges per Skript laden möglich?

Seit FF 3.0 gibt es den Befehl FF_SetRawParam, damit sollte das machbar sein.
Gespeicherte Einstellungen für den RAW werden in der FixFotoValues.ini in der Rubrik [dcrawFront] abgelegt. Ich vermute mal, dass FF_SetRAWParam genau mit diesen Werten gefüttert werden muss. Habe allerdings mit RAW-Bearbeitung keine Erfahrung.
 
AW: Voreinstellungen eines Dialoges per Skript laden möglich?

Hallo Martin,

ist eigentlich recht einfach. Lese alles auf einen Schlag ein. Zerlege erst nach Bereiche, dann nach Zeilen, dann nach Schlüssel (Begrenzung auf ein Vorkommen.)

Schnelles Parsen mit Standardmitteln. Wichtigstes Wissen: Arbeiten mit Arrays. Bessere Übersicht hat man, wenn man dafür Klassen anlegt und Daten kapselt. Dann kann man auch die Daten wieder zurückschreiben. Es empfiehlt sich Klassen für File, Section und Key anzulegen. Für's schnelle Lesen geht es aber auch mal ohne.

Weitere Alternativen (speicherplatzschonender): Zeichenkettensuche mit Positionszeiger oder einfach Zeile für Zeile einlesen. Man braucht dazu aber ein größeres abstraktes Vorstellungsvermögen für Daten; oder: Regular Expressions -> Dauert lange, das fehlerfrei zu bekommen.)

Anmerkung: vbCRLF ist eine Konstante in VBScript für die Zeichen 13 (0Dh) und 10 (0Ah). In JScript wäre dies, wenn ich mich richtig erinnere mit \r\n maskiert.

  • Füge vorne Zeilenumbruch hinzu: vbCRLF & Dateiinhalt
  • Trenne Bereiche auf:
    Mittel: Split
    Trennzeichen: vbCRLF & "["
  • Entnehme Bereich:
    Mittel: Split
    Trennzeichen: "]" & vbCRLF
    Parameter: Größe der ArrayItems begrenzen: auf 2
    = Linke Seite = Bereichsname; Rechte Seite = Bereichsinhalt
  • Bereich ermitteln, den Du brauchst
  • Diesen Bereich aufsplitten in Zeilen
    Mittel: Split
    Trennzeichen: vbCRLF
  • Zeilenarray durchsuchen
  • Dabei Zeile aufsplitten
    Mittel: Split
    Trennzeichen: "="
    =Linke Seite = Schlüssel; Rechte Seite = Wert
  • Schlüssel gefunden -> Wert aufschlüsseln
    Mittel: Split
    Trennzeichen: ","
  • Werte in Funktion übertragen -> Muss manuell erfolgen
    Bspl: FF_Funktion(aValues(0),aValues(1),aValues(2),....) usw.
Vorteile von Arrays in Klassen: Die Daten werden einmal von Platte gelesen und stehen für den schnellen Zugriff auch für mehrere Werte zur Verfügung. Mit geeigneten Zugriffsroutinen hat man sogar einen einfachen Zugriff. Dieser kann iterativ oder per Schlüsselname erfolgen. Bei FF-INIs muss man jedoch aufpassen. Da haben oft mehrere Schlüssel im gleichen Bereich gleiche Namen. Hier kann die Rückgabe über ein Array oder FindFirst, FindNext aufgebaut werden.

Beispiel für einen Klassenaufbau in VBScript vereinfacht(!) - Heiße Feder ohne Probedurchlauf, kann also Fehler enthalten:
Code:
Option Explicit

Dim fso
Main
Set fso = Nothing

Sub Main
    Dim oFile
    Dim oINI
    Dim oSection
    Dim sFileContent

    Const ForReading = 1

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oFile = fso.OpenTextFile("C:\Temp\Test.ini", ForReading)
    sFileContent = oFile.ReadAll
    oFile.Close
    Set oFile = Nothing
	
    Set oINI = New INIFile
    oINI.Parse sFileContent
	
    'Hier sollte man wissen, dass der Bereich existieren, sonst Fehler
    With oINI.SectionByName("TestBereich")
        MsgBox .ValueByName("Schlüssel")
    End With

    'Hier sollte man wissen, dass der Bereich existieren, sonst Fehler
    With oINI("TestBereich")
        MsgBox .ValueByName("Schlüssel")
    End With

    Set oSection = oINI("TestBereich")
    If Not oSection Is Nothing Then
        'Existiert der Schlüssel nicht->Leerzeichenfolge
        MsgBox oSection("Schlüssel")
    End If
    'Aufräumen	
    Set oINI = Nothing
End Sub

Class INIFile
    Private mv_aSections

    Private Sub Class_Initialize()
        mv_aSections = Array()
    End Sub
    Private Sub Class_Terminate()
        Erase mv_aSections
    End Sub

    'Übergabe in VBScript mit ByRef. Ab VB.Net mit ByVal!
    Public Sub Parse(ByRef sFileContent)
        Dim i
        Dim aSections
        Dim aSectionData

        aSections = Split(vbCRLF & sFileContent, vbCRLF & "[")
        ReDim mv_aSections(UBound(aSections, 1))
        For i = 0 To UBound(aSections, 1)
            Set mv_aSections(i) = New INISection
            With mv_aSections(i)
                aSectionData = Split(aSections(i), "]" & vbCRLF, 2)
                .Name = aSectionData(0)
                .Parse aSectionData(1)
                Erase aSectionData
            End With
        Next
    End Sub

    Public Default Property Get SectionByName(sName)
        Dim i
        For i = 0 To UBound(mv_aSections, 1)
            If StrComp(mv_aSections(i).Name, sName, vbTextCompare) = 0 Then
                Set SectionByName = mv_aSections(i)
                Exit Property
            End If
        Next
        Set SectionByName = Nothing        
    End If
End Class

Class INISection
    Public Name
    Private mv_aKeys

    Private Sub Class_Initialize()
        Name = ""
        mv_aKeys = Array()
    End Sub
    Private Sub Class_Terminate()
        Erase mv_aKeys
    End Sub

    Public Sub Parse(ByRef sSectionData)
        Dim i
        Dim aLines
        Dim aKey
        If Len(sSectionData) = 0 Then Exit Sub
        aLines = Split(aSectionData, vbCRLF)
        ReDim mv_aKeys(UBound(aLines, 1))

        On Error Resume Next

        For i = 0 To UBound(aLines, 1)
             Set mv_aKeys(i) = New INIKey
             Select Case True
                 Case Len(aLines(i) = 0
                     mv_aKeys(i).Type = 0
                 Case Left(aLines(i), 1) = ";", LCase(Left(aLines(i), 3)) = "rem"
                     With mv_aKeys(i)
                         .Type = 2
                         .Value = aLines(i)
                     End With
                 Case Else
                     aKey = Split(aLines(i), "=", 2)
                     With mv_aKeys(i)
                         .Type = 1
                         .Name = aKey(0)
                         .Value = aKey(1)
                     End With
                     Erase aKey
             End Select
        Next
        On Error Goto 0
    End Sub
    ' Zugriff über Namen (Erstes Vorkommen)
    Public Default Property Get ValueByName(sKey)
        Dim i
        For i = 0 To UBound(mv_aKeys, 1)
            With mv_aKeys(i)
                If .Type = 2 Then
                    If StrComp(.Name, sKey) = 0 Then
                        ValueByName = .Value
                        Exit Property
                    End If
                End If
            End With
        Next
        ValueByName = ""
    End Property
End Class

Class INIKey
    Public Name
    Public Value
    Public Type '0 = Leer, 1 = Key, 2 = Kommentar
End Class

Was noch fehlt: Schreibsupport, Testen auf Bereich und Schlüssel, einige Fehlerabfangroutinen, Suchsupport, Lese/Schreibsupport für mehrere gleichnamige Schlüssel.
Verbesserungen: Suchroutinen können aufgepeppt werden durch HashCodes, die man aber in VBScript selber implementieren muss und Fallstricke enthalten können. Statusabfragen, Dirty-Management etc..

Dies soll nur eine Basis darstellen.
 
Zurück
Oben