Seite 3 von 4

Verfasst: 09.04.2009 17:38
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.

Verfasst: 09.04.2009 17:45
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()

Verfasst: 09.04.2009 17:58
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()

Verfasst: 09.04.2009 18:16
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
   
.......


Verfasst: 09.04.2009 18:35
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.

Verfasst: 09.04.2009 18:43
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:

Verfasst: 09.04.2009 20:06
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. :(

Verfasst: 10.04.2009 05:01
von edel
jo, ich guck nach der Arbeit mal drueber.

Verfasst: 10.04.2009 19:00
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

Verfasst: 11.04.2009 08:55
von Lord
Hallo Edel!

Jetzt funktioniert es wieder tadellos. Danke.

Gruß

Lord