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:  325  		Registriert:  21.01.2008 19:11 		
		
						
						
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von Lord   »  09.04.2009 17:38 
			
			
			
			
			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.
 
			
			
									
									
						 
		 
				
		
		 
	 
				
			
		
		
			
				
																			
								Andesdaf 							 
						Moderator 			
		Beiträge:  2673  		Registriert:  15.06.2008 18:22 		
		
											Wohnort:  Dresden 
							
						
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von Andesdaf   »  09.04.2009 17:45 
			
			
			
			
			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:  325  		Registriert:  21.01.2008 19:11 		
		
						
						
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von Lord   »  09.04.2009 17:58 
			
			
			
			
			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() 
			
			
									
									
						 
		 
				
		
		 
	 
	
						
		
		
			
				
								alter Mann 							 
									
		Beiträge:  201  		Registriert:  29.08.2008 09:13 		
		
											Wohnort:  hinterm Mond 
							
						
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von alter Mann   »  09.04.2009 18:16 
			
			
			
			
			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:  325  		Registriert:  21.01.2008 19:11 		
		
						
						
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von Lord   »  09.04.2009 18:35 
			
			
			
			
			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. 
  
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.
 
			
			
									
									
						 
		 
				
		
		 
	 
	
						
		
		
			
				
								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   »  09.04.2009 18:43 
			
			
			
			
			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  
 
			
			
									
									
						 
		 
				
		
		 
	 
	
						
		
		
			
				
																			
								Lord 							 
									
		Beiträge:  325  		Registriert:  21.01.2008 19:11 		
		
						
						
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von Lord   »  09.04.2009 20:06 
			
			
			
			
			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  
Hallo ts-soft!
Danke für deine Hilfestellung, aber so funktioniert es leider auch nicht.
Ich erhalte trotzdem einen IMA.  
 
			
			
									
									
						 
		 
				
		
		 
	 
	
						
		
		
			
				
								edel 							 
									
		Beiträge:  3667  		Registriert:  28.07.2005 12:39 		
		
											Computerausstattung:  GameBoy 
												
							
				Kontaktdaten: 
				
			 
				
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von edel   »  10.04.2009 05:01 
			
			
			
			
			jo, ich guck nach der Arbeit mal drueber.
			
			
									
									
						 
		 
				
		
		 
	 
	
						
		
		
			
				
								edel 							 
									
		Beiträge:  3667  		Registriert:  28.07.2005 12:39 		
		
											Computerausstattung:  GameBoy 
												
							
				Kontaktdaten: 
				
			 
				
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von edel   »  10.04.2009 19:00 
			
			
			
			
			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:  325  		Registriert:  21.01.2008 19:11 		
		
						
						
		 
		
						
						
						 
			 
													
							
						
									
						Beitrag 
					 
								von Lord   »  11.04.2009 08:55 
			
			
			
			
			Hallo Edel! 
 
Jetzt funktioniert es wieder tadellos. Danke. 
 
Gruß 
 
Lord