TabActivate
Moderator: Moderatoren
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2121
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 72 Mal
TabActivate
Servus,
wird bei Euch der Codeblock auch 2x aufgerufen, wenn der Tab aktiviert wird?
wird bei Euch der Codeblock auch 2x aufgerufen, wenn der Tab aktiviert wird?
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: TabActivate
"nur" TAB oder bei Crtl-TAB (PDR 6132)?Werner_Bayern hat geschrieben:wird bei Euch der Codeblock auch 2x aufgerufen, wenn der Tab aktiviert wird?
gruss by OHR
Jimmy
Jimmy
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2121
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 72 Mal
Re: TabActivate
Danke.
Nein, ich bin z. B. auf Tab1, klicke mit der Maus auf Tab3 (egal ob mit VisualStyle oder ohne) und der Tab3Activate feuert 2x.
Nein, ich bin z. B. auf Tab1, klicke mit der Maus auf Tab3 (egal ob mit VisualStyle oder ohne) und der Tab3Activate feuert 2x.
Code: Alles auswählen
oTab3:TabActivate := {|| msgbox("ich schon wieder"), oTab3:setColorBG(TABAKTIV), oTab2:setColorBG(TABINAKTIV),;
oTab1:setColorBG(TABINAKTIV), oTab4:setColorBG(TABINAKTIV), oTab5:setColorBG(TABINAKTIV), oTab6:setColorBG(TABINAKTIV),;
setAppfocus(aEditControls[ADR_GEHALT])}
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Martin Altmann
- Foren-Administrator
- Beiträge: 16508
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: TabActivate
Werner,
vergiss es - Du testest falsch
Durch den Aufruf der MessageBox verliert der Tab ja den Fokus - und erhält ihn erneut nach dem Schließen der MessageBox
Viele Grüße,
Martin
vergiss es - Du testest falsch
Durch den Aufruf der MessageBox verliert der Tab ja den Fokus - und erhält ihn erneut nach dem Schließen der MessageBox
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2121
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 72 Mal
Re: TabActivate
Servus Martin,
oh, also ein TabActivate ist ein setInputFocus?
oh, also ein TabActivate ist ein setInputFocus?
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: TabActivate
Eher ein setFocus(), da der Input nur auf den dortigen SLE erfolgen kann
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: TabActivate
Tatsächlich SetDisplayFocus. Siehe Doku der XbpDialog-Klasse.
Falls es sich nicht (nur) um einen Debugfehler handelt, würde ich mal eine Protokollierung des Callstacks in den Codeblock einbauen.
Falls es sich nicht (nur) um einen Debugfehler handelt, würde ich mal eine Protokollierung des Callstacks in den Codeblock einbauen.
Herzlich,
Tom
Tom
- Martin Altmann
- Foren-Administrator
- Beiträge: 16508
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: TabActivate
Werner,
probiere mal einfach statt einer MessageBox() - was ja einen Fokuswechsel nach sich zieht - das loggen in eine Log-Datei zur Kontrolle.
Viele Grüße,
Martin
probiere mal einfach statt einer MessageBox() - was ja einen Fokuswechsel nach sich zieht - das loggen in eine Log-Datei zur Kontrolle.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2121
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 72 Mal
Re: TabActivate
und siehe da, nur 1 Meldung in der Log-Datei. Danke!Martin Altmann hat geschrieben:Werner,
probiere mal einfach statt einer MessageBox() - was ja einen Fokuswechsel nach sich zieht - das loggen in eine Log-Datei zur Kontrolle.
Also Merke: TabActivate wird nicht nur beim Click auf den Tab gerufen, sondern jedesmal, wenn das Teil den Focus bekommt?
Da muss ich alle meine Tabs überarbeiten.
M. M. n. nicht ganz "sauber".
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: TabActivate
Doch, das ist ganz sauber, denn ob du per Maus draufklickst oder ob das Programm eine Seite zur Ansicht bringt,
in beiden Fällen muss darauf reagiert werden.
Einige setzen z.B. den Selectbereich je Fenster und je Tabpage ...
oder eine Plausiprüfung ob die Tabpage Elemente ausblenden muss
oder gar eine Fehlermeldung ausgibt "zuerst ... erledigen ..."
nicht zuletzt müssen die anderen TabSeiten versteckt und die aktive angezeigt werden
in beiden Fällen muss darauf reagiert werden.
Einige setzen z.B. den Selectbereich je Fenster und je Tabpage ...
oder eine Plausiprüfung ob die Tabpage Elemente ausblenden muss
oder gar eine Fehlermeldung ausgibt "zuerst ... erledigen ..."
nicht zuletzt müssen die anderen TabSeiten versteckt und die aktive angezeigt werden
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2121
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 72 Mal
Re: TabActivate
nach meinem Verständnis müsste ein Aktivate ausgelöst werden, wenn der Tab aktiviert wird, also wie Du schreibst, per Mausklick oder per Programm.
Für den Focus gibt es andere Nachrichten und Callbacks.
Und das Minimieren und Maximieren ist nicht notwendig, wird automatisch gemacht. Macht man es im TabActivate, dann wird es auch mehrmals ausgeführt.
Für den Focus gibt es andere Nachrichten und Callbacks.
Und das Minimieren und Maximieren ist nicht notwendig, wird automatisch gemacht. Macht man es im TabActivate, dann wird es auch mehrmals ausgeführt.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: TabActivate
OK, ist schon lange her dass ich TABs programmiert habeWerner_Bayern hat geschrieben:Und das Minimieren und Maximieren ist nicht notwendig, wird automatisch gemacht.
Macht man es im TabActivate, dann wird es auch mehrmals ausgeführt.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: TabActivate
das hat mir jetzt keine Ruhe gelassen und in der Hilfe steht dazu dieses Beispiel:Werner_Bayern hat geschrieben:Und das Minimieren und Maximieren ist nicht notwendig, wird automatisch gemacht.
Code: Alles auswählen
// XbpTabPage() Beispiel
// Das Beispiel demonstriert die grundlegenden Schritte für die
// Programmierung mit XbpTabPage-Objekten.
...
// Erste TabPage ist maximiert
oTab1 := XbpTabPage():new( oDlg:drawingArea,, {10,10}, {580,320} )
oTab1:minimized := .F. // *** dieser Befehl läßt den ersten Tab OFFEN anzeigen
oTab1:caption := "Kunde"
oTab1:create()
oTab1:TabActivate := {|| oTab2:minimize(), oTab3:minimize(), oTab1:maximize(), QOut( oTab1:caption ) }
...
// Zweite TabPage ist minimiert
oTab2 := XbpTabPage():new( oDlg:drawingArea,, {10,10}, {580,320} )
oTab2:caption := "Auftrag"
oTab2:preOffset := 20
oTab2:postOffset := 60
oTab2:create()
oTab2:TabActivate := {|| oTab1:minimize(), oTab3:minimize(), oTab2:maximize(), QOut( oTab2:caption ) }
...
genau diese Zeilen regeln bei jedem TAB das Aus- (minimize()) und Einblenden (maximize()). Möglich dass du das irgendwo gekapselt hast, aber ohne die Zeilen macht das XbpTabPage() Control nix
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2121
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 72 Mal
Re: TabActivate
Servus Hubert,
nein, bei mir schon, und das wurde in einem anderen Beitrag auch schon bemerkt, mit der aktuellen Xbase++-Version ist ein minimize und maximize nicht mehr nötig.
Bei mir sieht es so aus (nichts gekapselt) und läuft:
nein, bei mir schon, und das wurde in einem anderen Beitrag auch schon bemerkt, mit der aktuellen Xbase++-Version ist ein minimize und maximize nicht mehr nötig.
Bei mir sieht es so aus (nichts gekapselt) und läuft:
Code: Alles auswählen
oTab3 := XbpTabPage():new(oFenster:drawingArea,, aTabPos, aTabGroesse, {{XBP_PP_FGCLR, TABVORDERGRUND}, {XBP_PP_BGCLR, TABHINTERGRUND}})
oTab3:minimized := .t.
oTab3:caption := "Lohndaten 1"
oTab3:preOffSet := 33.34
oTab3:postOffset := 50.01
oTab3:TabActivate := {|| oTab3:setColorBG(TABAKTIV), oTab2:setColorBG(TABINAKTIV),;
oTab1:setColorBG(TABINAKTIV), oTab4:setColorBG(TABINAKTIV), oTab5:setColorBG(TABINAKTIV), oTab6:setColorBG(TABINAKTIV),;
setAppfocus(aEditControls[ADR_GEHALT])}
oTab3:create()
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2121
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 72 Mal
Re: TabActivate
Das Beispiel hab ich bei mir gefunden, ist schon von 2010:
Läuft ohne die beiden Methoden!
Code: Alles auswählen
#include "Common.CH"
#include "Xbp.CH"
#include "AppEvent.CH"
#include "Gra.ch"
PROCEDURE Main
#define VS .f.
#define VSS .f.
#define TABFG GRA_CLR_BLUE
#define TABHG GRA_CLR_RED
#define TABDISFG GRA_CLR_YELLOW
#define TABDISBG GRA_CLR_BLACK
#define TABSTATIC {380, 160}
#define aPP NIL
#define aPPS {{ XBP_PP_FGCLR , TABFG }, {XBP_PP_BGCLR, TABHG}} //, {XBP_PP_ACTIVE_CLR, TABHG}, {XBP_PP_INACTIVE_CLR, TABFG}, {XBP_PP_ACTIVETEXT_FGCLR, TABDISFG}, {XBP_PP_ACTIVETEXT_BGCLR, TABDISBG}}
LOCAL oForm
LOCAL nEvent, mp1, mp2, oXbp
oForm = XbpDialog():New( )
oForm:TaskList = .T.
oForm:Title = "Test Application"
oForm:Create( ,,, {430,280},, .t. )
// msgbox(if(isThemeActive(.t.), "Visuelle Stile werden unterstützt", "Keine VS!"))
oXbp := Xbppushbutton():New( oForm:DrawingArea )
oXbp:caption := "Button"
oXbp:activate := {||oForm:hide(), msgbox("nix"), oForm:show()}
oXbp:Create( ,, {40,220}, {120,20}, {{ XBP_PP_FGCLR , TABFG }, {XBP_PP_BGCLR, TABHG}} )
oXbp := XbpTabPage():New( oForm:DrawingArea )
oXbp:Caption = "Tab #1"
oXbp:PostOffset = 75
oXbp:useVisualStyle := VS
oXbp:Create( ,, {10,10},{400,200}, aPP )
oXbp := XbpStatic():new(oXbp,, {10, 10}, TABSTATIC, aPPS)
oXbp:type := XBPSTATIC_TYPE_RAISEDBOX
oXbp:useVisualStyle := VSS
oXbp:clipChildren := .f.
oXbp:create()
oXbp := XbpTabPage():New( oForm:DrawingArea )
oXbp:Caption = "Tab #2"
oXbp:PreOffset = 25
oXbp:PostOffset = 50
oXbp:Minimized = .T.
oXbp:useVisualStyle := VS
oXbp:Create( ,, {10,10},{400,200}, aPP )
oXbp := XbpStatic():new(oXbp,, {10, 10}, TABSTATIC, aPPS)
oXbp:type := XBPSTATIC_TYPE_FGNDRECT
oXbp:useVisualStyle := VSS
oXbp:clipChildren := .f.
oXbp:create()
oXbp := XbpSLE():New( oXbp )
oXbp:bufferlength := 30
oXbp:Create( ,, {140,70}, {120,50}, aPPS )
oXbp:setData("Multi-line caption text")
oXbp := XbpTabPage():New( oForm:DrawingArea )
oXbp:Caption = "Tab #3"
oXbp:PreOffset = 50
oXbp:PostOffset = 25
oXbp:Minimized = .T.
oXbp:useVisualStyle := VS
oXbp:Create( ,, {10,10},{400,200}, aPP )
oXbp := XbpStatic():new(oXbp,, {10, 10}, TABSTATIC, aPPS)
oXbp:type := XBPSTATIC_TYPE_BGNDRECT
oXbp:useVisualStyle := VSS
oXbp:clipChildren := .f.
oXbp:create()
CenterControl( oForm )
SetAppFocus( oForm )
nEvent = xbeP_None
DO WHILE nEvent != xbeP_Close
nEvent = AppEvent( @mp1, @mp2, @oXbp )
oXbp:HandleEvent( nEvent, mp1, mp2 )
ENDDO
oForm:Destroy()
RETURN
PROCEDURE AppSys
SET CHARSET TO ANSI
RETURN
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: TabActivate
Hi,
ich bin erst jetzt dazu gekommen es mit älteren zu testen. Dieses Beispiel funktioniert mit 1.90.355 ff, die ältere 1.90.331 schaltet nicht automatisch.
gerade bei vielen Tabs spart man sich da schon Arbeit. War mir nicht aufgefallen
ich bin erst jetzt dazu gekommen es mit älteren zu testen. Dieses Beispiel funktioniert mit 1.90.355 ff, die ältere 1.90.331 schaltet nicht automatisch.
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
PROCEDURE Main
LOCAL nEvent, mp1, mp2, oXbp
LOCAL oTab1, oTab2, oTab3, oDlg, bActivate
SetColor("N/W")
CLS
set charset to ansi
// Dialog mit Desktop als Parent
oDlg:= XbpDialog():new( AppDesktop() )
oDlg:create( ,, {100,100}, {640,400} )
// Erste TabPage ist maximiert
oTab1 := XbpTabPage():new( oDlg:drawingArea,, {10,10}, {580,320} )
oTab1:minimized := .F.
oTab1:caption := "Kunde"
oTab1:create()
* oTab1:TabActivate := {|| oTab2:minimize(), oTab3:minimize(), oTab1:maximize(), QOut( oTab1:caption ) }
oTab1:TabActivate := {|u1,u2,oXbp| QOut( oXbp:caption ) }
oXbp:=XbpStatic():new( oTab1,, {20,50}, {540,220} )
oXbp:type := XBPSTATIC_TYPE_GROUPBOX
oXbp:caption := "Kundendaten erfassen"
oXbp:create()
// Zweite TabPage ist minimiert
oTab2 := XbpTabPage():new( oDlg:drawingArea,, {10,10}, {580,320} )
oTab2:caption := "Auftrag"
oTab2:preOffset := 20
oTab2:postOffset := 60
oTab2:create()
* oTab2:TabActivate := {|| oTab1:minimize(), oTab3:minimize(), oTab2:maximize(), QOut( oTab2:caption ) }
oTab2:TabActivate := {|u1,u2,oXbp| QOut( oXbp:caption ) }
oXbp:=XbpStatic():new( oTab2,, {20,50}, {540,220} )
oXbp:type := XBPSTATIC_TYPE_GROUPBOX
oXbp:caption := "Aufträge erfassen"
oXbp:create()
// Dritte TabPage ist minimiert
oTab3 := XbpTabPage():new( oDlg:drawingArea,, {10,10}, {580,320} )
oTab3:caption := "Rechnung"
oTab3:preOffset := 40
oTab3:postOffset := 40
oTab3:create()
* oTab3:TabActivate := {|| oTab1:minimize(), oTab2:minimize(), oTab3:maximize(), QOut( oTab3:caption ) }
oTab3:TabActivate := {|u1,u2,oXbp| QOut( oXbp:caption ) }
oXbp:=XbpStatic():new( oTab3,, {20,50}, {540,220} )
oXbp:type := XBPSTATIC_TYPE_GROUPBOX
oXbp:caption := "Rechnungen erfassen"
oXbp:create()
// Event loop
nEvent := 0
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
RETURN
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2121
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 72 Mal
Re: TabActivate
Servus Hubert,
331 hab ich nie gehabt
Wie bereits geschrieben, diese Funktionalität wurde in einem anderen Beitrag bereits beschrieben, insofern sind die Beispiele aus der "aktuellen" Hilfe veraltet.
331 hab ich nie gehabt
Wie bereits geschrieben, diese Funktionalität wurde in einem anderen Beitrag bereits beschrieben, insofern sind die Beispiele aus der "aktuellen" Hilfe veraltet.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>