ReadProgramString

Für allgemeine Fragen zur Programmierung mit PureBasic.
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ReadProgramString

Beitrag von Axolotl »

Du musst dich weder entschuldigen noch rechtfertigen.
Aus meiner Sicht ist Programming mit ständigem lernen verbunden und das macht für mich den Reiz aus.
Nur so als Erinnerung: Mein Beispiel Test_Exif (link frühere Nachricht) verwendet auch einen Thread. A.m.S. so einfach wie Windows es zulässt.
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ReadProgramString

Beitrag von Axolotl »

dibro hat geschrieben: 21.11.2022 17:53 ...
Die MEXDatum.pref wird im aktuellen Verzeichnis gesucht und wenn nicht gefunden, neu angelegt, ich hatte nicht beabsichtigt, eine Installationsroutine dazu zu schreiben, weil ich keine DLLs und inlude verwende. Das Prog ist ja nur für mich.
...


Da habe ich mich wohl missverständlich ausgedrückt. Um eine Installationsroutine soll es gar nicht gehen.
Damit der Speicherort von "MEXDatum.pref" nicht zufällig ist, würde ich immer einen definierten Pfad davor schreiben.
Aber das ist nur meine Meinung.

Anbei ein kleines Beispiel. Je nach dem wo Du dein ausführbares Program (.exe) abspeicherst, kannst Du den dazu passenden Ordner verwenden.
Ich verwende gerne den Program-Ordner, weil ich die Applicationen in einem Tools Ordner ausserhalb der Windows-Verzeichnisse halte.

Code: Alles auswählen

EnableExplicit 

#ProgramName$          = "MEXDatum"   ; Application Name 
#ProgramDataFolder$    = "MEXDatum\"  ;  

; ------------------------------------------- 

Procedure.s GetProgramDirectory() 
  Static s_path$ = ""                                                          :Debug #PB_Compiler_Procedure+"() "

  If s_path$ = ""  ; evaluate directory only once 
    CompilerIf #PB_Compiler_Debugger ; .. at development time 
      CompilerIf #PB_Compiler_Filename = "PB_EditorOutput.pb" ; >> unnamed file is called 'PB_EditorOutput.pb' 
        Debug "HINT: " + #PB_Compiler_Procedure + "() with unsaved main source file " 
  	  CompilerEndIf 
	    s_path$ = #PB_Compiler_FilePath  ; depends on Compiler Options (where the temp executable is created) 
    CompilerElse ; .. at runtime 
      s_path$ = GetPathPart(ProgramFilename()) 
    CompilerEndIf 
  EndIf 
  ProcedureReturn s_path$ 
EndProcedure 

; ------------------------------------------- 

Procedure.s GetPreferencesFilename() 
  Protected result$ 

  ; >> set the directory 
  result$ = GetProgramDirectory()                              ; application locates in directory with write access. 
; result$ = GetUserDirectory(#PB_Directory_ProgramData)        ; program data directory of the current logged user.
; result$ = GetEnvironmentVariable("APPDATA") + #PS$           ;    "  (i.e. ...\AppData\Roaming\ 
; result$ = GetUserDirectory(#PB_Directory_AllUserData)        ; common program data directory (accessible to all users)
; result$ = GetEnvironmentVariable("LOCALAPPDATA") + #PS$      ; ...\AppData\Local\
  ; >> add a program folder   
; result$ + #ProgramDataFolder$ 
  ; >> add filename 
  result$ + #ProgramName$ + ".pref" 
  ProcedureReturn result$ 
EndProcedure 

Debug "My Preferences ==> " + GetPreferencesFilename() 
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ReadProgramString

Beitrag von mk-soft »

Programm Einstellungen gehören nicht mehr in das Programm und diese wird auch manchmal gesperrt.

Link: Module PathHelper
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: ReadProgramString

Beitrag von dibro »

ich weiß, ich bin lästig, habe aber wieder ein neues Problem.
Mein Thread lief nicht wegen eine fehlenden Klammer, die ich lange gesucht habe :cry:
Vorher war es eine Prozedur mit Rückgabewert und das kann der Thread ja nicht und der Compiler meckert.
Was vorher bei der Prozedur auch lief, war der folgende Prozeduraufruf AendereDatum(), der sich jetz vordrängt.
Ich habe alles mögliche probiert und bin zuletzt hier gelandet was aber leider auch nicht funktioniert, mit TIME drängt sich AendereDatum() vor, ohne geht's nicht:

Code: Alles auswählen

;- ExifTool Start        
      Case #Button_Exif_Start ; Exif Datum nach Filedatum verschieben
        InitParameter()         
        fertig =CreateThread(@ExifRun(),@Parameter)
        If fertig
          WaitThread(fertig,100)   
          SetGadgetState(#combogadg_DaT_Art,2)      
          shift_hour_flag = 0                       
          AendereDatum()                             
        EndIf
Ich habe den Thread jetzt über die Prozedur aufgerufen:

Code: Alles auswählen

Procedure InitParameter()

  Protected Pfad$, ArbVerz$, Wildcards$, State.i, Watch.i, Thr.i, Abbr.i
  
  Pfad$ = GetGadgetText(#TextGadget_Exif_Pfad)

  ArbVerz$ = GetGadgetText(#Textgadget_Arbeistsverzeichnis)
  
  State = GetGadgetState(#Combogadget_Datei_Wildcards)
  If State = 0 : Wildcards$ = "G*.MP4" : EndIf
  If State = 1 : Wildcards$ = "*.MP4"  : EndIf
  If State = 2 : Wildcards$ = "*.MOV"  : EndIf
 
  ;init Struct 
   With Parameter      
     \Exif_Pfad$          = Pfad$ 
     \EXIF_Executable$    = "ExifTool.exe"
     \Exif_Kommando$      = " -filemodifydate<createdate" + " -filecreatedate<createdate "
     \Datei_Parameter$    = Wildcards$
     \Arbeitsverzeichnis$ = ArbVerz$
     \Thread               = CreateThread(@ExifRun(),@Parameter)
     EndWith 
EndProcedure
In der Windowsschleife sieht das dann so aus

Code: Alles auswählen

;- ExifTool Start        
    Case #Button_Exif_Start ; Exif Datum nach Filedatum verschieben
      InitParameter() 
      WaitThread(Parameter\Thread)
Da hängt das Programm ohne weitere Meldung, erst wenn ich einen Wert bei TIME eintrage, läuft es.
Ich möchte aber verhindern, dass während das Exiftool läuft, manuell Pfade verstellt oder eine andere Aktivität ausgeführt wird.

Was mache ich da schon wieder falsch?
Lieber doch wieder als Prozedur laufen lassen?

Viele Grüße
Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ReadProgramString

Beitrag von mk-soft »

Du kannst vor dem Start des Threads die Gadgets sperren (DisableGadget). Mit einem PostEvent aus dem Thread kannst du dann die Gadgets wieder der freigeben.

Code: Alles auswählen

;- ExifTool Start        
    Case #Button_Exif_Start ; Exif Datum nach Filedatum verschieben
      If Not IsThread(Parameter\Thread)
        InitParameter()
      Else
        MessageRequester("Info", "Thread läuft noch!")
      EndIf
      
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ReadProgramString

Beitrag von Axolotl »

Moin,

dein erster Code-Ausschnitt zeigt, dass Du das Thema Thread noch nicht vollständig verstanden hast. :twisted:
Warum?

Code: Alles auswählen

fertig =CreateThread(@ExifRun(),@Parameter)
        If fertig
          WaitThread(fertig,100)   
          SetGadgetState(#combogadg_DaT_Art,2)      
          shift_hour_flag = 0                       
          AendereDatum()                             
        EndIf
Ein Thread wird immer parallel abgearbeitet. Hier kommt bei Erfolg eine Thread Nummer (oder 0 im Fehlerfall) zurück.
Mit WaitThread() stoppst du deinen Programablauf bis der Thread beendet wird oder in deinem Beispiel nach 100 ms timeout.
Dieses Ergebnis wertest du nicht aus, sondern setzt anschließend den Status in der Combobox, usw.
Deshalb schreibst du, dass sich AendereDatum() vordrängt, weil der Thread-Code noch (parallel) läuft und läuft bis er fertig ist.
....
Lösung: Siehe Antwort von mk-soft.

BTW: Du bist nicht lästig, wir müssten Dir ja nicht antworten... :oops:
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: ReadProgramString

Beitrag von dibro »

Da bin ich nochmal,
"ich habe fertig" :D
Zumindestens läuft es so, wie ich es möchte. Vieleicht kein optimaler Code, aber ich bin stolz wie Oskar :allright:
Vielen Dank für die Mithilfe.
Ich werde zunächst mal die Tutorials durcharbeiten, weil die aber mit PB 6.0 nicht alle laufen, muss ich sie auf den neuesten Stand bringen, da lerne ich dann noch ein bisschen mehr dabei. Auf jeden Fall ist das ein schönes Hobby.
Dann bis zum nächsten Mal.

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 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 
  #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

;-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 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 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()
  If GetCurrentDirectory()
    If OpenPreferences("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
   If GetCurrentDirectory()
    OpenPreferences("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",#PB_Text_Center) : Top = Top + 40
  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",#PB_Text_Center) : 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",#PB_Text_Center) ; #Button_Start_Datumsaenderung,5,200,60,30
  GadgetToolTip(#Button_Start_Datumsaenderung, "startet einen Durchlauf, kann auch mehrfach betätigt werden") 
  ButtonGadget(#Button_Exif_Start,        270,Top,120,30,"Exiftool",#PB_Text_Center) ; #Button_Start_Datumsaenderung,5,200,60,30
  GadgetToolTip(#Button_Exif_Start, "startet das ExifTool") 

  ButtonGadget(#Button_Ende_Prgr,        140,Top,120,30,"Ende",#PB_Text_Center) ;#Button_Ende_Prgr,135,200,60,30,
  SetGadgetColor(#Button_Ende_Prgr, #PB_Gadget_FrontColor, $0000FF)
  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)
  InitHilfeTxT()
  StartDrawing(WindowOutput(#Mainwindow)) ;Rahmen zeichnen
          DrawingMode(#PB_2DDrawing_Outlined)
          Box(                      5, 5, 190, 360, RGB(255, 0, 0) ) 
          Box(                    202, 5, 290, 360, RGB(255, 0, 0))
          StopDrawing()

  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---

      
  
      
  
Viele Grüße Dieter
Nachtrag: Ich habe noch ein paar nicht verwendete protected Variable weggemacht
Zuletzt geändert von dibro am 27.11.2022 10:11, insgesamt 1-mal geändert.
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ReadProgramString

Beitrag von mk-soft »

;)

Für die Zukunft. Unter Windows kann man noch aus Threads Gadget Funktionen durchführen (Aber nicht alle)
Bei Linux und macOS führt diese zum Absturz vom Programm.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: ReadProgramString

Beitrag von dibro »

Danke für den Hinweis, beim nächsten Mal, jetzt lasse ich es so...
Aber ich habe noch zwei ganz einfache Fragen:
1. Warum haben meine Buttons einen blauen Rand? - War plötzlich da
2. Warum hat Setgadgetcolor() in Zeile 327 keine Wirkung?
Danke und viele Grüße
Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ReadProgramString

Beitrag von mk-soft »

Den blauen Rand am Button kommt von den ungültigen Flag '#PB_Text_Center'

Buttons können keine Farbe zugewiesen werden. Liegt nicht an PB, sondern an der OS Theme.

Code: Alles auswählen

Debug #PB_Text_Center
Debug #PB_Button_Default
Für den Ziel Ordner für die Einstellungen 'GetCurrentDirectory()' zu nehmen ist keine gute Wahl.
Der Start Ordner vom Programm kann sich ändern und somit der Ort Deiner Einstellung.

Einstellungen gehören auch nicht in den Programm Ordner. Ein Standard Benutzer unter Windows hat auch keine Schreibberechtigung in den Programm Ordner

Die Einstellungen gehören in die %appdata% des jeweiligen Benutzer.

Ein Teil aus den PathHelper (Link bereits geschrieben)

Code: Alles auswählen

; Change names
CompilerIf Defined(CompanyName, #PB_Constant) = 0
	#CompanyName = "dein-name"
CompilerEndIf

CompilerIf Defined(ApplicationName, #PB_Constant) = 0
	#ApplicationName = "deine-anwendung"
CompilerEndIf

Procedure.s GetProgramDataPath()
  Protected basePath.s, subPath.s, dataPath.s
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    basePath = GetHomeDirectory()
    subPath = basePath + "." + #CompanyName + #PS$
  CompilerElse
    basePath = GetUserDirectory(#PB_Directory_ProgramData)
    subPath = basePath + #CompanyName + #PS$
  CompilerEndIf
  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

;- Test
CompilerIf #PB_Compiler_IsMainFile
  
  path.s = GetProgramDataPath()
  RunProgram("explorer", path, "")
  
CompilerEndIf
P.S.
Dein malen auf den WindowOutput() must du in eine Procedure packen und auch bei dem Event #PB_Event_Repaint aufrufen.
Sonst ist dein Roter Rahmen irgendwann weg. (Schiebe dein Fenster über den Rand vom Monitor)
Hier vielleicht das FrameGadget nehmen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten