select-case abfrage wird scheinbar mehrfach ausgeführt?

Anfängerfragen zum Programmieren mit PureBasic.
finnkerchief
Beiträge: 17
Registriert: 01.11.2008 12:48
Wohnort: Österreich

select-case abfrage wird scheinbar mehrfach ausgeführt?

Beitrag von finnkerchief »

[Sorry, ich glaube ich habe den ersten Beitrag falsch gepostet, da er nirgends aufgeschienen ist, deshalb 2 Versuch]

Hallo zusammen!
Bin seit längerem eine passiver Besucher dieses Forums gewesen und habe bisher immer Lösungen für meine Fragen finden können (Dankeschön!). Jetzt weiß ich alledings nicht weiter und hab mich entschlossen auch als aktiver Benutzer dem Forum beizutreten. Ich programmiere zwar schon eine Weile, würde mich jedoch nicht als erfahrenen Programierer sehen. Meist reichte intensives tüfteln, um meine Ideen zu realisieren. :coderselixir: > /:-> > :shock:

Jetzt steck ich jedoch fest: Ich brauche für ein Projekt einen Colorpicker, der ein paar Farben vordefiniert anbietet, einen Farbmischer enthält und Helligkeitsstufen für gemischte Farben anbietet. Folgendes hab ich mir zusammengeschraubt:

Code: Alles auswählen

OpenWindow(15,0,0,400,150,"Farbe wählen",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
;StickyWindow(15,1)
CreateGadgetList(WindowID(15))
 
xpos=37 : ypos=10
ContainerGadget(1501,xpos,ypos,25,25, #PB_Container_Double) : CloseGadgetList() : xpos+35
; Schattierungen
StringGadget(1502,xpos,ypos,20,20,"", #PB_String_ReadOnly) :  xpos+25
StringGadget(1503,xpos,ypos,20,20,"", #PB_String_ReadOnly) :  xpos+25
StringGadget(1504,xpos,ypos,20,20,"", #PB_String_ReadOnly) :  xpos+25
StringGadget(1505,xpos,ypos,20,20,"", #PB_String_ReadOnly) :  xpos+25
StringGadget(1506,xpos,ypos,20,20,"", #PB_String_ReadOnly):  xpos+25
StringGadget(1507,xpos,ypos,20,20,"", #PB_String_ReadOnly) 

xpos=10: ypos+40 
TextGadget(1508,xpos,ypos,20,20,"R")  : TrackBarGadget(1509,xpos+20,ypos,195, 20, 0,255) : ypos+30
TextGadget(1510,xpos,ypos,20,20,"G")  : TrackBarGadget(1511,xpos+20,ypos,195, 20, 0,255) : ypos+30
TextGadget(1512,xpos,ypos,20,20,"B")  : TrackBarGadget(1513,xpos+20,ypos,195, 20, 0,255) 

SetGadgetColor(1501,#PB_Gadget_BackColor, RGB(GetGadgetState(1509),GetGadgetState(1511),GetGadgetState(1513)))

; Schattierungen
xpos=240 : ypos=10
StringGadget(1515,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1516,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1517,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1518,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1519,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1520,xpos,ypos,20,20,"", #PB_String_ReadOnly) 

xpos=240 : ypos+25
StringGadget(1521,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1522,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1523,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1524,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1525,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25
StringGadget(1526,xpos,ypos,20,20,"", #PB_String_ReadOnly) : xpos+25

; vordefinierte Farben setzen
SetGadgetColor(1515,#PB_Gadget_BackColor, RGB(0,0,0))
SetGadgetColor(1516,#PB_Gadget_BackColor, RGB(255,0,0))
SetGadgetColor(1517,#PB_Gadget_BackColor, RGB(0,255,0))
SetGadgetColor(1518,#PB_Gadget_BackColor, RGB(0,0,255))
SetGadgetColor(1519,#PB_Gadget_BackColor, RGB(255,255,0))
SetGadgetColor(1520,#PB_Gadget_BackColor, RGB(0,255,255))

SetGadgetColor(1521,#PB_Gadget_BackColor, RGB(255,0,255))
SetGadgetColor(1522,#PB_Gadget_BackColor, RGB(255,200,0))
SetGadgetColor(1523,#PB_Gadget_BackColor, RGB(200,0,255))
SetGadgetColor(1524,#PB_Gadget_BackColor, RGB(0,50,200))
SetGadgetColor(1525,#PB_Gadget_BackColor, RGB(0,0,0))
SetGadgetColor(1526,#PB_Gadget_BackColor, RGB(0,0,0))


Repeat
 EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget
 
      Select EventGadget()

        Case 1509, 1511, 1513   ; Farbeinstellung über Schieber
          ; refresh
          SetGadgetColor(1501,#PB_Gadget_BackColor, RGB(GetGadgetState(1509),GetGadgetState(1511),GetGadgetState(1513)))
          
          ;Schattierungen
          frstep=(255-GetGadgetState(1509))/6
          fgstep=(255-GetGadgetState(1511))/6
          fbstep=(255-GetGadgetState(1513))/6
          SetGadgetColor(1502,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+frstep,GetGadgetState(1511)+fgstep,GetGadgetState(1513)+fbstep))
          SetGadgetColor(1503,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*2),GetGadgetState(1511)+(fgstep*2),GetGadgetState(1513)+(fbstep*2)))
          SetGadgetColor(1504,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*3),GetGadgetState(1511)+(fgstep*3),GetGadgetState(1513)+(fbstep*3)))
          SetGadgetColor(1505,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*4),GetGadgetState(1511)+(fgstep*4),GetGadgetState(1513)+(fbstep*4)))
          SetGadgetColor(1506,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*5),GetGadgetState(1511)+(fgstep*5),GetGadgetState(1513)+(fbstep*5)))
          SetGadgetColor(1507,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*6),GetGadgetState(1511)+(fgstep*6),GetGadgetState(1513)+(fbstep*6)))
               
        Case 1502 To 1507, 1515 To 1526 ; wenn auf ein gadget geklickt wird Farbe neu einstellen

            fetchcol.l=GetGadgetColor(EventGadget(),#PB_Gadget_BackColor)
            SetGadgetColor(1501,#PB_Gadget_BackColor,fetchcol)
            
            Debug Str(EventGadget())+": "+Str(Red(fetchcol)) +" * "+ Str(Green(fetchcol))+" * "+ Str(Blue(fetchcol))
            
            ; schieber einstellen auf neue Farbe
            SetGadgetState(1509,Red(fetchcol))
            SetGadgetState(1511,Green(fetchcol))
            SetGadgetState(1513,Blue(fetchcol))
            
            ; Schattierungen nachstellen 
            frstep=(255-Red(fetchcol))/6
            fgstep=(255-Green(fetchcol))/6
            fbstep=(255-Blue(fetchcol))/6
                
           SetGadgetColor(1502,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+frstep,GetGadgetState(1511)+fgstep,GetGadgetState(1513)+fbstep))
           SetGadgetColor(1503,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*2),GetGadgetState(1511)+(fgstep*2),GetGadgetState(1513)+(fbstep*2)))
           SetGadgetColor(1504,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*3),GetGadgetState(1511)+(fgstep*3),GetGadgetState(1513)+(fbstep*3)))
           SetGadgetColor(1505,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*4),GetGadgetState(1511)+(fgstep*4),GetGadgetState(1513)+(fbstep*4)))
           SetGadgetColor(1506,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*5),GetGadgetState(1511)+(fgstep*5),GetGadgetState(1513)+(fbstep*5)))
           SetGadgetColor(1507,#PB_Gadget_BackColor, RGB(GetGadgetState(1509)+(frstep*6),GetGadgetState(1511)+(fgstep*6),GetGadgetState(1513)+(fbstep*6)))
;             
           SetActiveGadget(1501)
  
      EndSelect  
    EndIf

  Until EventID = #PB_Event_CloseWindow 
 
 End 
Zwei Probleme beschäftigen mich:
1) die anklickbaren Farbfelder rechts wollte ich ursprünglich mit einem Containergadget realisieren, um Gadgetfarbe einfach mit setgadgetcolor-getgadgetcolor zu verändern. Das hat nicht geklappt, da Eventgadget() die Klicks auf die containergadgets nicht zurückgegeben hat. Also habe ich ein Stringgadget gewählt, was jedoch den Cursor verändert (was ich noch gerne irgendwie verhindern würde)

2) Im Moment kann man die Schieber verwenden um Farben zu mischen und die vorgefertigten Farben anklicken. Wenn man jedoch auf die Helligkeitsstufen klickt, wird die Farbe links oben nicht korrekt übernommen. Der Debugger zeigt mir an, dass jeder Einzelklick die Casebedingung 2-3x durchlaufenlässt und sich die Farbwerte dabei verändern. Nur hab ich keine Ahnung - warum? :roll:

Hoffe der Code ist nicht zu umständlich lesbar und korrekt gepostet und bin für alle Hinweise dankbar!

LG und Thx

PS: Bin im Forenbenutzen ziemlich am Anfang, deshalb hoffe ich mal, dass dieses Posting im richtigen Thread landet.
System: Win XP, SP3, PB 4.31, Pentium D 3 GHz 1 GB RAM
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

zu 1)
Nimm doch ein ImageGadget().

Zu 2)
Bei einem Klick auf ein Gadget entsteht nicht nur ein Klick-Event, sondern
auch ein 'Maustaste unten', 'Maustaste hoch' und je nachdem auch noch
andere Events.
Benutz also besser noch 'EventType()'
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Willkommen bei den "aktiven Nutzern" :D :mrgreen:

noch ein tip:
du hast hier ziemlich häufig GetGadgetState() für 1509, 1511 und 1513
die könntest du vorab, also direkt nach dem If EventID = #PB_Event_Gadget
bzw. nach dem von Nic vorgeschlagenen Test auf CLICK ausführen,
und in drei Variablen oder einer Struktur zwischenspeichern.
du hast dann deine RGB-Anweisungen besser lesbar und
sparst außerdem den mehrfachen call der GetGadgetState() Routine.


und eine Anmerkung:
Die Verwendung fester IDs mit höheren Werten bedeutet immer, dass eine Liste im Hintergrund mitgeschleppt wird,
aber in diesem Fall, wo du anscheinend eine Menge Einzelfenster verwaltest und sprechende Nummernkreise verwendest,
kann es durchaus ein Vorteil sein und die übersichtlichkeit verbessern.
also im Allgemeinen würde man zur Verwendung von Enum raten,
aber in diesem Fall ist das schon ok so.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Was ist daran okay bei ca 19 Gadgets speicherplatz für 1526 zu verbrauchen :freak:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

weil es sich hier offenbar mit Fenster 15 um eines von 15 Subfenstern Handelt.

also sind es nicht 19 Gadgets, sondern wahrscheinlich mehrere Hundert insgesamt.
Außerdem wird nicht Speicherplatz für die Gadgets verbraucht, sondern nur für deren Handles.
bei tausend unbenutzten aber gespeicherten Handles sind das grad mal 4 bzw. 8 KB, also *pft*

bei einer solchen Konstellation sprechende Nummernkreise zu verwenden,
ist durchaus übersichtlich wenn man gewöhnt ist damit zu arbeiten.

wenn man so ein Projekt von Anfang an mit Enumeration aufzieht, ok.

aber mittendrin die Verwaltung von hunderten von Gadgets aus zwei
dutzend Nummernkreisen auf Konstanten in Enum-Listen umzustellen -
es gibt sanftere Wege den Verstand abzutöten.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

so, so, nur 4 byte, ich dachte die Strukture wäre etwas größer :mrgreen:
Sprechende Konstanten oder Variablen (#PB_Any) tuns also nicht :freak:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

*achselzuck* achja, is ja ne struct. is auch egal. wie groß kann die schon sein?
selbst wenn sie 256byte groß ist, das rechtfertigt den Aufwand nicht.

> Sprechende Konstanten oder Variablen (#PB_Any) tuns also nicht
der punkt ist, ich wiederhols gerne nochmal:
wenn man ein neues Projekt beginnt und gleich mit Enum anfängt, prima.
Enum zu verwenden spart den Platz für die Lücken in den Listen, klar.
eigene, lückenlose Liste (#PB_Any) mit beschreibenden IDs, fein.

aber wenn man ein Projekt hat, wo hunderte Gadgets in Nummernkreisen verwaltet werden,
halte ich es für unsinnig, das mittendrin mit Gewalt umzustellen, nur damit man nicht komisch angekuckt wird.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ich dachte wir wären im Anfängerforum, wo man den richtigen Weg aufzeigt
und nicht sagt: So wie Du es gemacht hast ist es Kacke, aber laß da mal
ruhig so, macht weniger Arbeit, vorerst.

Diese Art und Weise verschwendet nicht nur Speicher, sondern führt früher
oder später auch zu Problemen bzw. Unübersichtlichkeit.

Nummern können auch nicht besonders gut sprechen :mrgreen:

yust my two cents

bzw. es gibts auch Arrays (wegen der fenster)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Ich dachte wir wären im Anfängerforum, wo man den richtigen Weg aufzeigt

eben deswegen hab ich es überhaupt erwähnt.


> und nicht sagt: So wie Du es gemacht hast ist es Kacke, aber laß da mal
> ruhig so, macht weniger Arbeit, vorerst.

es ist nicht kacke, es ist nur der weniger gute weg.


> Diese Art und Weise verschwendet nicht nur Speicher, sondern führt früher
> oder später auch zu Problemen bzw. Unübersichtlichkeit.

in einem laufenden Projekt führt die Umstellung selber sofort zu Schwierigkeiten,
es bei Nummernkreisen zu belassen zu keinen.


> Nummern können auch nicht besonders gut sprechen

blöder spruch, ich kann mir nicht vorstellen, dass du niemals mit nem sprechenden code konfrontiert wurdest.

nur mal als beispiel:
jeder versteht 20081101.
aber 2454772 wohl kaum, außer du investierst fünfzig Mannstunden um die
Enum-Liste zu erstellen, die es in die Konstante #Erster_November einträgt,
und dann musst du es immer noch mit der Variablen qHeute vergleichen. /:->
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
finnkerchief
Beiträge: 17
Registriert: 01.11.2008 12:48
Wohnort: Österreich

Vielen Dank!

Beitrag von finnkerchief »

Erstmal vielen Dank für die schnelle und gezielte Antwort und auch die Diskussion zum Thema. An EventType() habe ich nicht gedacht (an dieser Stelle vermisse ich den Smiley der sich auf die Stirn haut). - Danke für den Hinweis, ich werd das implementieren.

Die häufigen Aufrufe von Getgadgetstate sind beim rumprobieren entstanden, und stehen geblieben, solche Holprigkeiten begradige ich meistens erst, wenn das ganze funktioniert. <) Vielleicht nicht die beste Methode - aber typisches autodidaktisches homemade Tüfteln :roll:

Bezüglich der Gadgetnummerierung: Es ist so wie vermutet. Ich habe vor ca einem Jahr mit einem Projekt begonnen, dass immer größer geworden ist und immer mehr Funktionen sind im laufe der Zeit dazugekommen. Enumeration war mir am Anfang nicht bekannt, deswegen habe ich mit Nummernkreisen improvisiert. Es funktioniert ganz gut, auch wenn ich's nicht nochmal so machen würde, jetzt wo ich die Alternative kenne.

Das schöne ist, man lernt bei jedem Projekt dazu und wer kennt den Moment nicht, an dem man sich denkt - wenn ich nochmal beginnen würde - würd ich vieles anders/besser machen :lol:

Jetzt werd ich den Code umschreiben und dann den fertigen Colorpicker posten, vielleicht kann jemand anderer damit was für sich anfangen.

Vielen Dank jedenfall, ihr habt mir sehr geholfen.
System: Win XP, SP3, PB 4.31, Pentium D 3 GHz 1 GB RAM
Antworten