Gadgets unter Windows

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
langinagel
Beiträge: 30
Registriert: 03.08.2005 21:06
Computerausstattung: AMD-Krücke 8GB / Lubuntu 18.04
core i3 / 4GB / 1TB / Ubuntu 16.04
und noch paar alte Schinken
Wohnort: Germ-any
Kontaktdaten:

Gadgets unter Windows

Beitrag 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( )

https://www.doerpsoft.org

Boost. Work. Efficiency.

AMD-Krücke mit Lubuntu-18.04 / iCore7 mit Win10-64
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Gadgets unter Windows

Beitrag 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.
Hygge
Benutzeravatar
langinagel
Beiträge: 30
Registriert: 03.08.2005 21:06
Computerausstattung: AMD-Krücke 8GB / Lubuntu 18.04
core i3 / 4GB / 1TB / Ubuntu 16.04
und noch paar alte Schinken
Wohnort: Germ-any
Kontaktdaten:

Re: Gadgets unter Windows

Beitrag 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.
https://www.doerpsoft.org

Boost. Work. Efficiency.

AMD-Krücke mit Lubuntu-18.04 / iCore7 mit Win10-64
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Gadgets unter Windows

Beitrag von Kiffi »

Du musst Check_Input() nur dann aufrufen, wenn der Anwender eine Eingabe getätigt hat.
Hygge
Benutzeravatar
langinagel
Beiträge: 30
Registriert: 03.08.2005 21:06
Computerausstattung: AMD-Krücke 8GB / Lubuntu 18.04
core i3 / 4GB / 1TB / Ubuntu 16.04
und noch paar alte Schinken
Wohnort: Germ-any
Kontaktdaten:

Re: Gadgets unter Windows

Beitrag 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.
https://www.doerpsoft.org

Boost. Work. Efficiency.

AMD-Krücke mit Lubuntu-18.04 / iCore7 mit Win10-64
Benutzeravatar
HeX0R
Beiträge: 2959
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: Gadgets unter Windows

Beitrag 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)
Benutzeravatar
langinagel
Beiträge: 30
Registriert: 03.08.2005 21:06
Computerausstattung: AMD-Krücke 8GB / Lubuntu 18.04
core i3 / 4GB / 1TB / Ubuntu 16.04
und noch paar alte Schinken
Wohnort: Germ-any
Kontaktdaten:

Re: Gadgets unter Windows

Beitrag 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?
https://www.doerpsoft.org

Boost. Work. Efficiency.

AMD-Krücke mit Lubuntu-18.04 / iCore7 mit Win10-64
Benutzeravatar
HeX0R
Beiträge: 2959
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: Gadgets unter Windows

Beitrag 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.
Benutzeravatar
langinagel
Beiträge: 30
Registriert: 03.08.2005 21:06
Computerausstattung: AMD-Krücke 8GB / Lubuntu 18.04
core i3 / 4GB / 1TB / Ubuntu 16.04
und noch paar alte Schinken
Wohnort: Germ-any
Kontaktdaten:

Re: Gadgets unter Windows

Beitrag 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?
https://www.doerpsoft.org

Boost. Work. Efficiency.

AMD-Krücke mit Lubuntu-18.04 / iCore7 mit Win10-64
Benutzeravatar
HeX0R
Beiträge: 2959
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: Gadgets unter Windows

Beitrag 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
Antworten