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.