Buttongadget funzt nicht.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
wie_jetzt?
Beiträge: 21
Registriert: 28.08.2017 17:23

Buttongadget funzt nicht.

Beitrag von wie_jetzt? »

Hallo Leute!

Hatte gerade mal Lust verspürt, wieder ein wenig Basic zu programmieren (das letzte Mal noch mit meinen Texas Instr. TI99-4a, die Oldtimer unter Euch werden den kennen).

Folgendes Problem hat mich sofort gefunden:
Habe 4 Buttons in einer Grafik, und keiner funktioniert. Ohne Grafik klappt das, DEBUG gibt brav Meldungen von sich. Aber sobald Catchimage usw. eingebaut werden, sind die Buttons ohne Funktion.

Hier der Code:

Code: Alles auswählen

UseJPEGImageDecoder()
Enumeration
  #FENSTER_HAUPT
  #BILD_SPEICHER
  #BILD_ANZEIGE
  #KNOPF_001
  #KNOPF_002
  #KNOPF_003  
  #KNOPF_004  
EndEnumeration
Global Ende.i = #False

If OpenWindow(#FENSTER_HAUPT, 0, 0, 470, 363, "Schnickschnack", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
If CatchImage(#BILD_SPEICHER, ?Bild)
ImageGadget(#BILD_ANZEIGE, 10, 10, 280, 150, ImageID(#BILD_SPEICHER))
  
  

ButtonGadget(#KNOPF_001, 20, 160, 120, 25, "Neues Projekt", #PB_Button_Left)
ButtonGadget(#KNOPF_002, 20, 200, 120, 25, "Projekt öffnen", #PB_Button_Left)
ButtonGadget(#KNOPF_003, 20, 240, 120, 25, "Einstellungen", #PB_Button_Left)
ButtonGadget(#KNOPF_004, 20, 280, 120, 25, "Beenden", #PB_Button_Left)


Repeat
Ereignis.i = WaitWindowEvent()
Select Ereignis
Case #PB_Event_Gadget
Select EventGadget()
Case #KNOPF_001
Debug "001"

Case #KNOPF_002
Debug "002"

Case #KNOPF_003
Debug "003"

Case #KNOPF_004
Debug "004"
Ende = #True
EndSelect
EndSelect
Until Ereignis = #PB_Event_CloseWindow Or Ende = #True

EndIf
EndIf
End

DataSection
Bild:
IncludeBinary "bild.jpg"
EndDataSection
          
Die Buttons funktionieren auch, wenn unter dem Bild angeordnet, aber nicht, wenn im Bild. Scheint mir, dass die Buttons zwar zu sehen sind, aber nicht im Vordergrund sind, man klickt quasi nur auf dem Bild rum. Wie kann man die Buttons zum funzen bringen? Bin dabnkbar für jede Anregung und bitte um einfachformulierte, nichtallzuvielvoraussetzende Antworten (also so, als würdet Ihr mit einem kranken Gaul reden).
Was das Programmieren angeht, bin ich ein Anfänger mit fast 40 Jahren Erfahrung, mit gelegentlichen, mitunter jahrzehntelangen Unterbrechungen. Kann mich noch dunkel an den TI58 bei der Bundeswehr Anfang der 1980er erinnern. Habe da mit "Mondlandung" viele Stunden der Heimatverteidung verbracht - Insider werden's kennen.
... wir hatten doch sonst nix!
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Buttongadget funzt nicht.

Beitrag von Josh »

Probier mal das CanvasGadget mit dem Flag #PB_Canvas_Container anstatt dem ImageGadget
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Buttongadget funzt nicht.

Beitrag von PureLust »

Hi, ... damit Gadgets, die sich über einem Image befinden funktionieren, musst Du das ImageGadget disablen.

Code: Alles auswählen

UseJPEGImageDecoder()
Enumeration
	#FENSTER_HAUPT
	#BILD_SPEICHER
	#BILD_ANZEIGE
	#KNOPF_001
	#KNOPF_002
	#KNOPF_003  
	#KNOPF_004  
EndEnumeration
Global Ende.i = #False

If OpenWindow(#FENSTER_HAUPT, 0, 0, 470, 363, "Schnickschnack", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	CreateImage(#BILD_SPEICHER, 470,363)
	ImageGadget(#BILD_ANZEIGE, 10, 10, 280, 150, ImageID(#BILD_SPEICHER))

	DisableGadget(#BILD_ANZEIGE, #True)   ; <==================================

	ButtonGadget(#KNOPF_001, 20, 160, 120, 25, "Neues Projekt", #PB_Button_Left)
	ButtonGadget(#KNOPF_002, 20, 200, 120, 25, "Projekt öffnen", #PB_Button_Left)
	ButtonGadget(#KNOPF_003, 20, 240, 120, 25, "Einstellungen", #PB_Button_Left)
	ButtonGadget(#KNOPF_004, 20, 280, 120, 25, "Beenden", #PB_Button_Left)
	
	Repeat
		Ereignis.i = WaitWindowEvent()
		Select Ereignis
			Case #PB_Event_Gadget
				Select EventGadget()
					Case #KNOPF_001
						Debug "001"
						
					Case #KNOPF_002
						Debug "002"
						
					Case #KNOPF_003
						Debug "003"
						
					Case #KNOPF_004
						Debug "004"
						Ende = #True
				EndSelect
		EndSelect
	Until Ereignis = #PB_Event_CloseWindow Or Ende = #True
	
EndIf

End
Grüße, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Buttongadget funzt nicht.

Beitrag von GPI »

Ist es eigentlich nicht generell keine gute Idee, Gadget über Gadgets zu pinseln, die das nicht vorsehen. Es kann klappen (wie mit den Disable), aber dokumentiert ist das nicht und kann sich zukünftig ändern. Sogar bei zukünftigen Windows-Versionen sind Probleme nicht auszuschließen.

Hier wäre tatsächlich ein Canvas-Gadget mit selberzeichenen und #PB_Canvas_Container-Flag vorzuziehen. Dokumentiert und funktioniert immer.

Wichtiger weiterer Tip: Benutz bei Bildern etc. lieber #pb_any

Code: Alles auswählen

bild_speicher.i=CreateImage(#PB_Any, 470,363)
   ImageGadget(#BILD_ANZEIGE, 10, 10, 280, 150, ImageID(bild_speicher))
Ich würd es sogar bei Gadgets und WIndows einsetzen. Man vermeidet damit einfach Konflikte.

dannn vergibst nicht du eine "Handle", sondern du bekommst eine zurück. Damit ist der Code universeller einsetzbar, weil du nicht mehr auf andere Programmstellen rücksicht nehmen musst. Spätestens wenn du die Vorteile von Modulen entdeckst, ist es unverzichtbar.

edit: Ich würde dir auch empfehlen einzurücken. Die IDE sollte das eigentlich von haus aus machen, bzw. Markier mal alles und drück STRG+I Schau dir einfach den Code von PureLust an, deutlich besser zu lesen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
wie_jetzt?
Beiträge: 21
Registriert: 28.08.2017 17:23

Re: Buttongadget funzt nicht.

Beitrag von wie_jetzt? »

Hallo Allerseits,

vielen Dank für Eure Anregungen! Ich will, dass da ein kleines Bild im Code enthalten ist und nicht zur Laufzeit geladen werden muss. Deswegen das Catchimagegedöhns. Wenn's da was besseres gäbe - ich freue mich über jede Anregung.

Code: Alles auswählen

If CatchImage(#BILD_SPEICHER, ?Bild)
  ImageGadget(#BILD_ANZEIGE, 10, 10, 280, 150, ImageID(#BILD_SPEICHER))
  DisableGadget(#BILD_ANZEIGE, #True)
EndIf
Funktioniert bestens... allerdings hat mich der Hinweis, dies sei eine undokumentierte Version erschreckt. In meiner Purebasic-Hilfe ist die Funktion durchaus genannt, also irgendwie doch nicht ganz "undokumentiert" - oder verstehe ich das falsch? Mir nützt ein Prog natürlich nichts, wenn's schon nach dem ersten Windowsupdate nicht mehr läuft.

Leider habe ich mit

Code: Alles auswählen

bild_speicher.i=CreateImage(#PB_Any, 470,363)
ImageGadget(#BILD_ANZEIGE, 10, 10, 280, 150, ImageID(bild_speicher))
nur ein schwarzes Fenster erhalten. Da war ich sicherlich zu blöd, den Befehl korekt einzubauen - bin halt der Neue ... An welcher Stelle würde denn da ein Dateiname erforderlich werden?
Was das Programmieren angeht, bin ich ein Anfänger mit fast 40 Jahren Erfahrung, mit gelegentlichen, mitunter jahrzehntelangen Unterbrechungen. Kann mich noch dunkel an den TI58 bei der Bundeswehr Anfang der 1980er erinnern. Habe da mit "Mondlandung" viele Stunden der Heimatverteidung verbracht - Insider werden's kennen.
... wir hatten doch sonst nix!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Buttongadget funzt nicht.

Beitrag von GPI »

wie_jetzt? hat geschrieben:Funktioniert bestens... allerdings hat mich der Hinweis, dies sei eine undokumentierte Version erschreckt. In meiner Purebasic-Hilfe ist die Funktion durchaus genannt, also irgendwie doch nicht ganz "undokumentiert" - oder verstehe ich das falsch? Mir nützt ein Prog natürlich nichts, wenn's schon nach dem ersten Windowsupdate nicht mehr läuft.
Ich hab mich vielleicht falsch ausgedrückt. DisableGadget ist natürlich eine dokumentierte Funktion. Was nicht "dokumentiert" ist, wenn sich Gadgets überlappen, überschneiden oder ineinander liegen. Also wie bei dir jetzt das ImageGadget und die Button. Es gibt aber Gadgets, wo sowas erlaubt ist. Das Frame3DGadge hat dafür in der Mitte ein Lücke. Die Container-Gadgets bspw. haben extra eine "Gadgetliste" für "Untergadgets". wenn man das Constainergadget gefüllt hat, schließt man es mit CloseGadgetList() schließen, damit man wieder Gadgets in Hauptfenster geöffnet werden. Übrigens Gadget in Container-Gadgets werden relativ zum Container positioniert. x,y=0 bedeutet linke obere Ecke des Containers.

Das Cavan-Gadget kann man mit den Flag wie ein Container-Gadget verwenden. Dann einfach in Canvan-Gadget das Bild reinzeichnen und es ist als Hintergrund da.

Das Problem mit CreateImage() ist schnell erklärt. Wir haben deine Bilddatei nicht und damit können wir CatchImage nicht verwenden. Wir haben schlicht einfach mit CreateImage ein leeres schwarzes Bild zur Demostartion genutzt.
Ersetzt CreateImage(#PB_Any,470,363) mit CatchImage(#pb_Any, ?Bild).

Edit: Weil ich selbst mit "nicht dokumentiert" oder "nicht definiert" probleme früher hatte. Das Bedeutet: Es kann klappen, muss aber nicht. Und kann sich jederzeit ändern. Darauf sollte man sich nicht verlassen. Ein ImageGadget als Hintergrund zu missbrauchen ist so eine undokumentiere Funktion, auf die man sich nicht verlassen sollte. Es klappt (wie du weist), aber sauber ist es nicht.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
wie_jetzt?
Beiträge: 21
Registriert: 28.08.2017 17:23

Re: Buttongadget funzt nicht.

Beitrag von wie_jetzt? »

Hi GPI,

vielen Dank für Deine Erklärung. Werde mir das zu Herzen nehmen und so ändern, dass das eine "saubere" Sache wird. Die Grafik wird umgestaltet, die Buttons liegen dann neben bzw. unter, aber nicht auf der Grafik.

Auch an PureLust und Josh vielen Dank für die Hilfe, werde Euch alle noch einige Male brauchen!
Was das Programmieren angeht, bin ich ein Anfänger mit fast 40 Jahren Erfahrung, mit gelegentlichen, mitunter jahrzehntelangen Unterbrechungen. Kann mich noch dunkel an den TI58 bei der Bundeswehr Anfang der 1980er erinnern. Habe da mit "Mondlandung" viele Stunden der Heimatverteidung verbracht - Insider werden's kennen.
... wir hatten doch sonst nix!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Buttongadget funzt nicht.

Beitrag von GPI »

Wie gesagt, schau dir das CanvasGadget an, in Container-Modus kannst du da problemlos die Buttons reinpacken.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten