callback bei PureColor für PB4

Für allgemeine Fragen zur Programmierung mit PureBasic.
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

callback bei PureColor für PB4

Beitrag von Graffiti »

Hallo habe da ein Problem mit dem neuen PureColor

vorher bei PB3.94 konnte ich im Windowcallback mit

Code: Alles auswählen

ReturnValue = PureCOLOR_CallBack(WindowID, message, wParam, lParam, ReturnValue)
die Farben im Listicon automatisch nach dem löschen einer Zeile aktualisieren. (trifft nur auf Zeilen außerhalb des vertikalen Scrollbereichs zu)
jetzt ist nur noch ein schmaler gelber Streifen zu sehen

zuvor wurde mit

Code: Alles auswählen

PureCOLOR_SetGadgetColorEx(#ListGadget,-1, RGB(255, 255, 223), RGB(255, 255, 255), #PureCOLOR_LV_AlternateColors)
die Farbe deklariert

bei PureColor für PB4 fehlt der Befehl, weiß jemand eine Lösung

Bild
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

Hi

Schau dir mal in der hilfe von PureColor die function "PureCOLOR_SetCellColorCallback()" an.
Ich mußte selber von 3.94 auf PB 4 umstellen und das geht super im ListIconGadget.

hoffe das hilft, wenn nicht melde dich einfach nochmal.

Gruß,
Nico
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag von Graffiti »

jabs probiert, aber irgendwas mache ich da verkehrt

das ganze Listicon flackert nur noch

Code: Alles auswählen

Procedure MyCellColorCallback(GadgetNumber.l, CellRow.l, CellColumn.l, *TextColor.Long, *BackColor.Long, *FontID.Long)

  PureCOLOR_SetGadgetColorEx(#ListGadget,-1, RGB(255, 255, 223), RGB(255, 255, 255), #PureCOLOR_LV_AlternateColors)

EndProcedure
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

Hier nochmal das orginal Example aus der Hilfe der PureCOLOR lib.
Schau dir das mal an denn du machst das falsch mit dem callback.

Code: Alles auswählen

FontID = LoadFont(0, "Courier New", 9, #PB_Font_Bold)
;
Procedure MyCellColorCallback(GadgetNumber.l, CellRow.l, CellColumn.l, *TextColor.LONG, *BackColor.LONG, *FontID.LONG)
  Shared FontID
  If GadgetNumber = 1
    CellText.s = GetGadgetItemText(GadgetNumber, CellRow, CellColumn)
    Debug Str(CellRow) + ":" + Str(CellColumn) + ">" + CellText
    Select CellText
      Case "Red"
        *TextColor\l = #Red
        Debug "-> Red"
      Case "Blue"
        *BackColor\l = #Blue
        *TextColor\l = #White
        Debug "-> Blue"
      Case "Green"
        *TextColor\l = #Green
        Debug "-> Green"
      Default
        *FontID\l = FontID
        Debug "-> Font"
    EndSelect
  EndIf
EndProcedure
; Create Window
OpenWindow(0, 100, 300, 400, 200, "PureCOLOR test : cell callback demo", #PB_Window_SystemMenu) 

If CreateGadgetList(WindowID(0)) 
  ListIconGadget(1, 1, 1, 300, 160, "0", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  ;
  AddGadgetColumn(1, 1, "1", 100)
  AddGadgetColumn(1, 2, "2", 100)
  AddGadgetItem(1, -1, "0:0" + Chr(10) + "0:1" + Chr(10) + "Red")
  AddGadgetItem(1, -1, "1:0" + Chr(10) + "1:1" + Chr(10) + "1:2")
  AddGadgetItem(1, -1, "Blue" + Chr(10) + "Green" + Chr(10) + "2:2")
  AddGadgetItem(1, -1, "3:0" + Chr(10) + "Red" + Chr(10) + "3:2")
  AddGadgetItem(1, -1, "Red" + Chr(10) + "4:1" + Chr(10) + "Red")
  AddGadgetItem(1, -1, "Green" + Chr(10) + "Blue" + Chr(10) + "5:2")
  AddGadgetItem(1, -1, "6:0" + Chr(10) + "6:1" + Chr(10) + "6:2")
  AddGadgetItem(1, -1, "Red" + Chr(10) + "Blue" + Chr(10) + "7:2")
EndIf
PureCOLOR_SetCellColorCallback(0, @MyCellColorCallback())
Repeat 
  EventID.l = WaitWindowEvent()
  If EventID = #PB_Event_CloseWindow 
    Break
  EndIf
ForEver
;
End
Was dabei zu beachten ist , ist was in dem CallBack steht.
Achte mal auf folgendes:

Code: Alles auswählen

*BackColor\l = #Blue
*TextColor\l = #White
Du darfst NICHT die Funktion PureCOLOR_SetGadgetColorEx() in dem callback aufrufen!!!

Gruß,
Nico
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag von Graffiti »

das habe ich schon versucht, aber wenn ich die

Code: Alles auswählen

*BackColor\l
definiere färbt es mir alle Zeilen ein und nicht nur jede 2. wie bei

Code: Alles auswählen

PureCOLOR_SetGadgetColorEx(#ListGadget,-1, RGB(x,x,x), RGB(x,x,x), #PureCOLOR_LV_AlternateColors) 
welchen Trick gibts dabei
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> welchen Trick gibts dabei

ich habe mal einen Samplecode von gnozal auf das nötigste reduziert. Also
bei mir läuft alles wie gewünscht.

(Wenn man das Fenster schliessen will, dann wird die aktuell markierte
Zeile gelöscht. Wenn alle Zeilen gelöscht sind, dann beendet sich das
Programm)

Code: Alles auswählen

OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 200, "PureCOLOR test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
If CreateGadgetList(WindowID(0)) 
  ListIconGadget(2, 5, 5, 390, 180, "", 386, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetItem(2, -1, "ListIconGadget 2-1")
  AddGadgetItem(2, -1, "ListIconGadget 2-2")
  AddGadgetItem(2, -1, "ListIconGadget 2-3")
  AddGadgetItem(2, -1, "ListIconGadget 2-4")
  AddGadgetItem(2, -1, "ListIconGadget 2-5")
EndIf

; Gadget colors
PureCOLOR_SetGadgetColorEx(2, RGB(0,0,0), RGB(255, 255, 255), RGB(255, 255, 223), #PureCOLOR_LV_AlternateColors)

Repeat 
  WWE = WaitWindowEvent()
  Select WWE
    Case #PB_Event_CloseWindow 
      RemoveGadgetItem(2, GetGadgetState(2))
  EndSelect
Until CountGadgetItems(2)=0

Vielleicht hast Du ja an einer anderen Stelle Deines Programmes Code,
der mit PureColor kollidiert.

Grüße ... Kiffi
a²+b²=mc²
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag von Graffiti »

habe jetzt auf 30 Einträge erhöht und das RemoveGadgetItem verändert
dann siehst du den Effekt den ich meine.

Code: Alles auswählen

OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 200, "PureCOLOR test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
If CreateGadgetList(WindowID(0)) 
  ListIconGadget(2, 5, 5, 390, 180, "", 386, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) 
    For a = 1 To 30
  AddGadgetItem(2, -1, "ListIconGadget 2-" + Str(a)) 
Next
EndIf 
; Gadget colors 
PureCOLOR_SetGadgetColorEx(2, RGB(0,0,0), RGB(255, 255, 255), RGB(255, 255, 223), #PureCOLOR_LV_AlternateColors) 

Repeat 
  WWE = WaitWindowEvent() 
  Select WWE 
    Case #PB_Event_CloseWindow 
      RemoveGadgetItem(2, 0)
   
EndSelect 
Until CountGadgetItems(2)=0
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> dann siehst du den Effekt den ich meine.

OK. Jetzt kann ich es nachvollziehen.

Schneller Workaround:

Packe direkt hinter die RemoveGadgetItem()-Zeile folgenden Code:

Code: Alles auswählen

InvalidateRect_(GadgetID(DeinListIconGadget),0,1)
UpdateWindow_(GadgetID(DeinListIconGadget)) 
Grüße ... Kiffi
a²+b²=mc²
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag von Graffiti »

Thanks @ Kiffi
getestet und funktioniert, jetzt muß ichs nur noch auf mein Programm zuhause übertragen.

gruß Graffiti
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag von Graffiti »

habe gerade die 2 Zeilen eingebaut, funktioniert 1a

Danke und gruß Graffiti
Antworten