MessageRequester und Programmreihenfolge (Ablauf)

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

MessageRequester und Programmreihenfolge (Ablauf)

Beitrag von Bender »

Ich programmiere unter Ubuntu 12.04 mit PB 5.11 64bit.

Dabei sind mir 2 Sachen aufgefallen:

1. MessageRequester

Unter Windows kann man das Programm nicht mehr bedienen bis der
MessageRequester wieder geschlossen ist.
Unter Ubuntu kann ich den MessageRequester aber minimieren und dann am
Programm weitermachen, was natürlich einiges durcheinanderwirft.
Ich habe dann so geregelt:

Code: Alles auswählen

Procedure MsgBox(Titel.s, Inhalt.s, Aussehen)
  DisableWindow(0,1)
  a = MessageRequester(Titel,Inhalt,Aussehen)
  DisableWindow(0,0)
  ProcedureReturn a
EndProcedure
2. Ich will ein anderes Programm aus meinem Programm starten, der Start des
Fremdprogramms dauert aber etwas, so kann es vorkommen, daß man es mehrmals
startet. Ich habe schon einiges versucht das zu verhindern, doch es wird
immer erst das Fremdprogramm gestartet, trotz Deley und der unsinnigen
Schleife. Erst nachdem das Fremdprogramm gestartet ist ändert sich der
Gadgettext und es wird alles deaktiviert.

Code: Alles auswählen

DisableGadget(11,1)
DisableWindow(0,1)
SetGadgetText(11,"jo")
Delay(1000)
For a = 1 To 20000

Next

RunProgram("kamerka","","",#PB_Program_Wait) 
O_o
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: MessageRequester und Programmreihenfolge (Ablauf)

Beitrag von ts-soft »

Modale Dialoge sind unter Linux nicht so üblich, deshalb das unterschiedliche Verhalten. Eine Lösung hast
Du ja bereits gefunden.

Zum zweiten Problem, GUI-Elemente werden immer nur während der Ereignis-Abarbeitung aktualisiert!
Entweder die Events flashen: While WindowEvent() : Wend, oder besser das ganze im
EventLoop Deiner GUI unterbringen.

Delay ist in jedem Falle verkehrt und sollte dort nicht eingesetzt werden, delay ist sowieso nur sehr selten
nützlich und wird leider viel zu oft für falsche Zwecke eingesetzt.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

Re: MessageRequester und Programmreihenfolge (Ablauf)

Beitrag von Bender »

Top! Da hatt ich ja glück, daß das so schnell ging. :)

ich hab da nun ein WaitWindowEvent() vor dem RunProgram, so geht es, war es so gemeint?

Code: Alles auswählen

Repeat
  eingabe = WaitWindowEvent()
  VON = EventGadget()
  If Aktiv

   Select EventType()
     Case #PB_EventType_LeftClick
       If VON = 3
...
       ElseIf VON = 11
         DisableWindow(0,1)
         Aktiv = 0
         WaitWindowEvent()
         RunProgram("kamerka","","",#PB_Program_Wait)
...
          DisableWindow(0,0)
          Aktiv = 1
       EndIf

     Case #PB_EventType_Change ; combobox
...
   EndSelect
 EndIf
 
Until eingabe = #PB_Event_CloseWindow And Aktiv
O_o
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: MessageRequester und Programmreihenfolge (Ablauf)

Beitrag von ts-soft »

So ungefähr, das zweite WaitWindowEvent() sollte überflüssig sein, wenn nicht, ersetz es durch ein WindowEvent(), ohne Wait, dann sollte nur das disablen noch abgearbeitet werden.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

Re: MessageRequester und Programmreihenfolge (Ablauf)

Beitrag von Bender »

Also das Fenster deaktivieren klappt soweit nur...
Wenn ich jetzt auf der deaktivierten Oberfläche meines Programms was anklicke, wird es dennoch es ausgeführt, jetzt allerdings erst nachdem das Fremdprogramm beendet wurde. :/
O_o
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: MessageRequester und Programmreihenfolge (Ablauf)

Beitrag von ts-soft »

#PB_Program_Wait wartet ja, bis das Programm beendet wurde, laß das weg.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

Re: MessageRequester und Programmreihenfolge (Ablauf)

Beitrag von Bender »

Ich werd noch irre. Also das Problem mit den Windowevents bei deaktiviertem Programm habe ich für diesen Fall mit einem MessageRequester gelöst, nachdem das Fremdprogramm beendet wurde, erhalte ich nun eine Nachricht über die importierten Daten. Die nicht gewünschten Knopfdrücke werden so abgefangen.

Jedoch ändere ich programmintern den Inhalt eines ComboBoxGadgets und will das Ereignis aber nur auswerten, wenn der User etwas ändert. Dafür ist die Variable >Aktiv< da.
Ich setze Aktiv auf 0 und ändere programmintern das ComboBoxGadget und nach der Änderung herhält Aktiv wieder den Wert 1.
Unter Windows geht das sogar auch ohne die Aktiv-Variable.
Unter Ubuntu geht das nicht. Es ist als würde der Code irgendwo parallel abgearbeitet oder die Events liegen in einem Puffer bis Aktiv wieder 1 ist.

Ein Beispielcode was ich da meine:

Code: Alles auswählen

OpenWindow(0,0,0,520,130,"Test", #PB_Window_MinimizeGadget)

Global Aktiv = 1

ComboBoxGadget(2,5,5,400,35)
ButtonGadget(3,410,5,100,35,"LÖSCHEN")
StringGadget(4,5,50,400,35,"")
ButtonGadget(5,410,50,100,35,"ANLEGEN")
TextGadget(6,5,100,400,35,"")

For a = 3 To 6
  DisableGadget(a,1)
Next


Procedure MsgBox(Titel.s, Inhalt.s, Aussehen)
  DisableWindow(0,1)
  a = MessageRequester(Titel,Inhalt,Aussehen)
  DisableWindow(0,0)
  ProcedureReturn a
EndProcedure

Procedure Startzustand()
  For a = 3 To 6
     DisableGadget(a,1)
 Next
 SetGadgetText(4,"")
 SetGadgetText(6,"")
EndProcedure

Procedure Eintrag(Name.s)
 
  ClearGadgetItems(2)
  AddGadgetItem(2,-1,"Neueintrag")
    If ExamineDirectory(0,"daten/","*")
      a = 0
      b = 0
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
        Wert.s = DirectoryEntryName(0)
        If Wert <> "." And Wert <> ".."
          a = a +1
          AddGadgetItem(2,-1,Wert)
          If Wert = Name
            b = a
          EndIf
        EndIf
      EndIf
    Wend
    If b > 0
      SetGadgetState(2,b)
    EndIf
    FinishDirectory(0)
  EndIf

EndProcedure


Eintrag("")

Repeat
  eingabe = WaitWindowEvent()
  VON = EventGadget()
  If Aktiv = 1 And VON
    Select EventType()
      Case #PB_EventType_LeftClick
        Debug "---------------Click" + Str(von)
        If VON = 3
          Aktiv = 0 ;<---------------------------- Inaktiv
         If MsgBox("ACHTUNG!", "Sollen alle Daten von >"+GetGadgetText(2)+"< gelöscht werden?",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
           If DeleteDirectory("daten/"+GetGadgetText(2),"",#PB_FileSystem_Recursive)
            Startzustand()
             Eintrag("")
             MsgBox("Info","Daten gelöscht!",0)
           Else
             MsgBox("Fehler","Konnte Daten nicht löschen!",0)
           EndIf
         EndIf
           Aktiv = 1 ;<------------------------- Aktiv
       ElseIf VON = 5
         If GetGadgetText(4) <> ""
           Wert.s = UCase(GetGadgetText(4))
           If CheckFilename(Wert)
             If ExamineDirectory(0,"daten/"+Wert,"*")
               MsgBox("Fehler","Name bereits vergeben!",0)
               FinishDirectory(0)
             Else
               If CreateDirectory("daten/"+Wert)
                 SetGadgetText(4,"")
                 DisableGadget(4,1)
                 DisableGadget(5,1)
                 Eintrag(Wert)
               Else
                 MsgBox("Fehler","Kann Ordner nicht erstellen!",0)
               EndIf
               
             EndIf
           Else
             MsgBox("Fehler","Ungültige Zeichen im Namen!",0)
           EndIf
         EndIf
       EndIf

     Case #PB_EventType_Change ; combobox
       Debug "------------change" + Str(von) + " " +Str(Aktiv)
       If VON = 2 
           Startzustand()
           If GetGadgetText(2) = "Neueintrag"
             DisableGadget(4,0)
             DisableGadget(5,0)
           ElseIf GetGadgetText(2) = ""
             
             Debug "möp" + Str(Aktiv) ;<------------------------ Das dürfte nicht kommen
             
           Else
             DisableGadget(3,0)
             SetGadgetText(6,GetGadgetText(2))
           EndIf
       EndIf
   EndSelect
 EndIf
 
Until eingabe = #PB_Event_CloseWindow And Aktiv
Mein Ziel ist es durch das Programm das ComboBoxGadget zu ändern, ohne daß der Teil abgearbeitet wird, wenn der User es ändert.
O_o
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

Re: MessageRequester und Programmreihenfolge (Ablauf)

Beitrag von Bender »

Öööhhmmm.. ok, nunja.
Sorry für die blöde Frage aus dem letztem Post. Wer lesen kann ich klar im Vorteil!
Hab mir mal erlaubt in der Hilfe das Thema "Windows Message Handling" zu lesen und nach einfügen von

Code: Alles auswählen

While WindowEvent() : Wend
ist auch die Aktiv-Variable überflüssig. :roll:
O_o
Antworten