ReadProgramString

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

ReadProgramString

Beitrag von GreyEnt »

Hallo Forum.
Haette mal eine Frage ob ich da was besser machen kann.
Habe den Delay(600) eingesetzt weil der Befehl ReadProgramString(Erg500,#PB_UTF8 ) bei einer Bestimmten Abfrage in der Schleife blockiert.
Ich meine bei zig Durchläufen klappt es. Und dann blockiert es.
Ich vermute das es einfach ein bisschen braucht bis der Befehl "ReadProgramString" auf die Daten zugreifen kann?
Ohne Delay funktioniert die Schleife auch. Aber nicht zu 100%.
Gibt es eine Möglichkeit den Delay zu umgehen? Bzw. muß ich den Befehl "ReadProgramString" anders handhaben?

Gerne stelle ich auch das Gesamtwerk rein. Ist aber noch weniger als Alpha.
Ziel des eigentlichen Programms ist den Inhalt eines Verzeichnisses in einer Liste darzustellen.
Dazu sollen auch die Metadaten/Exifdaten der einzelnen Dateien in einem ListIconGadget sortiert werden.
Und dafür würde ich gern das Tool "Exiftool.exe" einsetzen.

Vielen Dank schonmal für Alles.
Und wünsche eine Besinnliche Weihnachtszeit.
Gruß
GreyEnt

Code: Alles auswählen

...
Erg500 = RunProgram("c:\zw\db\exiftool.exe", " "+datein$,"c:\zw\db\", #PB_Program_Hide | #PB_Program_Open | #PB_Program_Read )
                    
                    If Erg500<>0
                      Delay(600)
                      
                      apo=AvailableProgramOutput(Erg500)
                      If apo<>0
                        
                        For b500=1 To 1000
                          Ergeb500$ = ReadProgramString(Erg500,#PB_UTF8   )
                          Debug Ergeb500$
                          If Ergeb500$=""
                            Break
                          EndIf
                        Next
                        
                      EndIf
                      
                      KillProgram(Erg500)
                      CloseProgram(Erg500)
                      
                    EndIf
                    
                  EndIf
                  ...
                  
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ReadProgramString

Beitrag von Kiffi »

Orientiere Dich einfach an dem Beispiel, das Du unter RunProgram() unten auf der Seite findest.
Hygge
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Re: ReadProgramString

Beitrag von GreyEnt »

@Kiffi.
Danke, danke... :)
Wie doof von mir. Und wie schön das Ihr Geduld habt.
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: ReadProgramString

Beitrag von juergenkulow »

Code: Alles auswählen

; exiftool.exe beendet nicht immer von alleine und gibt Exitcode und Fehlerausgabe (stderr) aus. 
Declare.s myRunProgram(File.s, Parameter.s, WorkDir.s, Flags=#PB_Program_Open | #PB_Program_Read | #PB_Program_Error,msLaufzeit=10000)
                  
Compiler.s="c:\zw\db\exiftool.exe"
Datei.s="c:\zw\db\nichtda.png"
Parameter.s=""
Arbeitsverzeichnis.s="c:\zw\db\"
Flags=#PB_Program_Open | #PB_Program_Read | #PB_Program_Error |#PB_Program_Hide
Debug myRunProgram(Compiler, Datei+" "+Parameter, Arbeitsverzeichnis, Flags,1400)                  
End                  
                  
#TxtConsoleName="Errorcode"
#TxtmyRunProgramRuntime="Runtime"
#TxtmyRunProgramms=" ms"
#TxtmyRunProgramOK="OK"
#TxtmyRunProgramErrorcode="Errorcode: "
#TxtmyRunProgramFATAL="FATAL"
#TxtmyRunProgramCantStart="Can't start Program:"
#TxtmyRunProgramMaxRuntime="Programstop. Program needs to much runtime."
#NewLine=#CRLF$ ;Windows 

Procedure.s myRunProgram(File.s, Parameter.s, WorkDir.s, Flags=#PB_Program_Open | #PB_Program_Read | #PB_Program_Error,msLaufzeit=10000)
  Protected Output.s="", Exitcode, NoErrText
  Protected NewErrorText.s, AllErrorTexts.s=""
  Protected start=ElapsedMilliseconds()
  Protected Program=RunProgram(File, Parameter, WorkDir, Flags) 
  If Program
    While ProgramRunning(Program) And ElapsedMilliseconds()-start<=msLaufzeit
      If AvailableProgramOutput(Program)
        Output + ReadProgramString(Program) + #NewLine
      EndIf
      NewErrorText=ReadProgramError(Program) 
      While NewErrorText<>""
        NoErrText+1
        AllErrorTexts + Str(NoErrText)+":"+NewErrorText+#NewLine
        NewErrorText=ReadProgramError(Program) 
      Wend  
    Wend
    Output+File+" "+#TxtmyRunProgramRuntime+":"+Str(ElapsedMilliseconds()-start)+#TxtmyRunProgramms+#NewLine  
    If ElapsedMilliseconds()-start<=msLaufzeit    
      Exitcode=ProgramExitCode(Program)
      If Exitcode<>0
        If 0=Exitcode 
          Output+#TxtmyRunProgramOK
        Else   
          Output+#TxtmyRunProgramErrorcode + Str(Exitcode) + #NewLine
          Output+AllErrorTexts
        EndIf 
      EndIf 
    Else 
      If 0<>IsProgram(Program) 
        KillProgram(Program)
        CloseProgram(Program)
        Output+#TxtmyRunProgramMaxRuntime + #NewLine +AllErrorTexts
      EndIf 
    EndIf 
    SetClipboardText(Output) 
    ProcedureReturn Output
  Else
    MessageRequester(#TxtmyRunProgramFATAL,#TxtmyRunProgramCantStart+File+" "+Parameter+" "+WorkDir) 
    End 
  EndIf
EndProcedure

; Datei.s=""
; NAME
;     exiftool - Read And write meta information in files
; 
; RUNNING IN WINDOWS
;...
;     exiftool -exif:all= -tagsfromfile @ -all:all -unsafe bad.jpg
;          Rebuild all EXIF meta information from scratch in an image. This
; c:\zw\db\exiftool.exe Runtime:1401 ms
; Programstop. Program needs to much runtime.

; Datei.s="D:\25Regeln.pdf"
; ExifTool Version Number         : 12.36
; File Name                       : 25Regeln.pdf
; Directory                       : D:/
; File Size                       : 18 KiB
; File Modification Date/Time     : 2021:07:17 08:17:18+02:00
; File Access Date/Time           : 2021:12:08 00:00:00+01:00
; File Creation Date/Time         : 2021:07:17 08:17:18+02:00
; File Permissions                : -rw-rw-rw-
; File Type                       : PDF
; File Type Extension             : pdf
; MIME Type                       : application/pdf
; PDF Version                     : 1.4
; Linearized                      : No
; Page Count                      : 1
; Language                        : de-DE
; Creator                         : Writer
; Producer                        : LibreOffice 6.0
; Create Date                     : 2021:07:17 09:17:18+02:00
; c:\zw\db\exiftool.exe Runtime:596 ms

; Datei.s="c:/zw/db/nichtda.png"
; c:\zw\db\exiftool.exe Runtime:548 ms
; Errorcode: 1
; 1:Error: File not found - c:/zw/db/nichtda.png
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Re: ReadProgramString

Beitrag von GreyEnt »

@juergen
vielen dank für den code. der ist echt hammer.
wie du geschrieben hast verhaelt sich die "exiftool.exe" manchmal doof.
danke, danke.

Gruß
GreyEnt
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ReadProgramString

Beitrag von mk-soft »

Tip and Tricks:
You can also read more information from any file directly in Purebasic without an external tool via VBS.

Ok: ... Hier kann ich auch in Deutsch schreiben

Tipps und Tricks:
Sie können auch mehr Informationen aus jeder Datei direkt mit Purebasic ohne ein externes Tool mit VBS lesen.

Module ActiveScript and VBS DetailOfFile
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Re: ReadProgramString

Beitrag von GreyEnt »

@mk-soft.
Dankeschön. Das wäre ja noch besser. Heist mehr Informationen auch das ich die Meta Daten lesen kann?
Gruß
GreyEnt
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ReadProgramString

Beitrag von mk-soft »

Hiermit kann man die Daten auslesen die nach norm Windows hinterlegt sind. Ob das die kompletten Meta Daten sind, weiss ich nicht.
Aber zum Beispiel von Bildern sind alles Daten vorhanden.
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 »

Hi,
ich bin schon etwas weiter, stecke aber jetzt mit einem neuen Problem fest.
Ich habe mir hier in dem ausgezeichneten Forum einige Beispiele zusammengesucht und mit deren Hilfe mein Prog komplettiert.
Das Problem: Im Editor läuft es, mit und ohne Debugger, aber als EXE kann es das Exiftool nicht finden/ausführen.
Für Verbesserungstipps bin ich dankbar.
Ich weiß nicht mehr weiter, wer kann helfen?
Vielen Dank Dieter

Update
nachstehend mein letzter Code, der läuft, auch als EXE. Kleiner Schönheitsfehler, das Editorgadget wird nicht richtig gelöscht, d.h. nur verzögert.
Ich habe schon alles Mögliche probiert, leider ohne Erfolg. Ich weiß nicht, woran es liegt.

Code: Alles auswählen

;MEXDatum Modifiziere EXif DaTum von Video-Dateien mit EXiftool  

;exiftool.exe -G1 -a -s -time:all *.MP4) =>> alle Zeiten auslesen
;exiftool.exe "-filemodifydate<createdate"  "-filecreatedate<createdate" *.MP4 =>> Zeiten kopieren
;exiftool.exe -G1 -a -s -time:all G*.MP4
;exiftool "-filemodifydate<createdate"  "-filecreatedate<createdate"  G*.MP4
; -------------------------------------------------------------------------------------------------------
Declare.s ExifRun(ExifTool_Pfad$, Pfad_File$, Arbeitverzeichnis$, Flags)

EnableExplicit

#Mainwindow = 1

Enumeration : #Datgadg : #Pfad_Wahl : #Start_Button : #Ende_Button : #TxtGadg_Std_Korr
  #Pfad_Txt : #TxtGadg_Zeit : #combogadg_DaT_Art : #combogadg_DaT_Std : #Exif_Button : #Exif_Verzeichnis  
  #Exif_Text: #Exif_Pfad_Text : #Combogadget_Datei 
                 
EndEnumeration

#TxtConsoleName            =  "Fehlercode"
#TxtmyRunProgramRuntime    =  "Laufzeit"
#TxtmyRunProgramms         =  " ms"
#TxtmyRunProgramOK         =  "OK"
#TxtmyRunProgramErrorcode  =  "Fehlercode: "
#TxtmyRunProgramFATAL      =  "Fataler Fehler"
#TxtmyRunProgramCantStart  =  "Programm kann nicht gestartet werden:"
#NewLine=#CRLF$               ;Windows 




Global Arbeitsverzeichnis$  = " "
Global ExifName$ =            "ExifTool.exe"
Global ExifPfad$  =           " "
Global ExifTool_Pfad$=        " "
Global Datei$  =              " " 

Global Option$ =  " -filemodifydate<createdate" + " -filecreatedate<createdate " 
Global Pfad_File$ = Option$+Arbeitsverzeichnis$+Datei$     
Global Flags=#PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Hide ;| #PB_Program_Wait
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 DatumsWert           ; Zahlenwert Datum
Global DW_neu               ; Änderung mit Stundendifferenz
Global Ausgabetext$         ; "Datenausgabe"
Global Gadget
Global Top = 5 
Global Hoehe = 30
Global Neu = 1
Global Ende, i
; -------------------------------
Procedure.s ExifRun(ExifTool_Pfad$, Pfad_File$, Arbeitsverzeichnis$, Flags)
  
  Protected Exitcode, NoErrText
  Protected NewErrorText$, AllErrorText$=""
  Protected start = ElapsedMilliseconds()
  Protected Pfad$ = Pfad_File$
  Protected Program
  
  Program = RunProgram(ExifTool_Pfad$, Pfad$, Arbeitsverzeichnis$, Flags)
   If Program    
    While ProgramRunning(Program) 
      If AvailableProgramOutput(Program)                  
        Ausgabetext$ = Datei$ +" "+ ReadProgramString(Program) ;+ #NewLine 
      EndIf
        NewErrorText$=ReadProgramError(Program) 
      While NewErrorText$<>""
        NoErrText+1
        AllErrorText$ + Str(NoErrText)+":"+NewErrorText$+#NewLine
        NewErrorText$=ReadProgramError(Program) 
      Wend 

    Wend
    Ausgabetext$+" "+#TxtmyRunProgramRuntime+":"+Str(ElapsedMilliseconds()-start)+#TxtmyRunProgramms+#NewLine  
    If ElapsedMilliseconds()-start    
      Exitcode=ProgramExitCode(Program)
      If Exitcode<>0
        If 0=Exitcode 
          Ausgabetext$+#TxtmyRunProgramOK 
        Else   
          Ausgabetext$ + #TxtmyRunProgramErrorcode + Str(Exitcode) + #NewLine
          Ausgabetext$ + AllErrorText$ 
        EndIf 
      EndIf

    Else 
      If 0<>IsProgram(Program) 
        KillProgram(Program)
        CloseProgram(Program)
       Ausgabetext$ = Ausgabetext$ +" " + #NewLine +AllErrorText$ +" " 
      EndIf 
    EndIf 
    ProcedureReturn Ausgabetext$
  Else
    MessageRequester(#TxtmyRunProgramFATAL,#TxtmyRunProgramCantStart+" "+ ExifTool_Pfad$+Pfad$+" 2 ") 
  EndIf
EndProcedure



Procedure AendereDatum(Arbeitsverzeichnis$)
   
  Protected Zeit$,  gefunden, Pfad$

  gefunden = ExamineDirectory(#PB_Any, Arbeitsverzeichnis$, Datei$) 
  If gefunden 
    While NextDirectoryEntry(gefunden) 
      If DirectoryEntryType(gefunden) = #PB_DirectoryEntry_File
        Pfad$ = DirectoryEntryName(gefunden) 
          If FileSize(Pfad$) =  FileSize(Datei$)
            Pfad$ = Arbeitsverzeichnis$ + Pfad$ 
            DatumsWert = GetFileDate(Pfad$,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(Pfad$,datums_flag,ParseDate("%dd.%mm.%yyyy:%hh.%ii",zeit$))
            SetGadgetText(#TxtGadg_Zeit, Zeit$)                              
            Ausgabetext$ = Pfad$ + " " + Zeit$
            AddGadgetItem(#Exif_Text, -1, Ausgabetext$) ; +#NewLine
          Else
            Ausgabetext$ = "keine Datei gefunden"
            AddGadgetItem(#Exif_Text, -1, Ausgabetext$ + #NewLine)
          EndIf
      EndIf
    Wend
    FinishDirectory(gefunden)
  Else 
    Ausgabetext$  = "Datei nicht gefunden, Arbeitsverzeichnis gesetzt?"
    AddGadgetItem(#Exif_Text, -1, Ausgabetext$ + #NewLine)
 EndIf

EndProcedure
;  Erstellt eine Preference-Datei namens MEXDatum.ini  ------------------------------
If OpenPreferences("MEXDatum.ini")
   PreferenceGroup("Global")
    Arbeitsverzeichnis$ = ReadPreferenceString("Arbeitsverzeichnis$","") 
    ExifName$ = ReadPreferenceString("ExifName$","")
    ExifPfad$ = ReadPreferenceString("ExifPfad$","")         
    ExifTool_Pfad$ = ReadPreferenceString("ExifTool_Pfad$","")
    Datei$ = ReadPreferenceString("Datei$","")
    ClosePreferences()
  Else
    CreatePreferences("MEXDatum.ini")
    ClosePreferences()
  EndIf
 
    
    
; ----------------------------------

; --- Window #HWnd,0,0,250,250,"Dateidatum und Zeiten einstellen, verwendet das Exiftool von Phil Harvey"
OpenWindow(#Mainwindow,             0,0,500,420,"Modifiziere Exif Datum mit dem Exiftool von Phil Harvey",
           #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
            StickyWindow(#Mainwindow,#True)

 


  TextGadget(#TxtGadg_Std_Korr,     10,Top,180,20,"Stundenkorrektur",#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,"Zeit +/-0 Std")
  AddGadgetItem(#combogadg_DaT_Art,3,"Zeit +1 Std")
  AddGadgetItem(#combogadg_DaT_Art,4,"Zeit +2 Std")
  SetGadgetState(#combogadg_DaT_Art,2) 
  If #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(#TxtGadg_Zeit,         10,Top,180,30,datum$,#PB_Text_Border|#PB_Text_Center) : Top = Top + 40
  
  ButtonGadget(#Pfad_Wahl,          10,Top,180,30,"Setzen: Arbeitsverzeichnis",#PB_Text_Center) : Top = Top + 40
  TextGadget  (#Pfad_Txt,           10,Top,180,35,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 45 ; zeigt den Pfad  
  SetGadgetText(#Pfad_Txt,Arbeitsverzeichnis$)
  GadgetToolTip(#Pfad_Wahl,"Wählt dasArbeitsverzeichnis mit den Dateien")
  
  ComboBoxGadget(#Combogadget_Datei,10, Top, 180, Hoehe) : Top = Top+40
  AddGadgetItem(#Combogadget_Datei,0,"Gopro: G* . MP4")
  AddGadgetItem(#Combogadget_Datei,1,"Video:  * . MP4")
  AddGadgetItem(#Combogadget_Datei,2,"Video:  * . MOV")
  SetGadgetState(#Combogadget_Datei,0)
  
  ButtonGadget(#Exif_Verzeichnis,   10,Top,180,30,"Setzen: Exifverzeichnis",#PB_Text_Center) : Top = Top + 40
  GadgetToolTip(#Exif_Verzeichnis, "Stellt das Verzeichnis mit dem ExifTool ein") 
  
  TextGadget(#Exif_Pfad_Text,       10,Top,180,30,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 60 ; zeigt den Pfad  
  SetGadgetText(#Exif_Pfad_Text,ExifPfad$)
  ExifTool_Pfad$ = ExifPfad$+ExifName$
  
  
  ButtonGadget(#Start_Button,       10, Top, 120, 30,"Start: Zeit",#PB_Text_Center) ; #Start_Button,5,200,60,30
  GadgetToolTip(#Start_Button, "startet einen Durchlauf, kann auch mehrfach betätigt werden") 
   
  ButtonGadget(#Exif_Button,        270,Top,120,30,"Exiftool",#PB_Text_Center) ; #Start_Button,5,200,60,30
  GadgetToolTip(#Exif_Button, "startet das ExifTool") 

  ButtonGadget(#Ende_Button,        140,Top,120,30,"Ende",#PB_Text_Center) ;#Ende_Button,135,200,60,30,
  SetGadgetColor(#Ende_Button, #PB_Gadget_FrontColor, $0000FF)
  GadgetToolTip(#Ende_Button, "beendet das Programm") 

  
  
  EditorGadget(#Exif_Text,          205,8,285, 355,#PB_Editor_ReadOnly|#PB_Editor_WordWrap)
  Ausgabetext$ = " 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.ini " + #NewLine +
                 " Die Funktionen Start und ExifTool können mehrfach aufgerufen werden " + #NewLine +
                 " Der Button ExifTool setzt die Zeitänderungen wieder zurück "
 
  If Neu 
    SetGadgetText(#Exif_Text,Ausgabetext$)
    Neu = 0
  EndIf 
  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()
 

; --- Main -------------
Repeat
  Select WaitWindowEvent()    ;Fenster aufrufen und auf Ereignis warten
  Case #PB_Event_CloseWindow  ;Fenster schließen
    Ende=1
  
  Case #PB_Event_Gadget ; Ende-Taste drücken
    Select EventGadget()
  Case #Ende_Button
      Ende=1
      
  Case #Pfad_Wahl ;Ordner auswählen
      Arbeitsverzeichnis$=PathRequester("Arbeitsordner wählen",Arbeitsverzeichnis$)
      SetGadgetText(#Pfad_Txt,Arbeitsverzeichnis$)
      Pfad_File$ = Arbeitsverzeichnis$   +Datei$ 
  Case #Exif_Verzeichnis ; Exif-Pfad auswählen
      ExifPfad$=PathRequester("Ordner wählen",ExifPfad$)
      SetGadgetText(#Exif_Pfad_Text,ExifPfad$+ExifName$)
      ExifTool_Pfad$=ExifPfad$+ExifName$
  Case #combogadg_DaT_Std                         ; Auswählen welche Zeitdaten korrigiert werden sollen
      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
    
  Case #combogadg_DaT_Art                         ; Auswählen um wieviel Stunden 
      Select GetGadgetState(#combogadg_DaT_Art)   ; das Datum korrigiert werden soll
        Case 0 : shift_hour_flag =  -2
        Case 1 : shift_hour_flag =  -1
        Case 2 : shift_hour_flag =   0
        Case 3 : shift_hour_flag =   1
        Case 4 : shift_hour_flag =   2  
      EndSelect
    Case #Combogadget_Datei                       ; Auswählen welche Dateien korrigiert werden sollen
      Select GetGadgetState(#Combogadget_Datei)
        Case 0 : Datei$ =  "G*.MP4"
        Case 1 : Datei$ =  "*.MP4"
        Case 2 : Datei$ =  "*.MOV"
      EndSelect    
    Case #PB_Event_CloseWindow :  End
             
    Case #Start_Button ; Zeitänderung starten
        ClearGadgetItems(#Exif_Text) 
        AendereDatum(Arbeitsverzeichnis$)
        
  Case #Exif_Button ; Exif Datum nach Filedatum verschieben
        ClearGadgetItems(#Exif_Text) 
        While WindowEvent() : Wend
        If GetGadgetState(#Combogadget_Datei) = 0 : Datei$ = "G*.MP4" : EndIf 
        If GetGadgetState(#Combogadget_Datei) = 1 : Datei$ =  "*.MP4" : EndIf 
        If GetGadgetState(#Combogadget_Datei) = 2 : Datei$ =  "*.MOV" : EndIf 
        Pfad_File$ = Option$+Arbeitsverzeichnis$+Datei$ 
        ExifTool_Pfad$ = ExifPfad$ + "Exiftool.exe"   
        ExifRun(ExifTool_Pfad$, Pfad_File$, Arbeitsverzeichnis$, Flags) 
        AddGadgetItem(#Exif_Text,-1,Ausgabetext$+#NewLine)
    EndSelect 
          
EndSelect
Until Ende
OpenPreferences("MEXDatum.ini")
PreferenceGroup("Global")
    WritePreferenceString("Arbeitsverzeichnis$",Arbeitsverzeichnis$)
    WritePreferenceString("ExifName$",ExifName$)
    WritePreferenceString("ExifPfad$",ExifPfad$)
    WritePreferenceString("ExifTool_Pfad$",ExifTool_Pfad$)
    WritePreferenceString("Datei$",Datei$)
    ClosePreferences()
End
Auf den letzten Stand gebracht, 2.11.2022
Wieder mit While WindowEvent() : Wend
Dieter
Zuletzt geändert von dibro am 02.11.2022 19:31, insgesamt 3-mal geändert.
Gruß aus Solingen, PB 6.0 Win 10 Pro
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ReadProgramString

Beitrag von Axolotl »

Ich kann es nicht ausprobieren, da ich das exiftool nicht habe/brauche....
Trotzdem versuche ich mich mal:
Für die Ausführung wird das exiftool laut code mit vollständigem Namen aufgerufen.
Wo läuft denn das Program lang?
Zeigt denn der MessageRequester in Zeile 96 etwas an?

Ich nutze in solchen Fällen immer meine LogToFile() Funktion, ähnlich dem Debug Befehl schreibt der Nachrichten in eine Datei.
Die Datei heißt immer wie die Exe-Datei und liegt auch im gleichen Verzeichenis.
Weil ich meine Progrämmchen nie in die ProgramFolder Verzeichnisse speichere.
Hier mal der code. Ich hoffe, ich habe alles mithiineinkopiert. :oops:

Code: Alles auswählen

;     ; initalized in main source file, used in include files ... 
  #DEVELOPMENT_MainSourcePath$ = #PB_Compiler_FilePath 
  #DEVELOPMENT_MainSourceName$ = #PB_Compiler_Filename 
  ; standard constants in my applications 
  #ES$         = "."  
  #LogExt$     = "log" 
  #DefaultSourceName$          = "PB_EditorOutput.pb"  ; used by compiler if file is not saved! 

  Procedure LogToFile(Message$) 
    Static s_logfile$ = "" 
    Protected FID, file$, path$ 

    If s_logfile$ = ""  ; first call 
      CompilerIf #PB_Compiler_Debugger         ; .. at development time 
        CompilerIf #DEVELOPMENT_MainSourceName$ = #DefaultSourceName$ 
          Debug "HINT: " + #PB_Compiler_Procedure + "() with unsaved main file " 
          file$ = ""  ; return empty string 
    	  CompilerElse 
    	    path$ = #DEVELOPMENT_MainSourcePath$ 
    	    file$ = GetFilePart(#DEVELOPMENT_MainSourceName$, #PB_FileSystem_NoExtension)  ; use it by default 
    	  CompilerEndIf 
      CompilerElse                             ; .. at runtime 
        file$ = ProgramFilename() 
        path$ = GetPathPart(file$) 
        file$ = GetFilePart(file$, #PB_FileSystem_NoExtension) 
      CompilerEndIf 
      If file$ ; because of valid situation 
        s_logfile$ = path$ + file$ + #ES$ + #LogExt$  ; full filename i.e. <MyAppName.prefs> 
      EndIf                                                            :Debug #PB_Compiler_Procedure+"() -> return '" + s_logfile$ + "'" 
    EndIf 

    If s_logfile$ <> "" 
      FID = OpenFile(#PB_Any, s_logfile$, #PB_File_SharedRead | #PB_File_NoBuffering | #PB_UTF8 | #PB_File_Append) 
      If FID <> 0 
        WriteStringN(FID, FormatDate("[%yyyy-%mm-%dd %hh:%ii:%ss]", Date()) + ": " + Message$) 
        CloseFile(FID)          ;:Debug "LOG (on ): '" + Message$ + "'";, 9 
      EndIf 
      Else                      ;:Debug "LOG (off): '" + Message$ + "'";, 9 
      EndIf                      :Debug "LOG => '" + Message$ + "'" ;, 9 
    EndIf 
  EndProcedure 
 
Verbesserungstips:(liegt am persönlichen Geschmack/Coding Style Guide)
Ich versuche immer möglichst wenig globale Variablen zu verwenden. Diese dann aber mit besonders "sinnvollen" Namen.
Immer mit dem Ziel, dass ich nach Wochen und Monaten noch weiß was ich da zusammen gefummelt habe...
Ich habe auch einen Hang zu vielen kleinen Proceduren.

Happy coding and stay healthy.
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Antworten