Problem mit 32-Bit-Farbe als optionaler Parameter

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Problem mit 32-Bit-Farbe als optionaler Parameter

Beitrag von STARGÅTE »

Tachchen,

ich bin eben auf ein problem gestoßen, was ich sonst nie richtig hatte:

Wie bekannt ist, nutzt eine 32-Bit-Farbe auch wirklich alle 32Bit aus, von vollem weiß ($FFFFFFFF) bis transparentem schwarz ($00000000).

Nun möchte ich bei einer Prozedur als optionalen Parameter eine Farbe übergeben.
Da eine farbe ja alle 32-Bit nutzt kann ich hier als Typ keine Long nutzen, da sonst #PB_Default = -1 = $FFFFFFFF ist.
Also habe ich bis heute einer Farbe immer den Typ Quad gegeben, sodass ich sicher sein kann, das mit -1 wirklich #PB_Default gemeint ist, also keine Farbe übergeben wurde.

Das klappt bei einer direkten übergabe auch.

Wenn nun aber "jemand" eine Farbe von zB Point() oder so übergibt, Funktioniert das nicht, weil Point eine Long zurück gibt.

Code: Alles auswählen

Procedure Beispiel(Color.q=#PB_Default)
	If Color = #PB_Default
		Debug "Default"
	Else
		Debug RSet(Hex(Color,#PB_Long),8,"0")
	EndIf
EndProcedure


Beispiel()
Beispiel($FF0000FF)
Beispiel($00000000)
Beispiel($FFFFFFFF)

Debug "---"

CreateImage(0, 1, 1, 32)
StartDrawing(ImageOutput(0))
	DrawingMode(#PB_2DDrawing_AllChannels)
	Plot(0,0,$FFFFFFFF)
	Beispiel(Point(0,0))
	Quad.q = Point(0,0)
	Beispiel(Quad)
StopDrawing()
Hat jemand eine Idee, wie ich man eine Farbe als optionalen Parameter einrichten kann ?
Ohne das der nutzer selbst den Typ konvertieren muss mit zB Quad.q = Color & $FFFFFFFF
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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: Problem mit 32-Bit-Farbe als optionaler Parameter

Beitrag von PureLust »

STARGÅTE hat geschrieben:Hat jemand eine Idee, wie ich man eine Farbe als optionalen Parameter einrichten kann ?
Ohne das der nutzer selbst den Typ konvertieren muss mit zB Quad.q = Color & $FFFFFFFF
Hi STARGÅTE,

also wenn Du den optionalen Parameter für Deinen Prozedur nicht unbedingt als #PB_Default deklarieren musst (auch wenn's vielleicht im Prozedur-Statustip ein bisschen besser aussieht), so kannst Du Dir wie folgt helfen:

Code: Alles auswählen

Procedure Beispiel(Color.q = $1FFFFFFFF)
   If Color = $1FFFFFFFF
      Debug "Default"
   Else
      Debug RSet(Hex(Color,#PB_Long),8,"0")
   EndIf
EndProcedure
Gruß, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Problem mit 32-Bit-Farbe als optionaler Parameter

Beitrag von STARGÅTE »

Autsch, manchmal sind es die einfachsten Dinge ^^

Klar, einfach als "Default-Wert" ein Wert nehmen, der nie als Long auftritt.
Danke.

Code: Alles auswählen

#PB_DefaultColor = $100000000

Procedure Beispiel(Color.q=#PB_DefaultColor)
   If Color = #PB_DefaultColor
      Debug "Default"
   Else
      Debug RSet(Hex(Color,#PB_Long),8,"0")
   EndIf
EndProcedure


Beispiel()
Beispiel($FF0000FF)
Beispiel($00000000)
Beispiel($FFFFFFFF)

Debug "---"

CreateImage(0, 1, 1, 32)
StartDrawing(ImageOutput(0))
   DrawingMode(#PB_2DDrawing_AllChannels)
   Plot(0,0,$FFFFFFFF)
   Beispiel(Point(0,0))
   Quad.q = Point(0,0)
   Beispiel(Quad)
StopDrawing() 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten