SetGadgetItemData & SetGadgetItemColor fuer Panel

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Beitrag von Lord »

Andesdaf hat geschrieben:im grunde genommen machst du dein zweites Fenster mit ner anderen Konstante
und passt die ersten zeilen noch an:

Code: Alles auswählen

#MainWindow = 1
#Panel = 1
#Tab1 = 0
#Second = 2 ; das zweite Fenster
dann geht es auch.

(um den Code von alter mann noch zu ergänzen.)
Hallo Andesdaf!

Es ist richtig, daß durch Verwendung einer neuen Konstanten dieser Fehler nicht auftritt.
Das Problem ist nur, daß ich in meinem Programm die Fenster öfter brauche, sie deshalb bei Bedarf öffne und wieder schließe,
weshalb sie immer die gleiche Nummer haben.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

dann leg' doch deine fenster in einer Procedure an, statt sie immer wieder
neu zu erstellen?

Code: Alles auswählen

Enumeration
  #WIN_Main
  #BUT_Main
EndEnumeration

Procedure Fenster()
  If OpenWindow(#WIN_Main,0,0,300,300,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    ButtonGadget(#BUT_Main,5,5,80,25,"Du")
  EndIf

Repeat
  Event = WaitWindowEvent()

Until Event = #PB_Event_CloseWindow
CloseWindow(#WIN_Main)
EndProcedure

Fenster()
MessageRequester("Machs","Nochmal")
Fenster()
Win11 x64 | PB 6.20
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Beitrag von Lord »

Andesdaf hat geschrieben:dann leg' doch deine fenster in einer Procedure an, statt sie immer wieder
neu zu erstellen?
Ich habe die Fenstererstellung in einer Prozedur ausgelagert.
Bei deinem Beispiel tritt der IMA nicht auf, weil Du kein PanelGadget, das Includefile und keines der vier betroffenen Befehle benutzt.

Hier dein Beispiel mit Panelgadget:

Code: Alles auswählen

IncludeFile "PanelGadget.pbi"

#MainWindow   = 1
#Panel        = 1
#Tab1         = 0

Procedure Fenster()
  If OpenWindow(#MainWindow,0,0,300,300,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    PanelGadget(#Panel, 5, 5, 290, 190)
    AddGadgetItem(#Panel, -1, "Tab 1")
    SetGadgetItemColor(#Panel, #Tab1, #PB_Gadget_FrontColor, $0000FF)

  EndIf

Repeat
  Event = WaitWindowEvent()

Until Event = #PB_Event_CloseWindow
CloseWindow(#MainWindow)
EndProcedure

Fenster()
MessageRequester("Machs","Nochmal")
Fenster()
Bild
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

kommentiere mal diese Zeile

Code: Alles auswählen

Procedure PB_PanelParentCB(hwnd,msg,wparam,lparam)
   Protected *pud.PB_Panel_User_Data   
   Protected *dis.DRAWITEMSTRUCT
   Protected shWnd.i
   Protected callback.i = GetProp_(hwnd,"_oldCallback")
   Protected fore.i,back.i,backbrush.i,text.s
   
   
   If #WM_DESTROY = msg
     ; RemoveProp_(hwnd,"_oldCallback") <------------------diese Zeile meine ich
   EndIf
   
.......

Win11 64Bit / PB 6.0
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Beitrag von Lord »

alter Mann hat geschrieben:kommentiere mal diese Zeile

Code: Alles auswählen

Procedure PB_PanelParentCB(hwnd,msg,wparam,lparam)
   Protected *pud.PB_Panel_User_Data   
   Protected *dis.DRAWITEMSTRUCT
   Protected shWnd.i
   Protected callback.i = GetProp_(hwnd,"_oldCallback")
   Protected fore.i,back.i,backbrush.i,text.s
   
   
   If #WM_DESTROY = msg
     ; RemoveProp_(hwnd,"_oldCallback") <------------------diese Zeile meine ich
   EndIf
   
.......

Hallo alter Mann!

Einem ersten Test zufolge scheint es damit soweit zu funktionieren.
Danke für die schnelle Hilfe. :allright:
Ich hoffe aber, daß diese 'Lösung' keine Spätschäden nach sich zieht.
Vielleicht kann edel als ursprunglicher 'Lieferant' des Includes noch etwas zu möglichen 'Nebenwirkungen' schreiben.
Einen Grund für den Befehl RemoveProp_() an dieser Stelle muß es ja geben.
Bild
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 »

Dann machste es einfach so:

Code: Alles auswählen

Procedure PB_PanelParentCB(hwnd,msg,wparam,lparam)
  Protected *pud.PB_Panel_User_Data   
  Protected *dis.DRAWITEMSTRUCT
  Protected shWnd.i
  Protected callback.i = GetProp_(hwnd,"_oldCallback")
  Protected fore.i,back.i,backbrush.i,text.s
  
  
  If #WM_DESTROY = msg
    If callback
      RemoveProp_(hwnd,"_oldCallback")
    EndIf
  EndIf
und schon sollte es gefahrlos zu nutzen sein :wink:
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
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Beitrag von Lord »

ts-soft hat geschrieben:Dann machste es einfach so:

Code: Alles auswählen

Procedure PB_PanelParentCB(hwnd,msg,wparam,lparam)
  Protected *pud.PB_Panel_User_Data   
  Protected *dis.DRAWITEMSTRUCT
  Protected shWnd.i
  Protected callback.i = GetProp_(hwnd,"_oldCallback")
  Protected fore.i,back.i,backbrush.i,text.s
  
  
  If #WM_DESTROY = msg
    If callback
      RemoveProp_(hwnd,"_oldCallback")
    EndIf
  EndIf
und schon sollte es gefahrlos zu nutzen sein :wink:
Hallo ts-soft!

Danke für deine Hilfestellung, aber so funktioniert es leider auch nicht.
Ich erhalte trotzdem einen IMA. :(
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

jo, ich guck nach der Arbeit mal drueber.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

ersetze mal folgende Funktion :

Code: Alles auswählen

Procedure PB_PanelParentCB(hwnd,msg,wparam,lparam) 
  Protected *pud.PB_Panel_User_Data    
  Protected *dis.DRAWITEMSTRUCT 
  Protected shWnd.l 
  Protected callback.l = GetProp_(hWnd,"_oldCallback") 
  Protected fore.l,back.l,backbrush.l,text.s 
  
  
  If #WM_DESTROY = msg
    SetWindowLong_(hwnd,#GWL_WNDPROC,callback)      
    RemoveProp_(hwnd,"_oldCallback")
  EndIf 
  
  If #WM_DRAWITEM = msg 
    *dis = lParam 
    
    If *dis\CtlType = #ODT_TAB 
      
      shWnd = PB_GetPanelStaticItem(IsGadget(*dis\CtlID),*dis\itemID) 
      *pud  = GetWindowLong_(shWnd,#GWL_USERDATA)    
      
      If *pud                      
        fore = *pud\ForeColor 
        back = *pud\BackColor 
        
        If back = #PB_Default 
          back = GetSysColor_(#COLOR_BTNFACE)              
        EndIf 
        
        If fore = #PB_Default 
          fore = GetSysColor_(#COLOR_BTNTEXT)              
        EndIf            
        
      Else                    
        fore = GetSysColor_(#COLOR_BTNTEXT) 
        back = GetSysColor_(#COLOR_BTNFACE) 
      EndIf 
        
        backbrush = CreateSolidBrush_(back) 
        
        fore = SetTextColor_(*dis\hdc, fore)                
        FillRect_(*dis\hdc, *dis\rcItem, backbrush) 
        SetBkMode_(*dis\hdc, #TRANSPARENT) 
        text = GetGadgetItemText(*dis\CtlID,*dis\ItemID)                                  
        DrawText_(*dis\hdc, text, Len(text), *dis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER)            
        DeleteObject_(backbrush)            
        SetTextColor_(*dis\hdc, fore) 
        
        ProcedureReturn  0 
        
    EndIf 
   
  EndIf 
  
  ProcedureReturn CallWindowProc_(callback,hwnd,msg,wparam,lparam) 
EndProcedure
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Beitrag von Lord »

Hallo Edel!

Jetzt funktioniert es wieder tadellos. Danke.

Gruß

Lord
Bild
Antworten