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.
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

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

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