Seite 1 von 1

callback bei PureColor für PB4

Verfasst: 12.07.2006 21:35
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

Verfasst: 12.07.2006 21:58
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

Verfasst: 12.07.2006 22:11
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

Verfasst: 13.07.2006 00:23
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

Verfasst: 13.07.2006 08:02
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

Verfasst: 13.07.2006 09:03
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

Verfasst: 13.07.2006 10:29
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

Verfasst: 13.07.2006 10:46
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

Verfasst: 13.07.2006 11:21
von Graffiti
Thanks @ Kiffi
getestet und funktioniert, jetzt muß ichs nur noch auf mein Programm zuhause übertragen.

gruß Graffiti

Verfasst: 13.07.2006 15:40
von Graffiti
habe gerade die 2 Zeilen eingebaut, funktioniert 1a

Danke und gruß Graffiti