Seite 1 von 2

Gadgets unter Windows

Verfasst: 18.05.2020 12:42
von langinagel
Servus,

irgendwie funktionieren meine Ansteuerungen von Gadgets nicht unter Windows:

- um alles korrekt darzustellen, muss das ganze Fenster per Maus verschoben werden

- teilweise müssen Gadgets durch Mausklick "aktiviert" werden.

Geht das nur mir so oder haben auch andere Schwierigkeiten?
Welche Regeln gelten um "bessere" GUIs zu erzeugen?

Kann mir bitte jemand helfen?

Viele Grüße
LN

Code: Alles auswählen

  #Font_5 = 5

Global wFontHeight.w

Procedure.w FontLaden()            ; 
  If  LoadFont(#Font_5,  "Arial"  ,  12)
  Else
    Debug "Font 5 nicht geladen"
  EndIf
EndProcedure

Enumeration 950
  #NichtsGeschehen       
  #AbbruchOhneUebernahme 
  #EndeMitDatenuebernahme
  #BestehendeDatenAuslesen
  #InputGUI_OK
  #InputGUI_Cancel

EndEnumeration

Procedure.w CheckContent(Content.s)
  Protected result.w = 0
  If Len(Content) < 3 Or Trim(Content) = ""
    result = 5
  EndIf
  ProcedureReturn result
EndProcedure

Procedure Check_Input(GadgetNo.w)
  Protected CheckContent.s
  CheckContent = GetGadgetText(GadgetNo)
  If CheckContent(CheckContent) > 1
    SetGadgetColor(GadgetNo, #PB_Gadget_BackColor,RGB(255,0,0))
  Else
    SetGadgetColor(GadgetNo, #PB_Gadget_BackColor,RGB(255,255,255))
  EndIf
EndProcedure

Procedure FillKramComboBox(GadgetNo.w)
  AddGadgetItem(GadgetNo, -1 , "einerseits" )
  AddGadgetItem(GadgetNo, -1 , "andererseits" )
  AddGadgetItem(GadgetNo, -1 , "dannwieder" )
EndProcedure

Enumeration FormWindow
  #WindowTest
EndEnumeration

Enumeration FormGadget
  #WindowTest_Text_wTest1
  #WindowTest_Text_sTest
  #WindowTest_Text_fFloat
  #WindowTest_Text_tStringtest
  #WindowTest_Button_Ok
  #WindowTest_Button_Cancel
  #WindowTest_Button_FontPlus
  #WindowTest_Button_FontMinus
  
  #WindowTest_Combo_wTest1
  #WindowTest_String_sTest
  #WindowTest_String_fFloat
  #WindowTest_String_tStringtest
EndEnumeration

Procedure OpenWindowTest(x = 0, y = 0, width = 700, height = 500)
  OpenWindow(  #WindowTest, x, y, width, height,"Zeuges"  , #PB_Window_SystemMenu|  #PB_Window_SizeGadget  )
  StickyWindow(  #WindowTest, #True) 
  
  ButtonGadget(  #WindowTest_Button_Ok, 580, 260, 100, 40, "OK")
  ButtonGadget(  #WindowTest_Button_Cancel, 450, 260, 100, 40, "Cancel")
  
  TextGadget(  #WindowTest_Text_wTest1, 20, 20, 160, 40, "Auswahl" )
  TextGadget(  #WindowTest_Text_sTest, 20, 80, 160, 40, "Text" )
  TextGadget(  #WindowTest_Text_fFloat, 20, 140, 160, 40, "Float" )
  TextGadget(  #WindowTest_Text_tStringtest, 20, 200, 160, 40, "LangText" )
  ComboBoxGadget(  #WindowTest_Combo_wTest1, 240, 20, 440, 40 )
  StringGadget(  #WindowTest_String_sTest, 240, 80, 440, 40, "")
  StringGadget(  #WindowTest_String_fFloat, 240, 140, 440, 40, "")
  EditorGadget(  #WindowTest_String_tStringtest, 240, 200, 440, 40);, "")

EndProcedure


Procedure FontSetzen(wInput.w)
  SetGadgetFont(   #WindowTest_Combo_wTest1, FontID(wInput))
  SetGadgetFont(   #WindowTest_Text_wTest1, FontID(wInput))
  SetGadgetFont(   #WindowTest_String_sTest, FontID(wInput))
  SetGadgetFont(   #WindowTest_Text_sTest, FontID(wInput))
  SetGadgetFont(   #WindowTest_String_fFloat, FontID(wInput))
  SetGadgetFont(   #WindowTest_Text_fFloat, FontID(wInput))
  SetGadgetFont(   #WindowTest_String_tStringtest, FontID(wInput))
  SetGadgetFont(   #WindowTest_Text_tStringtest, FontID(wInput))
EndProcedure


Procedure.w WindowTest_Event()
  Protected result.w = 0
  Protected event.w
  Delay(5)
  event = WindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      result =  #AbbruchOhneUebernahme
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #WindowTest_Button_Cancel
          result =  #AbbruchOhneUebernahme
        Case #WindowTest_Button_OK
          result =  #EndeMitDatenuebernahme 
      EndSelect
    Default 
      result =  #NichtsGeschehen  
  EndSelect
  ProcedureReturn result
EndProcedure 

Procedure.w STRG_MaskeTest()
Shared wFontHeight 
wFontHeight = #Font_5
  Protected switch.w 
  OpenWindowTest(0)
  FillKramComboBox(  #WindowTest_Combo_wTest1)
  FontSetzen(wFontHeight)
;   SetGadgetText( #WindowTest_String_sTest, "Dideldum")
;   SetGadgetText( #WindowTest_String_fFloat, "1.453")
;   SetGadgetText( #WindowTest_String_tStringtest, "BlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaDideldum")
   
  CompilerIf   #PB_Compiler_OS = #PB_OS_Windows
  
  ; Wie rette ich ich hier eine vollständige Darstellung?
  
    UpdateWindow_(GadgetID(   #WindowTest_Combo_wTest1))
    UpdateWindow_(GadgetID(   #WindowTest_String_sTest))
    UpdateWindow_(GadgetID(   #WindowTest_String_fFloat))
    UpdateWindow_(GadgetID(   #WindowTest_String_tStringtest))
    UpdateWindow_(GadgetID(   #WindowTest_Button_Ok ))
    UpdateWindow_(GadgetID(   #WindowTest_Button_Cancel ))
  CompilerEndIf
  
  Repeat
    switch = WindowTest_Event()
    If switch =  #EndeMitDatenuebernahme  
    Else
      Check_Input(   #WindowTest_Combo_wTest1)
      Check_Input(   #WindowTest_String_sTest)
      Check_Input(   #WindowTest_String_fFloat)
      Check_Input(   #WindowTest_String_tStringtest)
    EndIf
  Until switch =  #EndeMitDatenuebernahme Or  switch =   #AbbruchOhneUebernahme 
  CloseWindow(#WindowTest)
  ProcedureReturn switch 
EndProcedure 

; los gehts

Fontladen()

STRG_MaskeTest( )


Re: Gadgets unter Windows

Verfasst: 18.05.2020 13:12
von Kiffi
prüfe mal, wie oft Du Check_Input() aufrufst:

Code: Alles auswählen

Procedure Check_Input(GadgetNo.w)
  Debug "Check_Input"
  [...]
Kein Wunder, dass das Fenster überhaupt keine Zeit hat, sich zu aktualisieren.

Re: Gadgets unter Windows

Verfasst: 18.05.2020 13:52
von langinagel
Mit dem Delay(5) in WindowTest_Event() alle 5 Millisekunden.
Auch 50 Millisekunden bringen nichts....auch nicht wenn ich das Delay() hinter den Aufruf setze.

Re: Gadgets unter Windows

Verfasst: 18.05.2020 14:21
von Kiffi
Du musst Check_Input() nur dann aufrufen, wenn der Anwender eine Eingabe getätigt hat.

Re: Gadgets unter Windows

Verfasst: 18.05.2020 14:37
von langinagel
Also so

Code: Alles auswählen

        Case  #WindowTest_Combo_wTest1
          Check_Input(   #WindowTest_Combo_wTest1)
        Case  #WindowTest_String_sTest
          Check_Input(   #WindowTest_String_sTest)
        Case  #WindowTest_String_fFloat
          Check_Input(   #WindowTest_String_fFloat)
        Case  #WindowTest_String_tStringtest
          Check_Input(   #WindowTest_String_tStringtest)
und die unbedingten Aufrufe ausblenden?

Gesagt, getan....aber keine Änderung.

Wobei: beiim unbedingten Aufruf ist das Text-Feld rot markiert....nun ist das Langtext-Feld markiert. Schon eine Änderung, aber keine wesentliche Verbesserung.

Re: Gadgets unter Windows

Verfasst: 18.05.2020 16:12
von HeX0R
Du solltest Dich etwas mehr in Eventhandling einlesen.

Code: Alles auswählen

#Font_5 = 5

Enumeration
	#NichtsGeschehen
	#AbbruchOhneUebernahme
	#EndeMitDatenuebernahme
	#BestehendeDatenAuslesen
	#InputGUI_OK
	#InputGUI_Cancel

EndEnumeration

Procedure CheckContent(Content.s)
	Protected result
	If Len(Content) < 3 Or Trim(Content) = ""
		result = 5
	EndIf
	ProcedureReturn result
EndProcedure

Procedure Check_Input(GadgetNo)
	Protected CheckContent.s

	CheckContent = GetGadgetText(GadgetNo)
	If CheckContent(CheckContent) > 1
		SetGadgetColor(GadgetNo, #PB_Gadget_BackColor, RGB(255, 0, 0))
	Else
		SetGadgetColor(GadgetNo, #PB_Gadget_BackColor, RGB(255, 255, 255))
	EndIf

EndProcedure

Enumeration FormWindow
	#WindowTest
EndEnumeration

Enumeration FormGadget
	#WindowTest_Text_wTest1
	#WindowTest_Text_sTest
	#WindowTest_Text_fFloat
	#WindowTest_Text_tStringtest
	#WindowTest_Button_Ok
	#WindowTest_Button_Cancel
	#WindowTest_Button_FontPlus
	#WindowTest_Button_FontMinus

	#WindowTest_Combo_wTest1
	#WindowTest_String_sTest
	#WindowTest_String_fFloat
	#WindowTest_String_tStringtest
EndEnumeration

Procedure OpenWindowTest(x = 0, y = 0, width = 700, height = 500)
	OpenWindow(  #WindowTest, x, y, width, height, "Zeuges" , #PB_Window_SystemMenu |  #PB_Window_SizeGadget  )
	StickyWindow(  #WindowTest, #True)

	ButtonGadget(  #WindowTest_Button_Ok, 580, 260, 100, 40, "OK")
	ButtonGadget(  #WindowTest_Button_Cancel, 450, 260, 100, 40, "Cancel")

	TextGadget(  #WindowTest_Text_wTest1, 20, 20, 160, 40, "Auswahl" )
	TextGadget(  #WindowTest_Text_sTest, 20, 80, 160, 40, "Text" )
	TextGadget(  #WindowTest_Text_fFloat, 20, 140, 160, 40, "Float" )
	TextGadget(  #WindowTest_Text_tStringtest, 20, 200, 160, 40, "LangText" )
	ComboBoxGadget(  #WindowTest_Combo_wTest1, 240, 20, 440, 40 )
	StringGadget(  #WindowTest_String_sTest, 240, 80, 440, 40, "")
	StringGadget(  #WindowTest_String_fFloat, 240, 140, 440, 40, "")
	EditorGadget(  #WindowTest_String_tStringtest, 240, 200, 440, 40);, "")

EndProcedure

Procedure STRG_MaskeTest()
	SetGadgetFont(#PB_Default, LoadFont(#Font_5,  "Arial" ,  12))
	OpenWindowTest(0)
	AddGadgetItem(#WindowTest_Combo_wTest1, -1, "einerseits" )
	AddGadgetItem(#WindowTest_Combo_wTest1, -1, "andererseits" )
	AddGadgetItem(#WindowTest_Combo_wTest1, -1, "dannwieder" )

	;Init Colors
	Check_Input(#WindowTest_String_sTest)
	Check_Input(#WindowTest_String_fFloat)
	Check_Input(#WindowTest_String_tStringtest)

	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_CloseWindow
				Break
			Case #PB_Event_Gadget
				Select EventGadget()
					Case #WindowTest_String_sTest, #WindowTest_String_fFloat, #WindowTest_String_tStringtest
						If EventType() = #PB_EventType_Change
							Check_Input(EventGadget())
						EndIf
					Case #WindowTest_Button_Cancel, #WindowTest_Button_Ok
						Break
				EndSelect
		EndSelect
	ForEver
EndProcedure

; los gehts

STRG_MaskeTest( )

(ComboBox unterstützt übrigens kein Einfärben)

Re: Gadgets unter Windows

Verfasst: 18.05.2020 18:21
von langinagel
Hallo HeXOR,

danke für den funktionierenden Code.

Allerdings: kaum baue ich Deine SELECT-Abfrage in meine alte Event-Procedure ein (--> Trennung von Repeatschleife und Select-Abfrage), schon erhalte ich das alte Ergebnis, auch wenn alle DELAY() und Check_Input() weg sind.

Bedeutet das, dass die Select-Abfragen und die Repeat-Schleife ZWINGEND in einer Procedure stehen müssen? :?

Wo bitte finde ich genau solche Beschreibungen zum Eventhandling....mit der Anforderung?

Re: Gadgets unter Windows

Verfasst: 18.05.2020 19:28
von HeX0R
langinagel hat geschrieben: Bedeutet das, dass die Select-Abfragen und die Repeat-Schleife ZWINGEND in einer Procedure stehen müssen? :?
Nein, natürlich nicht, das bedeutet eher, dass Du beim umsetzen was falsch gemacht hast.
Diese "alles Eventhandling in eine Procedure packen" ist mittlerweile übrigens auch nicht mehr aktuell.
Wenn Du das kapseln möchtest, solltest Du Dir mal BindEvent und BindGadgetEvent anschauen.

Re: Gadgets unter Windows

Verfasst: 18.05.2020 19:43
von langinagel
HeX0R hat geschrieben:Nein, natürlich nicht, das bedeutet eher, dass Du beim umsetzen was falsch gemacht hast.
Genau dieses etwas falsch Umgesetzte suche ich....


Aber erstmal danke schön für die Unterstützung.
Ich notiere mir:
wenn nicht über callback / bindevent, dann schleife und select in eine Procedure.
...
und wo ist sonst noch der Wurm drin?

Re: Gadgets unter Windows

Verfasst: 18.05.2020 20:36
von HeX0R
Wenn Du mir Deinen umgebauten Code zeigst, kann ich's Dir sagen.

Ansonsten:
Du solltest Dir dieses .w wirklich abgewöhnen, Du programmierst keinen Microcontroller und Speicherplatz hat ein PC in Hülle und Fülle, da brauchen wir nicht auf Byte-Ebene rumzugeizen.
Vor allem kann das auch zu übel versteckten Fehlern führen, z.B. sowas:

Code: Alles auswählen

event.w = #WM_APP
If event = #WM_APP
	Debug "alles gut"
Else
	Debug "was zum Teufel??"
EndIf
.b .w oder .l nimmt man da, wo es unbedingt sein muss, also auf API-Ebene, oder in Strukturen.

Ein Delay() hat in einer Eventschleife so überhaupt gar nichts verloren!

Danilo hat das Eventhandling unter Windows mal wirklich gut erklärt!
viewtopic.php?f=9&t=23