Danke für die Tipps.
Das mit dem roten Rahmen habe ich geändert, Framegadget habe ich vor 15 Jahren schon mal verwendet, aber vergessen.
Das blaue Rändchen an den Buttons gefällt mir gut, aus optischen Gründen habe ich den Parameter #PB_Text_Center in 1 geändert.
Mit dem Pfad hatte ich schon ausprobiert, lasse das aber trotzdem so stehen, wenn das Datumsprogi auf einer SD-Karte oder einem Stick mit den Videos zusammen mit dem Exiftool läuft, dann hinterlässt es keine Spuren auf dem PC. Ich brauche das ja nicht oft, nur um die Videos zeitmäßig zu sortieren, wenn Kameras unterschiedliche oder falsche Zeiteinstellungen haben, UTC oder MEZ.
Viele Grüße
Dieter
28.11.2022 Der Vollständigkeit halber hier die Version bei der die Einstellungen ins Home-Verzeichnis geschrieben werden.
ich selber werde weiterhin die Prefs-Datei ins aktuelle Verzeichnis schreiben.
Nochnmals danke und eine besinnliche Adventszeit.
Viele Grüße Dieter
Code: Alles auswählen
;---Prolog---
;MEXDatum: Modifiziere EXif-Datum von Video-Dateien mit EXiftool für Windows.
;Gelungen unter Mithilfe und Codeschnipseln von Axolotl und mk-soft, 
;außerdem habe ich mich bei "ReadProgramString" von Jürgen Kulow bedient.
;Pb 6.0 28. Nov. 2022
;Exiftool Download auf https://exiftool.org/ getestet mit Version 12.45
;Parameter Exiftoool:
;exiftool.exe "-filemodifydate<createdate"  "-filecreatedate<createdate" *.MP4 =>> Zeiten kopieren
;exiftool.exe "-filemodifydate<createdate"  "-filecreatedate<createdate"  G*.MP4 
; -------------------------------------------------------------------------------------------------------
;----Top---
EnableExplicit
;-Konstanten
Enumeration Gadgets 
  #Mainwindow 
  #Button_Pfad_Wahl                     ; Pfadwahl 
  #Button_Start_Datumsaenderung         ; Start Zeit ändern 
  #Button_Ende_Prgr                     ; Programmende 
  #Button_Exif_Start                    ; Start ExifTool
  #Button_Exif_Verzeichnis_suchen       ; Verzeichnis mit dem ExifTool
  #combogadg_DaT_Art                    ; Erstell- /  Änderungddatum
  #combogadg_DaT_Std                    ; Anzahl Stundenverschiebung 
  #Combogadget_Datei_Wildcards          ; Dateiart Wildcards  einstellen G*.MP4 / *.MP4 / *.* 
  #EDGadget_Text_Ausgabe                ; Anzeige Exifverzeichnis
  #Rahmen1
  #Rahmen2
  #TxtGadg_Std_Korr                     ; Anzeige der Stundenkorrektur
  #Textgadget_Arbeistsverzeichnis       ; Zeigt den Pfad an 
  #TxtGadget_Zeit                       ; Zeigt die aktuelle Dateizeit 
  #TextGadget_Exif_Pfad                 ; Anzeige ExifPfad 
  #ProzessbarGadget
  #CheckboxSticky
  #Verzeichnis
EndEnumeration
;-Texte
  #TxtRunProgLaufzeit      =  "Laufzeit "
  #TxtZeiteinheit$         =  " ms"
  #TxtRunPrgOK$            =  "OK"
  #TxtRunPrgError$         =  "Fehler Nr.: "
  #TxtRunPrgFATAL$         =  "Fataler Fehler "
  #TxtProg_nicht_gefunden$  = "Programm nicht gefunden: "
  #NewLine=#CRLF$          ;Windows neue Zeile
  #HomeVerzeichnis = "Meine_Programme"
  #ApplicationName = "MEXDatum"
;-Structur
  Structure Pfade
    Exif_Pfad$                    ; Pfad zum ExifTool einschließlich #EXIF_Executable$
    EXIF_Executable$              ; "ExifTool.exe"
    Exif_Kommando$                ; Exiftool Parameter
    Arbeitsverzeichnis$           ; Arbeitsverzeichnnis mit den Dateien
    Datei_Parameter$              ; Wildcards G*.MP4, *.MP4, *.MOV
    Thread.i
  EndStructure
  
;-Globale Variablen  
  Global Parameter.Pfade 
;   Global Path$
  Global datum$ = FormatDate("%dd.%mm.%yyyy.%hh:%mm:%ss",Date())
  Global datums_flag = #PB_Date_Created
  Global shift_hour_flag = 0  ; Stundendifferenz (-2)-(-1)- 0 - (+1) -(+2)
  Global Ausgabe_Txt$         ; "Datenausgabe"
  Global Top = 5 
  Global Hoehe = 30
  Global Event, fertig.i , ready.i
  Global Ende.i, i.i
Declare ExifRun(*Parameter)
Declare AendereDatum()
;----Proceduren---
Procedure InitWildcards()
  Protected State.i
  With Parameter
  State = GetGadgetState(#Combogadget_Datei_Wildcards)
  If State = 0 : \Datei_Parameter$ = "G*.MP4" : EndIf
  If State = 1 : \Datei_Parameter$ = "*.MP4"  : EndIf
  If State = 2 : \Datei_Parameter$ = "*.MOV"  : EndIf
  EndWith
EndProcedure
Procedure InitThread()
  Protected Pfad$, ArbVerz$
  Pfad$ = GetGadgetText(#TextGadget_Exif_Pfad)
  ArbVerz$ = GetGadgetText(#Textgadget_Arbeistsverzeichnis)
   With Parameter      
     \Exif_Pfad$          = Pfad$ 
     \EXIF_Executable$    = "ExifTool.exe"
     \Exif_Kommando$      = " -filemodifydate<createdate" + " -filecreatedate<createdate "
     \Arbeitsverzeichnis$ = ArbVerz$
     \Thread               = CreateThread(@ExifRun(),@Parameter)
     EndWith 
EndProcedure
  
Procedure ExifRun(*Parameter)
  
  Protected Exitcode, NoErrText
  Protected NewErrorText$, AllErrorText$ =""
  Protected start = ElapsedMilliseconds()
  Protected Program.i
  Protected path$, Cmd$, WorkDir$, WildCard$, Ausgabe$
  Protected Flags =#PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Hide ;| #PB_Program_Wait
  
  With Parameter
    path$      = \Exif_Pfad$ + \EXIF_Executable$
    Cmd$       = \Exif_Kommando$  
    WorkDir$   = \Arbeitsverzeichnis$
    WildCard$ = \Datei_Parameter$            
  EndWith 
  cmd$ = Cmd$ + WorkDir$ + WildCard$
  
  ClearGadgetItems(#EDGadget_Text_Ausgabe)
  Ausgabe_Txt$ = ""
  Program = RunProgram(path$, Cmd$, WorkDir$, Flags) 
    
  If Program    
    DisableWindow(#Mainwindow,#True)  ; Keine Eingaben möglich, während das Exiftool läuft
    While ProgramRunning(Program) 
      If AvailableProgramOutput(Program)                  
        Ausgabe$ = " ExifTool: " + ReadProgramString(Program) + #NewLine 
      EndIf
        NewErrorText$=ReadProgramError(Program) 
      While NewErrorText$<>""
        NoErrText+1
        AllErrorText$ + Str(NoErrText)+":"+NewErrorText$+#NewLine
        NewErrorText$=ReadProgramError(Program) 
      Wend 
      i = i+2 : SetGadgetState   (#ProzessbarGadget, i) : Delay(50)
      If i => 100 : i= 0 : EndIf
    Wend
    Ausgabe$+" "+#TxtRunProgLaufzeit+": "+Str(ElapsedMilliseconds()-start)+#TxtZeiteinheit$+#NewLine  
    If ElapsedMilliseconds()-start    
      Exitcode=ProgramExitCode(Program)
      If Exitcode<>0
        If 0=Exitcode 
          Ausgabe$ =  Ausgabe$+#TxtRunPrgOK$ 
        Else   
          Ausgabe$ =  "Fehler "+Ausgabe$ + #TxtRunPrgError$ + Str(Exitcode) + " keine Datei gefunden "  + #NewLine ;
          Ausgabe$ =  Ausgabe$ + " " + AllErrorText$ 
        EndIf 
      EndIf
    Else 
      If 0<>IsProgram(Program) 
        KillProgram(Program)
        CloseProgram(Program)
        Ausgabe$ +" " + #NewLine +AllErrorText$  
      EndIf 
    EndIf 
     i = 0
     Ausgabe_Txt$ = Ausgabe$
     SetGadgetState   (#ProzessbarGadget, i)
     CloseProgram(Program)
           AddGadgetItem(#EDGadget_Text_Ausgabe,-1,Ausgabe_Txt$+#NewLine)
  Else
    MessageRequester(#TxtRunPrgFATAL$,#TxtProg_nicht_gefunden$+" "+ path$) 
  EndIf
    DisableWindow(#Mainwindow,#False)
    SetGadgetState(#combogadg_DaT_Art,2)       ;TODO diese 2 Zeilen entfallen, wenn die Zeit 
    shift_hour_flag = 0                        ;anschließen nach dem ExiTool korrigiert werden soll
    AendereDatum()     
  ProcedureReturn 
EndProcedure
Procedure AendereDatum()
   
  Protected Zeit$, Pfad$
  Protected ArbVerz$, Para$
  Protected DatumsWert.i, DW_neu.i, gefunden.i, IstDatei.i
  
  With Parameter
    ArbVerz$ = \Arbeitsverzeichnis$
    Para$    = \Datei_Parameter$
  EndWith 
  IstDatei = 0
  gefunden = ExamineDirectory(#PB_Any,ArbVerz$,Para$) 
  If gefunden 
      While NextDirectoryEntry(gefunden) 
        If DirectoryEntryType(gefunden) = #PB_DirectoryEntry_File
            Para$ = DirectoryEntryName(gefunden) 
            If FileSize(Pfad$) =  FileSize(Para$) 
              Para$ = ArbVerz$ + Para$ 
              DatumsWert = GetFileDate(Para$,datums_flag)                     
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",Datumswert)              
              DW_neu = AddDate(DatumsWert,#PB_Date_Hour,shift_hour_flag)        
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)               
              DW_neu = DatumsWert + (3600 * shift_hour_flag)                   
              Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)               
              SetFileDate(Para$,datums_flag,ParseDate("%dd.%mm.%yyyy:%hh.%ii",zeit$))
              SetGadgetText(#TxtGadget_Zeit, Zeit$)                              
              Ausgabe_Txt$ = Para$ + " " + Zeit$
              AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ ) ;+#NewLine
            EndIf
            IstDatei = 1
        Else
          Ausgabe_Txt$  = Para$+ " Datei nicht gefunden," +  #NewLine + "Arbeitsverzeichnis korrekt gesetzt?"
          AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ + #NewLine)
        EndIf  
      Wend
   If Not    NextDirectoryEntry(gefunden) And IstDatei = 0
        Ausgabe_Txt$  = Para$+ " Datei nicht gefunden" + #NewLine + "Arbeitsverzeichnis korrekt gesetzt?"
        AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ + #NewLine)
        SetGadgetText(#TxtGadget_Zeit, "Heute " + FormatDate("%dd.%mm.%yyyy %hh:%ii", Date()) )
    EndIf   
    
  EndIf 
      FinishDirectory(gefunden)
EndProcedure
  Procedure Tooltipp() 
  If shift_hour_flag =   0
     GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")  
  ElseIf  shift_hour_flag = -1
           GadgetToolTip(#combogadg_DaT_Art, "")
         EndIf  
EndProcedure
       
Procedure.s GetProgramDataPath()
  Protected basePath.s, subPath.s, dataPath.s 
    basePath = GetUserDirectory(#PB_Directory_ProgramData)
    subPath = basePath + #HomeVerzeichnis + #PS$
  dataPath = subPath + #ApplicationName + #PS$
  If FileSize(dataPath) <> -2
    If FileSize(subPath) <> -2
      CreateDirectory(subPath)
    EndIf
    If FileSize(dataPath) <> -2
      CreateDirectory(dataPath)
    EndIf
  EndIf
  ProcedureReturn dataPath
EndProcedure
Procedure InitHilfeTxT()
   Ausgabe_Txt$ = " Das ExifTool von von Phil Harvey muss auf dem Rechner installiert sein " + #NewLine +
                 " ------------------------------------------"                   + #NewLine +
                 " 1. Pfade setzen "        + #NewLine +
                 " 2. Dateiart wählen "     + #NewLine +
                 " 3. ExifTool starten "    + #NewLine +
                 " 4. Zeitänderung wählen " + #NewLine +
                 " 5. Zeit starten "        + #NewLine +
                 " 6. Freuen "              + #NewLine +
                 "------------------------------------------"                   + #NewLine +
                 " Das Programm speichert die aktuellen Einstellungen in einer MEXDatum.pref " + #NewLine +
                 " Die Funktionen Start und ExifTool können mehrfach aufgerufen werden " + #NewLine +
                 " Der Button ExifTool setzt die Änderungen Im FileDate wieder zurück auf das Erstelldatum der Kamera."
 
  SetGadgetText(#EDGadget_Text_Ausgabe,Ausgabe_Txt$)
EndProcedure
Procedure  Lese_Pref()
  Protected Pfad$
  Pfad$=GetProgramDataPath()
  If Pfad$
    If OpenPreferences(Pfad$ + "MEXDatum.pref")    ;  liest oder erstellt eine Preference-Datei namens MEXDatum.pref
      PreferenceGroup("Global")
      With Parameter                       ; initialisiere
        \Exif_Pfad$                 = ReadPreferenceString("Exif_Pfad$","")
        \EXIF_Executable$           = ReadPreferenceString("Exif_Executable$","")
        \Exif_Kommando$             = ReadPreferenceString("Exif_Kommando$","")
        \Arbeitsverzeichnis$        = ReadPreferenceString("Arbeitsverzeichnis$","")
      EndWith
      ClosePreferences()
    Else
      CreatePreferences("MEXDatum.pref")
      ClosePreferences()
    EndIf
  EndIf 
EndProcedure
; ----------------------------------
 Procedure Schreibe_Pref() ; Preferenzdatei schreiben
   Protected Pfad$
   Pfad$ = GetProgramDataPath()
   If Pfad$
    OpenPreferences(Pfad$ + "MEXDatum.pref")
    PreferenceGroup("Global")
    With Parameter
      WritePreferenceString("Exif_Pfad$",         \Exif_Pfad$)
      WritePreferenceString("Exif_Executable$",   \EXIF_Executable$)
      WritePreferenceString("Exif_Kommando$",     \Exif_Kommando$)
      WritePreferenceString("Arbeitsverzeichnis$",\Arbeitsverzeichnis$)
    EndWith
    ClosePreferences() 
  EndIf
EndProcedure
;-MainWindow
 
  OpenWindow(#Mainwindow,             0,0,500,420,"MEXDatum = Modifiziere EXif-Datum mit dem Exiftool von Phil Harvey",
             #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  Lese_Pref()
  StickyWindow(#Mainwindow,#True)
  TextGadget(#TxtGadg_Std_Korr,     10,Top+10,180,20,"Datum lesen, Zeit ändern",#PB_Text_Center) : Top =Top + 30
  ComboBoxGadget(#combogadg_DaT_Art,10,Top,180,30) : Top = Top + 40
  AddGadgetItem(#combogadg_DaT_Art,0,"Zeit -2 Std")
  AddGadgetItem(#combogadg_DaT_Art,1,"Zeit -1 Std")
  AddGadgetItem(#combogadg_DaT_Art,2,"Datum +/-0 Std")
  AddGadgetItem(#combogadg_DaT_Art,3,"Zeit +1 Std")
  AddGadgetItem(#combogadg_DaT_Art,4,"Zeit +2 Std")
  SetGadgetState(#combogadg_DaT_Art,2) 
  If GetGadgetState(#combogadg_DaT_Art) = 2
    GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")
  EndIf
;   keine Korrektur, nicht verändert, es wird nur die Zeit ausgelesen
  
  ComboBoxGadget(#combogadg_DaT_Std,10,Top,180,30)    : Top = Top + 40                          
  AddGadgetItem(#combogadg_DaT_Std,0,"Setzen: Datum erstellt")
  AddGadgetItem(#combogadg_DaT_Std,1,"Setzen: Datum geändert")
  SetGadgetState(#combogadg_DaT_Std,0)
  GadgetToolTip(#combogadg_DaT_Std,"Wählt welches Datum korrigiert werden soll")
  TextGadget(#TxtGadget_Zeit,         10,Top,180,30,datum$,#PB_Text_Border|#PB_Text_Center) : Top = Top + 40
  SetGadgetText(#TxtGadget_Zeit, "Heute " + FormatDate("%dd.%mm.%yyyy %hh:%ii", Date()))
  ButtonGadget(#Button_Pfad_Wahl,          10,Top,180,30,"Setzen: Arbeitsverzeichnis",1) : Top = Top + 40 ; ButtonGadget mit blauem Rand :-)
  TextGadget  (#Textgadget_Arbeistsverzeichnis,           10,Top,180,35,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 45 ; zeigt den Pfad  
  SetGadgetText(#Textgadget_Arbeistsverzeichnis,Parameter\Arbeitsverzeichnis$)
  GadgetToolTip(#Button_Pfad_Wahl,"Wählt dasArbeitsverzeichnis mit den Dateien")
  
  ComboBoxGadget(#Combogadget_Datei_Wildcards,10, Top, 180, Hoehe) : Top = Top+40
  AddGadgetItem(#Combogadget_Datei_Wildcards,0,"Gopro: G* . MP4")
  AddGadgetItem(#Combogadget_Datei_Wildcards,1,"Video:  * . MP4")
  AddGadgetItem(#Combogadget_Datei_Wildcards,2,"Video:  * . MOV")
  SetGadgetState(#Combogadget_Datei_Wildcards,0)
  If GetGadgetState(#Combogadget_Datei_Wildcards) = 0 : Parameter\Datei_Parameter$ =  "G*.MP4": EndIf 
  
  ButtonGadget(#Button_Exif_Verzeichnis_suchen,   10,Top,180,30,"Setzen: Exifverzeichnis",1) : Top = Top + 40 
  GadgetToolTip(#Button_Exif_Verzeichnis_suchen, "Stellt das Verzeichnis mit dem ExifTool ein") 
  
  TextGadget(#TextGadget_Exif_Pfad,       10,Top,180,30,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 65 ; zeigt den Pfad  
  SetGadgetText(#TextGadget_Exif_Pfad,Parameter\Exif_Pfad$)
  
  
  ButtonGadget(#Button_Start_Datumsaenderung,       10, Top, 120, 30,"Start: Zeit",1) 
  GadgetToolTip(#Button_Start_Datumsaenderung, "startet einen Durchlauf, kann auch mehrfach betätigt werden") 
  ButtonGadget(#Button_Exif_Start,        270,Top,120,30,"Exiftool",1) 
  GadgetToolTip(#Button_Exif_Start, "startet das ExifTool") 
  ButtonGadget(#Button_Ende_Prgr,        140,Top,120,30,"Ende",1); ,#PB_Text_Center
  SetGadgetColor(#Button_Ende_Prgr, #PB_Gadget_BackColor, $000FF)
  GadgetToolTip(#Button_Ende_Prgr, "beendet das Programm") 
  ProgressBarGadget(#ProzessbarGadget,  10, Top -15, 480,  8, 0, 100)
  CheckBoxGadget(#CheckboxSticky, 400, Top , 100, 20, "Fenster oben")
  SetGadgetState(#CheckboxSticky,1)
  If #CheckboxSticky = 1 : StickyWindow(#Mainwindow,#True) : EndIf 
  
  EditorGadget(#EDGadget_Text_Ausgabe,          205,8,285, 355,#PB_Editor_ReadOnly|#PB_Editor_WordWrap)
  FrameGadget(#Rahmen1, 5, 5, 190, 360,"",#PB_Frame_Double)
  FrameGadget(#Rahmen2,202, 5, 290, 360,"",#PB_Frame_Double)
  InitHilfeTxT()
  
  Lese_Pref()
;----RepeatSchleife ---
  Repeat 
    Event = WaitWindowEvent()
  Select Event      ;auf Ereignis im Window warten
    Case #PB_Event_CloseWindow  ;Fenster schließen
      Ende=1
    Case #PB_Event_Gadget ; Ende-Taste drücken
      Select EventGadget()
    Case #Button_Ende_Prgr
      Ende=1
  ;- wähle Arbeitsordner     
    Case #Button_Pfad_Wahl 
      With Parameter
      \Arbeitsverzeichnis$=PathRequester("Arbeitsordner wählen",\Arbeitsverzeichnis$)
      SetGadgetText(#Textgadget_Arbeistsverzeichnis,\Arbeitsverzeichnis$)
      InitWildcards()
      EndWith
  ;- wähle Exif-Pfad 
    Case #Button_Exif_Verzeichnis_suchen                    
      With Parameter
     \Exif_Pfad$= PathRequester("ExifTool Pfad wählen", \Exif_Pfad$)
      SetGadgetText(#TextGadget_Exif_Pfad,\Exif_Pfad$)
      InitWildcards()
    EndWith
 ;- FileDate wählen
    Case #combogadg_DaT_Std                         
      Select GetGadgetState(#combogadg_DaT_Std)
       Case 0 : datums_flag = #PB_Date_Created:   ; gibt das Erstellungsdatum der Datei zurück
       Case 1 : datums_flag = #PB_Date_Modified:  ; gibt das Änderungsdatum der Datei zurück
      EndSelect
 ;- wähle Stunden+/- 
    Case #combogadg_DaT_Art                         
      Select GetGadgetState(#combogadg_DaT_Art)   ; das Datum korrigiert werden soll
        Case 0 : shift_hour_flag =  -2 : Tooltipp() 
        Case 1 : shift_hour_flag =  -1 : Tooltipp()
        Case 2 : shift_hour_flag =   0 : Tooltipp()
        Case 3 : shift_hour_flag =   1 : Tooltipp()
        Case 4 : shift_hour_flag =   2 : Tooltipp()
      EndSelect
  ;-wähle Parameter 
    Case #Combogadget_Datei_Wildcards             ; Auswählen welche Dateien korrigiert werden sollen
      With Parameter            
        Select GetGadgetState(#Combogadget_Datei_Wildcards)
          Case 0 : \Datei_Parameter$ =  "G*.MP4"
          Case 1 : \Datei_Parameter$ =  "*.MP4"
          Case 2 : \Datei_Parameter$ =  "*.MOV"
        EndSelect 
        InitWildcards()
      EndWith 
    
 ;- Start Datumsänderung            
    Case #Button_Start_Datumsaenderung 
        ClearGadgetItems(#EDGadget_Text_Ausgabe) 
        AendereDatum()
        
;- ExifTool Start        
    Case #Button_Exif_Start ; Exif Datum nach Filedatum verschieben
        If Not IsThread(Parameter\Thread)        
          InitWildcards()
          InitThread()
      Else
        MessageRequester("Info", "Thread läuft noch!")
      EndIf       
    Case   #CheckboxSticky 
       StickyWindow(#Mainwindow, GetGadgetState(#CheckboxSticky) )
     Case #PB_Event_CloseWindow :  End
    EndSelect
  EndSelect
Until Ende
  Schreibe_Pref()
  End
;----Bottom---