ReadProgramString

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

Re: ReadProgramString

Beitrag von Axolotl »

dibro hat geschrieben: 02.11.2022 19:23 ....
Update 3.11.2022: Tolles Tool, kann eigenltlich alles was ich brauche, Time- und Date-Shift etc.
Da brauche ich nur wenige Kommandos ändern. :allright:
Ich werde trotzdem das TestTool in ein eigenes Tool für mich umbauen.
Nur so zum Spaß und um zu lernen. Ich hoffe, du hast nichts dagegen Axolotl.
...
Hallo Dieter,
Schön das es dir hilft.
Natürlich kannst du den beispiel code nutzen wie du möchtest. Ich lerne auch immer durch die Beiträge der anderen.
Happy coding
Andreas
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 »

Hallo Macros,
danke für die umfangreichen Erläuterungen.
Aber das mit dem StickyWindow funktioniert so leider nicht, das habe ich in gleicher Form auch schon probiert. Zu der Checkbox gibt es leider keine umfangreichen Beispiele.
Bei einem Haltepunkt auf die Casebedingung hat #CheckboxSticky den Wert 14 und trotzdem werden diefolgenden Zeilen übersprungen.
Ich weiß nicht, was ich bei Case abfragen soll. Auch beim fogenden Beispiel wird

Code: Alles auswählen

 Case  #PB_Checkbox_Checked   
       StickyWindow(#Mainwindow,1)
Case #PB_Checkbox_Unchecked
      StickyWindow(#Mainwindow,0)
Case #PB_Checkbox_Checked übersprungen, obwohl das Häkchen gesetzt ist. Die Werte -Checked oder unchecked verändern sich auch nicht, egal ob mit oder ohne Häkchen.

Das mit dem Thread werde ich nachher untersuchen.
Viele Grüße
Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: ReadProgramString

Beitrag von HeX0R »

#PB_Checkbox_Checked und #PB_Checkbox_UnChecked sind unveränderliche Konstanten!
Sie dienen nur der besseren Lesbarkeit und sind in Verbindung mit GetGadgetState() zu nutzen.
Aber eigentlich hatte Macros genau das auch schon gesagt.
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: ReadProgramString

Beitrag von dibro »

Danke alle,
aber bei meinem System schein etwas nicht zu stimmen, viellecit eine falsche Compilereinstellung oder so etwas.
Ich habe an der Stelle den Code aus einem Beispiel aus dem Forum eingefügt, das läuft auch an der Stelle nicht.
Ich habe da nur die Nr des Gadgets durch mein #CheckboxSticky ersetzt. Das läuft aber auch nicht.

Code: Alles auswählen

      Case #CheckboxSticky   ; Fragezeichen beim Auswahl-Gadget (ComboBox)
            a=GetGadgetState(#CheckboxSticky)
            If a = -1   ; nichts markiert
              a$="Es wurde nichts ausgewählt !"
            Else        ; ein Eintrag wurde ausgewählt
              a$="Sie haben folgenden Eintrag ausgewählt:"+Chr(10)     ; Chr(10) fügt einen Zeilenumbruch hinzu
              a$+"Index-Nr.: "+Str(a)+"  - Name des Eintrags: "+GetGadgetText(#CheckboxSticky)
            EndIf  
            MessageRequester("Information zur Auswahlbox",a$,0)
Außerdem kann ich das gesamte Beispiel nicht starten, weil der Compiler ebenso wie beim Beispiel aus der Doku meckert.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 150, 25, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
    EndIf
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "ToolBar ID: "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf
Bei ToolBarStandardButton(0, #PB_ToolBarIcon_New) bleibt er hängen und sagt
Zeile 3: ToolBarStandardButton ist keine Funktion , Macro, Array oder linked List.
Bei den Compiler Optionen sind die Kästchen 2,4, 8 und 11 von oben angehakt. Ich habe den Compiler auch schon neu gestartet.
Irgend etwas ist faul :cry:
Ich weiß nicht weiter.
Gruß 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 »

Gibt es seit v6.00 nicht mehr ...

Ersatz: Module ToolBarStandardButton
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 mk-soft, also doch keine Macke bei meinem Compiler.
Und das Checkboxproblem habe ich auch gelöst, einfach die Case Abfrage ans Ende der Reihe gestellt, dann geht's, warum auch immer. Vielleicht weil es in der Enummeration auch am Ende steht.
Jetzt neues Problem. Beim Thread schaue ich nicht durch. Der Compiler sagt immer "Der angegebene @ProcedureName ist kein Zeiger.
Das Problem lässt sich leider nicht im Debugger verfolgen, da das Prog abstürzt, nachdem es seine Aufgabe abgearbeitet und seinen Text ausgegeben hat.

Code: Alles auswählen

Procedure.s ExifRun(*Parameter.Pfade)
  
  Protected Exitcode, NoErrText
  Protected NewErrorText$, AllErrorText$ =""
  Protected start = ElapsedMilliseconds()
  Protected Program.i
  Protected path$, Cmd$, WorkDir$, WildCard$ 
  Protected Flags =#PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Hide ;| #PB_Program_Wait
  
  *Parameter.Pfade = AllocateMemory(SizeOf(Pfade))
  With *Parameter.Pfade
    path$      = \Exif_Pfad$ + \EXIF_Executable$
    Cmd$       = \Exif_Kommando$  
    WorkDir$   = \Arbeitsverzeichnis$
    WildCard$  = \Datei_Parameter$            
  EndWith 
  
  cmd$ = Cmd$ + WorkDir$ + WildCard$
  
 
  Program = RunProgram(path$, Cmd$, WorkDir$, Flags)
   fertig = PostEvent(#EventBeginProcessing)

   If Program    
    While ProgramRunning(Program) 
      If AvailableProgramOutput(Program)                  
        Ausgabetext$ = WildCard$ +" "+ 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(40)
      If i => 100 : i= 0 : EndIf
    Wend
    Ausgabetext$+" "+#TxtRunProgLaufzeit+":"+Str(ElapsedMilliseconds()-start)+#TxtZeiteinheit$+#NewLine  
    If ElapsedMilliseconds()-start    
      Exitcode=ProgramExitCode(Program)
      If Exitcode<>0
        If 0=Exitcode 
          Ausgabetext$+#TxtRunPrgOK$ 
        Else   
          Ausgabetext$ + #TxtRunPrgError$ + Str(Exitcode) + #NewLine
          Ausgabetext$ + AllErrorText$ 
        EndIf 
      EndIf

    Else 
      If 0<>IsProgram(Program) 
        KillProgram(Program)
        CloseProgram(Program)
       Ausgabetext$ = Ausgabetext$ +" " + #NewLine +AllErrorText$ +" " 
      EndIf 
    EndIf 
    fertig = PostEvent(#EventProcessingFinished)
     i = 0
     SetGadgetState   (#ProzessbarGadget, i)
     ProcedureReturn Ausgabetext$
     CloseProgram(Program)
  Else
    MessageRequester(#TxtRunPrgFATAL$,#TxtProg_nicht_gefunden$+" "+ path$) 
  EndIf
  
EndProcedure
Der Aufruf erfolgt mit fogenden Zeilen

Code: Alles auswählen

InitParameter()
      *Parameter.Pfade = AllocateMemory(SizeOf(Pfade))
      CreateThread((@ExifRun),*Parameter)
      AddGadgetItem(#EDGadget_Text_Ausgabe,-1,Ausgabetext$+#NewLine)
Als Procedur läuft das ja, aber als Thread will es nicht.
Wer hilft mir hier weiter?
Vielen Dank
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 »

Die Adresse einer Procedure ist "@ProcedureName()" und eine Thread Procedure hat immer ein Parameter.
Klammer vergessen ...

Siehe Mini Thread Control um Threads zu steuern. Link hatte ich schon mal geschrieben...
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 »

Sorry mk-soft,
das mit dem Beispiel Mini Thread Control habe ich übersehen, da ich derzeit mit anderen Problemen gekämpft habe.
Für den Anfänger/Hobbyprogrammierer steht der Wald nicht nur voller Bäume, sondern auch einer Menge Stäuchern dazwischen.
Ich werde das jetzt erst eimal durcharbeiten.
Vielen Dank für die prima Hilfe, auch an das Forum!
Gruß Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ReadProgramString

Beitrag von Axolotl »

Moin Dieter,
ich habe mir mal deinen Code etwas genauer angesehen.... (Ohne Anspruch auf Vollständigkeit)

Code: Alles auswählen

; Zeile 239 ff. 
  SetGadgetState(#combogadg_DaT_Art,2) 
  If #combogadg_DaT_Art = 2 
    GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")
  EndIf
--> "#combogadg_DaT_Art" ist eine GADGET Nummer (Enumeration, Wert == 5); dieser Vergleich ist niemals wahr.

Code: Alles auswählen

; Zeile 281 ff. 
  CheckBoxGadget(#CheckboxSticky, 400, Top , 100, 20, "Fenster oben")
  SetGadgetState(#CheckboxSticky,1)
  If #CheckboxSticky = 1 : StickyWindow(#Mainwindow,#True) : EndIf 
--> "#CheckboxSticky" ist eine GADGET Nummer (Enumeration, Wert == 14); dieser Vergleich ist niemals wahr.
>> Dementsprechend wird StickyWindow() hier auch nicht gesetzt/aktiviert.
>> Allerdings hast Du StickyWindow(#MainWindow, #True) ja schon in Zeile 231 aufgerufen.
>> Also ist das Hauptfenster "Sticky".

Code: Alles auswählen

; Zeile 299 ff 
  If Neu 
        SetGadgetText(#EDGadget_Text_Ausgabe,Ausgabetext$)
     Neu = 0
  EndIf 
--> kann man so machen. Aber warum Variable Neu und warum zurücksetzen?
Hinweis: Code der außerhalb von Proceduren steht wird nur einmal aufgerufen....

Code: Alles auswählen

; Zeile 312 ff. (in der main loop)  
  Select WaitWindowEvent()      ;auf Ereignis im Window warten
    Case #PB_Event_CloseWindow  ;Fenster schließen
      Ende=1
  ;-TODO Warum funktioniert die Checkbox nicht???
    Case   #CheckboxSticky                              
      If   #PB_Checkbox_Checked
        StickyWindow(#Mainwindow,1)
      Else  
        StickyWindow(#Mainwindow,0)
      EndIf
--> Die Case Anweisung "Case #CheckboxSticky" ist an der falschen Stelle. Sie gehört nach der Select EventGadgtet() in Zeile 323

Code: Alles auswählen

; Zeile 317 
      If   #PB_Checkbox_Checked
--> diese If Anweisung ergibt immmer wahr
Warum?
Mit GetGadgetState() eines Checkbox-Gadgets bekommt man die folgenden Rückgabewerte:

Code: Alles auswählen

Debug #PB_Checkbox_Checked   ; ==  1 
Debug #PB_Checkbox_Unchecked ; ==  0 
Debug #PB_Checkbox_Inbetween ; == -1  ; <=> (Only for #PB_CheckBox_ThreeState checkboxes)

Code: Alles auswählen

; Zeile 373 ff 
;- ExifTool Start        
    Case #Button_Exif_Start ; Exif Datum nach Filedatum verschieben
      ClearGadgetItems(#EDGadget_Text_Ausgabe)
;-TODO Warum funktioniert CleargadgetItems hier nur mit der nächsten Zeile      
      While WindowEvent() : Wend 
--> hat Macros schon erklärt

Und wenn Du noch nicht wütend und mich verfluchend aufgegeben hast:....

Hier noch ein paar Anmerkungen aus meiner persönlichen Kodierrichtlinie (muss man nicht so machen, kann man aber.)
1. Preference-Dateien immer mit vollständigem Pfad aufrufen
Sonst wird das aktuelle Verzeichnis genommen. (s.a. GetCurrentDirectory())

Code: Alles auswählen

OpenPreferences("MEXDatum.pref")
Ansonsten kann man auch eindeutige Verhältnisse z.B. durch SetCurrentDirectory("<hiermit soll jetzt gearbeitet werden>") schaffen.

2. Code nur innerhalb von Proceduren, gestartet wird mit Procedure main()
Ist wohl ein Überbleibsel aus meiner Anfangszeit mit C.

3. Namen von Konstanten und Variablen möglichst sorgfältig benennen. (damit man in zwei Jahren auch noch weiß was gemein ist)
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 »

Hallo Axolotl,
danke, da hast du dir aber viel Zeit für meinen Code genommen :allright:
Zeile 239: dummer Fehler
Zeile 281: noch dümmer, alles klar
Zeile 299: Ist so beabsichtigt, der Text soll nur beim ersten Programmstart erscheinen. OK - könnte ich auch in einer separaten Procedur einlesen, wäre wohl eleganter --> Code nur in Proceduren :)
Die Case-Anweisung für die Checkbox habe ich korrigeirt und ans Ende gestellt, dort läuft es.

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.

Inzwischen habe ich mich daran festgebissen. Vor dem, was ich zuletzt vor 12 Jahren programmiert habe, habe ich fast alles vergessen.
Mit C/C++ habe ich vor 40 Jahren auch mal angefangen, das steht noch auf meinem Bücherbrett - nicht mehr im Kopf. Das mit Code nur in Proceduren ist richtig und auch besser, ändere ich vielleicht noch. Beruflich habe ich fast nur mit Exel gearbeitet, technische Berechnungen und Analysen, die Programme waren manchmal quälend langsam - die Rechner damals aber auch, ich habe den Merlin von Excel da zaubern lassen, damit man sah, dass das Programm noch lief. Insofern bin ich von PB begeistert und freue mich, dass ich jetzt noch eine Nutzanwendung gefunden habe
Ich versuche mich jetzt am Thread, blöd ist nur manchmal, dass die Compiler-Fehlermeldungen nicht so richtig passen.
Und das Mini Thread Control von mk-soft ist nicht gerade so mini, ich muss mich da mal durchwursteln.
Viele Grüße
Dieter
Ergänzung: Zeile 299, Die If Neu Abfrage ist natürlich Quatsch, das wird ja nur einmal durchlaufen, schön doof von mir :roll:
Zuletzt geändert von dibro am 22.11.2022 09:41, insgesamt 1-mal geändert.
Gruß aus Solingen, PB 6.0 Win 10 Pro
Antworten