Forum | | | | - Seite 1 - |
|  Julian Schmidt | Hallo, ich versuche gerade Tabchanged bei einem in einem Tab-Control plazierten Tab-Control abzufragen. Doch irgendwie misslingt es. Woran liegt das? KompilierenMarkierenSeparierenDef SetActiveTab(2) SendMessage(&(1),$0130C,&(2),0)
cls
var hTab1& = Create("TabCtrl", %hwnd, "Tab1", -1, 2, width(%hwnd)+4, height(%hwnd))
var hTab2& = Create("TabCtrl", hTab1&, "Tab1", 15, 45, width(hTab1&)-32, height(hTab1&)-60)
whileloop 4
InsertTab(hTab1&, &loop+1, "Tab"+Str$(&loop+1))
InsertTab(hTab2&, &loop+1, "Tab"+Str$(&loop+1))
Endwhile
while 1
waitinput
if TabChanged(hTab1&)
SetActiveTab(hTab2&,GetActiveTab(hTab1&))
elseif TabChanged(hTab2&)
SetActiveTab(hTab1&,GetActiveTab(hTab2&))
EndIf
Endwhile
LG
Julian57 |
| | | | |
|  | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | |  Julian Schmidt | Danke schön an alle die zu diesen Thread etwas beigetragen haben. Es funktioniert Perfekt  KompilierenMarkierenSeparierenDef SetActiveTab(2) SendMessage(&(1),$0130C,&(2),0)
cls
Usermessages 16
var hTab1& = Create("TabCtrl", %hwnd, "Tab1", -1, 2, width(%hwnd)+4, height(%hwnd))
var hTab2& = Create("TabCtrl", hTab1&, "Tab1", 15, 45, width(hTab1&)-32, height(hTab1&)-60)
Subclass %hwnd,1
whileloop 4
InsertTab(hTab1&, &loop+1, "Tab"+Str$(&loop+1))
InsertTab(hTab2&, &loop+1, "Tab"+Str$(&loop+1))
Endwhile
while 1
waitinput
if TabChanged(hTab1&)
SetActiveTab(hTab2&,GetActiveTab(hTab1&))
elseif %umessage=16
Subclass %hwnd,0
end
EndIf
Endwhile
SubClassProc
If SubClassMessage(%hwnd, $004E)
If long(&sLParam,0) = hTab2&
If long(&sLParam,8) = 0-550 - 1
SetActiveTab(hTab1&,GetActiveTab(hTab2&))
EndIf
EndIf
Set("WinProc",1)
EndIf
EndProc
|
| | | | |  |
| |  | Das Elterntabcontrol leitet die Nachricht wohl vom Kindtabcontrol nicht an das hWnd,
wenn Du das möchtest dann könntest das Elterntabcontrol dazu subclassen.
Optimal nichts auf Tabcontrols ablegen sondern auf Dialogen/ Fenstern. |
| | | | |
| |  Julian Schmidt | @iF Ich brauche für mein aktuelles Projekt auf jeden Fall zwei Tab-Controls. Deswegen wäre Subclassing schonmal ein Lösungsansatz.
Ein Alternativer Lösungsansatz von mir wäre den zweiten Tab-Control auf einen extra Dialog ala KompilierenMarkierenSeparierenvar class$="#32770"
var title$=""
External("USER32","CreateWindowExA",0,addr(class$),addr(title$),$40000000,10,20, 100, 50,%hwnd,0,%hinstance,1000)
zu legen. Würde Tab-Changed dann für den zweiten Tab-Control funktionieren?
Kannst du das mit den Subclassing proggen? |
| | | | |
| |  | Vlt. einfach wie im Beispiel aus der Hilfedatei in dem auch kein Control (auch kein Tab-Control) auf einem Tab-Control abgelegt wird -
erzeuge einfach beide Tab-Controls auf ein und dem selben Dialog/ Fenster. |
| | | | |
| |  Julian Schmidt | iF (06.01.12)
Vlt. einfach wie im Beispiel aus der Hilfedatei in dem auch kein Control (auch kein Tab-Control) auf einem Tab-Control abgelegt wird - erzeuge einfach beide Tab-Controls auf ein und dem selben Dialog/ Fenster.
Hab ich schon längst probiert. Dann wird nur das 1ste angezeigt. KompilierenMarkierenSeparierencls
var hTab1& = Create("TabCtrl", %hwnd, "Tab1", -1, 2, width(%hwnd)+4, height(%hwnd))
var hTab2& = Create("TabCtrl", %hwnd, "Tab1", 15, 45, width(hTab1&)-32, height(hTab1&)-60)
while 1
Endwhile
|
| | | | |
| |  Detlef Jagolski | Hallo! KompilierenMarkierenSeparieren $P+
SetErrorLevel 0
$H WINDOWS.PH
$H MESSAGES.PH
$H STRUCTS.PH
$H SHELLAPI.PH
$H COMMCTRL.PH
$I TABCONTROL.INC
Struct NMHDR = ~NMHDR
Proc OnApplicationExit
DeleteObject TextFont1&
Dispose pnmh#
Dispose TBC1#
Dispose TBC2#
SubClass %hwnd,0
SubClass PageControl1_Sheet1&,0
EndProc
Proc OnApplicationInit
EndProc
OnApplicationInit
Declare appexit%
Declare pnmh#
Declare TBC1#
Declare TBC2#
Declare PageControl1_Sheet1&
Declare PageControl1_Sheet2&
Declare PageControl1_Sheet3&
Declare PageControl1_Sheet4&
Declare PageControl1_Sheet5&
Declare PageControl2_Sheet1&
Declare PageControl2_Sheet2&
Declare PageControl2_Sheet3&
Declare PageControl2_Sheet4&
Declare PageControl2_Sheet5&
Declare PageControl1&
Declare PageControl2&
Dim TBC1#,TabControl
Dim TBC2#,TabControl
Dim pnmh#,NMHDR
var TextFont1& = Create("Font","MS Sans Serif",13,0,0,0,0)
Proc PageControl1_OnChange
Declare TBC1&
TBC1& = TBC1#.GetActiveTab()
If TBC1& = 0
TBC1#.SetActiveSheet(PageControl1_Sheet1&,1)
TBC1#.SetActiveSheet(PageControl1_Sheet2&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet3&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet4&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet5&,0)
ElseIf TBC1& = 1
TBC1#.SetActiveSheet(PageControl1_Sheet1&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet2&,1)
TBC1#.SetActiveSheet(PageControl1_Sheet3&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet4&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet5&,0)
ElseIf TBC1& = 2
TBC1#.SetActiveSheet(PageControl1_Sheet1&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet2&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet3&,1)
TBC1#.SetActiveSheet(PageControl1_Sheet4&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet5&,0)
ElseIf TBC1& = 3
TBC1#.SetActiveSheet(PageControl1_Sheet1&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet2&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet3&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet4&,1)
TBC1#.SetActiveSheet(PageControl1_Sheet5&,0)
ElseIf TBC1& = 4
TBC1#.SetActiveSheet(PageControl1_Sheet1&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet2&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet3&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet4&,0)
TBC1#.SetActiveSheet(PageControl1_Sheet5&,1)
EndIf
EndProc
Proc PageControl2_OnChange
Declare TBC2&
TBC2& = TBC2#.GetActiveTab()
If TBC2& = 0
TBC2#.SetActiveSheet(PageControl2_Sheet1&,1)
TBC2#.SetActiveSheet(PageControl2_Sheet2&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet3&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet4&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet5&,0)
ElseIf TBC2& = 1
TBC2#.SetActiveSheet(PageControl2_Sheet1&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet2&,1)
TBC2#.SetActiveSheet(PageControl2_Sheet3&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet4&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet5&,0)
ElseIf TBC2& = 2
TBC2#.SetActiveSheet(PageControl2_Sheet1&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet2&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet3&,1)
TBC2#.SetActiveSheet(PageControl2_Sheet4&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet5&,0)
ElseIf TBC2& = 3
TBC2#.SetActiveSheet(PageControl2_Sheet1&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet2&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet3&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet4&,1)
TBC2#.SetActiveSheet(PageControl2_Sheet5&,0)
ElseIf TBC2& = 4
TBC2#.SetActiveSheet(PageControl2_Sheet1&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet2&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet3&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet4&,0)
TBC2#.SetActiveSheet(PageControl2_Sheet5&,1)
EndIf
EndProc
SubClassProc
If SubClassMessage(%hwnd, ~WM_NOTIFY)
pnmh# = &sLParam
If pnmh#.hwndFrom& = PageControl1&
If pnmh#.code& = ~TCN_SELCHANGE
PageControl1_OnChange
EndIf
EndIf
Set("WinProc",1)
ElseIf SubClassMessage(PageControl1&, ~WM_NOTIFY)
pnmh# = &sLParam
If pnmh#.hwndFrom& = PageControl2&
If pnmh#.code& = ~TCN_SELCHANGE
PageControl2_OnChange
EndIf
EndIf
Set("WinProc",1)
EndIf
EndProc
Set("TrueColor",1)
WindowStyle $003F
WindowTitle "DesignForm"
Window %maxX + 5,114 - 691,416
Cls ~GetSysColor(15)
UseFont "MS Sans Serif",13,0,0,0,0
SetDialogFont 1
var hToolBmp& = create("hPic", 0, "TOOLBAR")
var hImageList1& = Create("ImageList", 16, 16, hToolBmp&, rgb(192, 192, 192))
PageControl1& = TBC1#.TabControl(%hwnd,10,60,672,322,hImageList1&,"PageControl1","PageControl1")
PageControl1& = TBC1#.GetHandel()
TBC1#.TBFont(TextFont1&)
PageControl1_Sheet1& = TBC1#.CreateTabSheet(4,25,664,293,2000,1)
TBC1#.InsertTab(1,"Seite 1",9)
PageControl1_Sheet2& = TBC1#.CreateTabSheet(4,25,664,293,2001,0)
TBC1#.InsertTab(2,"Seite 2",9)
PageControl1_Sheet3& = TBC1#.CreateTabSheet(4,25,664,293,2002,0)
TBC1#.InsertTab(3,"Seite 3",9)
PageControl1_Sheet4& = TBC1#.CreateTabSheet(4,25,664,293,2003,0)
TBC1#.InsertTab(4,"Seite 4",9)
PageControl1_Sheet5& = TBC1#.CreateTabSheet(4,25,664,293,2004,0)
TBC1#.InsertTab(5,"Seite 5",9)
PageControl2& = TBC2#.TabControl(PageControl1_Sheet1&,30,20,442,193,hImageList1&,"PageControl2","PageControl2")
PageControl2& = TBC2#.GetHandel()
TBC2#.TBFont(TextFont1&)
PageControl2_Sheet1& = TBC2#.CreateTabSheet(4,25,434,164,2005,1)
TBC2#.InsertTab(1,"Seite 1",9)
PageControl2_Sheet2& = TBC2#.CreateTabSheet(4,25,434,164,2006,0)
TBC2#.InsertTab(2,"Seite 2",9)
PageControl2_Sheet3& = TBC2#.CreateTabSheet(4,25,434,164,2007,0)
TBC2#.InsertTab(3,"Seite 3",9)
PageControl2_Sheet4& = TBC2#.CreateTabSheet(4,25,434,164,2008,0)
TBC2#.InsertTab(4,"Seite 4",9)
PageControl2_Sheet5& = TBC2#.CreateTabSheet(4,25,434,164,2009,0)
TBC2#.InsertTab(5,"Seite 5",9)
SubClass %hwnd,1
SubClass PageControl1_Sheet1&,1
SetWindowPos %hwnd = 207,114 - 691,416;0
WhileNot appexit%
WaitInput
If %key = 2
appexit%=1
ElseIf %key = 4
' Fenstergröße
ElseIf %key = 5
' Hilfe
EndIf
EndWhile
OnApplicationExit
Gruß
Detlef |
 | | | | |
| |  Julian Schmidt | Das funktioniert zwar, allerdings bekomme ich es nicht auf mein Beispiel übertragen. KompilierenMarkierenSeparieren $H MESSAGES.PH
$H STRUCTS.PH
$H SHELLAPI.PH
$H COMMCTRL.PH
Struct NMHDR = ~NMHDR
Def SetActiveTab(2) SendMessage(&(1),$0130C,&(2),0)
cls
Usermessages 16
var hTab1& = Create("TabCtrl", %hwnd, "Tab1", -1, 2, width(%hwnd)+4, height(%hwnd))
var hTab2& = Create("TabCtrl", hTab1&, "Tab1", 15, 45, width(hTab1&)-32, height(hTab1&)-60)
Subclass hTab2&,1
Declare pnmh#
Dim pnmh#,NMHDR
whileloop 4
InsertTab(hTab1&, &loop+1, "Tab"+Str$(&loop+1))
InsertTab(hTab2&, &loop+1, "Tab"+Str$(&loop+1))
Endwhile
while 1
waitinput
if TabChanged(hTab1&)
SetActiveTab(hTab2&,GetActiveTab(hTab1&))
elseif %umessage=16
Subclass hTab2&,0
end
EndIf
Endwhile
SubClassProc
If SubClassMessage(hTab2&, ~WM_NOTIFY)
pnmh# = &sLParam
If pnmh#.hwndFrom& = PageControl1&
If pnmh#.code& = ~TCN_SELCHANGE
SetActiveTab(hTab1&,GetActiveTab(hTab2&))
EndIf
EndIf
Set("WinProc",1)
EndIf
EndProc
|
| | | | |
| |  Detlef Jagolski | KompilierenMarkierenSeparieren $H WINDOWS.PH
$H MESSAGES.PH
$H STRUCTS.PH
$H SHELLAPI.PH
$H COMMCTRL.PH
Struct NMHDR = ~NMHDR
Def SetActiveTab(2) SendMessage(&(1),$0130C,&(2),0)
cls
Usermessages 16
var hTab1& = Create("TabCtrl", %hwnd, "Tab1", -1, 2, width(%hwnd)+4, height(%hwnd))
var hTab2& = Create("TabCtrl", hTab1&, "Tab1", 15, 45, width(hTab1&)-32, height(hTab1&)-60)
Subclass %hwnd,1
Declare Tab%
Declare pnmh#
Dim pnmh#,NMHDR
whileloop 4
InsertTab(hTab1&, &loop+1, "Tab"+Str$(&loop+1))
InsertTab(hTab2&, &loop+1, "Tab"+Str$(&loop+1))
Endwhile
while 1
waitinput
if TabChanged(hTab1&)
SetActiveTab(hTab2&,GetActiveTab(hTab1&))
elseif %umessage=16
Subclass hTab2&,0
end
EndIf
Endwhile
SubClassProc
If SubClassMessage(%hwnd, ~WM_NOTIFY)
pnmh# = &sLParam
If pnmh#.hwndFrom& = hTab1&
If pnmh#.code& = ~TCN_SELCHANGE
Tab% = GetActiveTab(hTab1&)
If Tab% = 0
SetWindowPos hTab2&=15, 45-width(hTab1&)-32, height(hTab1&)-60;0
ElseIf Tab% = 1
SetWindowPos hTab2&=0, 0-0,0;0
ElseIf Tab% = 2
SetWindowPos hTab2&=0, 0-0,0;0
ElseIf Tab% = 3
SetWindowPos hTab2&=0, 0-0,0;0
ElseIf Tab% = 4
SetWindowPos hTab2&=0, 0-0,0;0
EndIf
EndIf
EndIf
Set("WinProc",1)
EndIf
EndProc
|
| | | XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11 | 06.01.2012 ▲ |
| |
| |  Julian Schmidt | Ok das funktioniert super. KompilierenMarkierenSeparierenStruct NMHDR = hwndFrom&,idFrom&,code&
Def SetActiveTab(2) SendMessage(&(1),$0130C,&(2),0)
cls
Usermessages 16
var hTab1& = Create("TabCtrl", %hwnd, "Tab1", -1, 2, width(%hwnd)+4, height(%hwnd))
var hTab2& = Create("TabCtrl", hTab1&, "Tab1", 15, 45, width(hTab1&)-32, height(hTab1&)-60)
Subclass %hwnd,1
Declare pnmh#
Dim pnmh#,NMHDR
whileloop 4
InsertTab(hTab1&, &loop+1, "Tab"+Str$(&loop+1))
InsertTab(hTab2&, &loop+1, "Tab"+Str$(&loop+1))
Endwhile
while 1
waitinput
if TabChanged(hTab1&)
SetActiveTab(hTab2&,GetActiveTab(hTab1&))
elseif %umessage=16
Subclass hTab2&,0
end
EndIf
Endwhile
SubClassProc
If SubClassMessage(%hwnd, $004E)
pnmh# = &sLParam
If pnmh#.hwndFrom& = hTab2&
If pnmh#.code& = 0-550 - 1
SetActiveTab(hTab1&,GetActiveTab(hTab2&))
EndIf
EndIf
Set("WinProc",1)
EndIf
EndProc
Wäre das theoretisch auch ohne die Klasse möglich? |
| | | | |
| |  | Das ist keine Klasse sondern eine Struktur bzw. ein einfacher Speicher.
Dies hwndFrom&,idFrom&,code& sind 3 Longs also 3x4 Byte also kannst Du auch Dim pnmh#,12 schreiben ohne NMHDR zu deklarieren und pnmh#.code& wäre dann long(pnmh#,8) aber statt pnmh# = &sLParam würde ich eher rtlMoveMemory(pnmh#,&slParam,12) schreiben. |
| | | | |
| |  Detlef Jagolski | KompilierenMarkierenSeparierenDef SetActiveTab(2) SendMessage(&(1),$0130C,&(2),0)
cls
Usermessages 16
var hTab1& = Create("TabCtrl", %hwnd, "Tab1", -1, 2, width(%hwnd)+4, height(%hwnd))
var hTab2& = Create("TabCtrl", hTab1&, "Tab1", 15, 45, width(hTab1&)-32, height(hTab1&)-60)
Declare Tab%
whileloop 4
InsertTab(hTab1&, &loop+1, "Tab"+Str$(&loop+1))
InsertTab(hTab2&, &loop+1, "Tab"+Str$(&loop+1))
Endwhile
while 1
waitinput
if TabChanged(hTab1&)
PageControl1_OnChange
elseif %umessage=16
Subclass hTab2&,0
end
EndIf
Endwhile
Proc PageControl1_OnChange
Tab% = GetActiveTab(hTab1&)
If Tab% = 0
SetWindowPos hTab2&=15, 45-width(hTab1&)-32, height(hTab1&)-60;0
ElseIf Tab% = 1
SetWindowPos hTab2&=0, 0-0,0;0
ElseIf Tab% = 2
SetWindowPos hTab2&=0, 0-0,0;0
ElseIf Tab% = 3
SetWindowPos hTab2&=0, 0-0,0;0
ElseIf Tab% = 4
SetWindowPos hTab2&=0, 0-0,0;0
EndIf
EndProc
|
| | | | |
| |  Julian Schmidt | iF (06.01.12)
Das ist keine Klasse sondern eine Struktur bzw. ein einfacher Speicher. Dies hwndFrom&,idFrom&,code& sind 3 Longs also 3x4 Byte also kannst Du auch Dim pnmh#,12 schreiben ohne NMHDR zu deklarieren und pnmh#.code& wäre dann long(pnmh#,8) aber statt pnmh# = &sLParam würde ich eher rtlMoveMemory(pnmh#,&slParam,12) schreiben.
Stimmt so funktionierts. Danke IF  KompilierenMarkierenSeparierenDef SetActiveTab(2) SendMessage(&(1),$0130C,&(2),0)
cls
Usermessages 16
var hTab1& = Create("TabCtrl", %hwnd, "Tab1", -1, 2, width(%hwnd)+4, height(%hwnd))
var hTab2& = Create("TabCtrl", hTab1&, "Tab1", 15, 45, width(hTab1&)-32, height(hTab1&)-60)
Subclass %hwnd,1
Declare pnmh#
Dim pnmh#,12
whileloop 4
InsertTab(hTab1&, &loop+1, "Tab"+Str$(&loop+1))
InsertTab(hTab2&, &loop+1, "Tab"+Str$(&loop+1))
Endwhile
while 1
waitinput
if TabChanged(hTab1&)
SetActiveTab(hTab2&,GetActiveTab(hTab1&))
elseif %umessage=16
Subclass hTab2&,0
Dispose pnmh#
end
EndIf
Endwhile
SubClassProc
If SubClassMessage(%hwnd, $004E)
pnmh# = &sLParam
If long(pnmh#,0) = hTab2&
If long(pnmh#,8) = 0-550 - 1
SetActiveTab(hTab1&,GetActiveTab(hTab2&))
EndIf
EndIf
Set("WinProc",1)
EndIf
EndProc
|
| | | | |
|
AntwortenThemenoptionen | 14.109 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |