TabActivate

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

Servus,

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!>
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:wird bei Euch der Codeblock auch 2x aufgerufen, wenn der Tab aktiviert wird?
"nur" TAB oder bei Crtl-TAB (PDR 6132)?
gruss by OHR
Jimmy
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: TabActivate

Beitrag von Herbert »

Nein, nur einmal
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

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.

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!>
Benutzeravatar
Martin Altmann
Foren-Administrator
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

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

Servus Martin,

oh, also ein TabActivate ist ein setInputFocus? :o
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

Eher ein setFocus(), da der Input nur auf den dortigen SLE erfolgen kann ;-)
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
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

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

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.
und siehe da, nur 1 Meldung in der Log-Datei. Danke!

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!>
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

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 ;-)
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

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.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

Werner_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.
OK, ist schon lange her dass ich TABs programmiert habe ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

Werner_Bayern hat geschrieben:Und das Minimieren und Maximieren ist nicht notwendig, wird automatisch gemacht.
das hat mir jetzt keine Ruhe gelassen und in der Hilfe steht dazu dieses Beispiel:

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 ) } 
...
: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
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

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:

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!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

Das Beispiel hab ich bei mir gefunden, ist schon von 2010:

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
Läuft ohne die beiden Methoden!
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

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.

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
gerade bei vielen Tabs spart man sich da schon Arbeit. War mir nicht aufgefallen ;-)
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

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.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten