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 » 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: 324 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: 324 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: 324 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: 324 Registriert: 21.01.2008 19:11
Beitrag
von Lord » 11.04.2009 08:55
Hallo Edel!
Jetzt funktioniert es wieder tadellos. Danke.
Gruß
Lord