Frage zu XbpTabPage

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Frage zu XbpTabPage

Beitrag von Jan »

Moin,

ich kämpfe gerade mit der Frage wie ich feststelle, das eine Tabpage verlassen worden ist. :killInputFocus geht nicht, denn der wirkt schon wenn ich den Fokus auf ein GUI-Element auf der Tabpage setze :minimized geht auch nicht, der reagiert unerwartet und nicht so wie benötigt.

Worum es im Detail geht: Wenn ich eine Tabpage anspringe, dann wird darin ein Thread gestartet. Den möchte ich natürlich wieder los werden wenn der Tab nicht mehr aktiv ist. Ansonsten schaukelt sich die Threadzahl langsam immer höher bei jedem Anspringen dieses Tabs. Ich brauch also irgendwas in der Richtung oTab:wurdeverlassen := {|| oThread:quit()}.

Oder lässt sich das auch anders lösen? Vermutlich dreh ich mich da gerade etwas im Kreis.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Frage zu XbpTabPage

Beitrag von Marcus Herz »

Moin

Du kannst doch den Thread als Instanz der TabPage einbauen, wenn schon ein Objekt, dann ist er schon gestartet. Oder?
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Frage zu XbpTabPage

Beitrag von brandelh »

Hallo Jan,

das solltest du da einbauen wo du die Tab-Page Anzeige steuerst (welches TAB ist aktiv, Rest minimized).
Hier ein Beispiel aus einer meiner Anwendungen: SchalteTabPage(oTab)

Code: Alles auswählen

METHOD __dlgBearbeiten:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   ::HB_Dialog:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   ::sleZeigZeitraum:create()
   ::sleZeigUNR:create()
   ::sleZeigFolgeNr:create()
   ::sleZeigVersName:create()
   ::sleZeigBerechName:create()

   ::ftZeigUnr:create()
   ::ftZeigFolgeNr:create()
   ::ftZeigVersName:create()
   ::ftZeigBerechName:create()
   ::ftZeigZeitraum:create()

   ::tpSuchen:create()
   ::tpStammdaten:create()
   ::tpRente:create()
   ::tpEinkommen:create()
   ::tpAdressen:create()
   ::tpAbrechnung:create()
   ::tpDrucken:create()

   aadd(::aTabPages, ::tpSuchen)
   aadd(::aTabPages, ::tpStammdaten)
   aadd(::aTabPages, ::tpRente)
   aadd(::aTabPages, ::tpEinkommen)
   aadd(::aTabPages, ::tpAdressen)
   aadd(::aTabPages, ::tpAbrechnung)
   aadd(::aTabPages, ::tpDrucken)

   aEval(::aTabPages,{ |oTab| oTab:TabActivate := {|u1,u2,oTab| ::SchalteTabPage(oTab) } })

   ::SchalteTabPage(::tpSuchen)


RETURN self
*----------------------------------------------------------------------------------------------------------------------------
METHOD __dlgBearbeiten:SchalteTabPage(oTab)
   local x
   for x := 1 to len(::aTabPages)
       if ::aTabPages[x] # oTab      // aktuellen Tab aussparen um flackern zu verhindern
          ::aTabPages[x]:minimize()
       endif
   next
   oTab:maximize()
   do case
      case oTab == ::tpSuchen
           SetAppFocus(::tpSuchen:lbBearbeitungsgrund)
      case oTab == ::tpStammdaten
           SetAppFocus(::tpStammdaten:sleVersName)
      case oTab == ::tpRente
           SetAppFocus(::tpRente:lbRentenArtAuswahl)
      case oTab == ::tpEinkommen
           SetAppFocus(::tpEinkommen:chbKeinEinkommen)
      case oTab == ::tpAdressen
           if empty(::tpAdressen:aAdressen)
              SetAppFocus(::tpAdressen:pbNeu)
           else
              SetAppFocus(::tpAdressen:lbAdressListe)
           endif
      case oTab == ::tpAbrechnung
           SetAppFocus(::tpAbrechnung:pbSave)
      case oTab == ::tpDrucken
           SetAppFocus(::tpDrucken:sleDruckDatum)
   end
return self
die aktive Tab Page bleibt ja weiter aktiv, auch wenn die Anwendung den Fokus verliert.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Frage zu XbpTabPage

Beitrag von Jan »

Moin Marcus und Hubert,

leider geht Ihr beide anscheinend davon aus das ich da irgendwo eigene Klassen ableiten würde. Mach ich nicht. Ich bin immer noch ein in Funktionen gefangen, nutze nur Klassen wo die schon vorgegeben sind.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Frage zu XbpTabPage

Beitrag von georg »

Hallo, Jan -


Du bist doch mit dem KillInputFocus nicht schlecht aufgestellt. Du musst lediglich den :setParent()-Baum "raufgehen" und sehen, ob Deine XbpTabPage als Parent auftaucht. Wenn ja, alles in Butter, wenn nein: Thread abschiessen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Frage zu XbpTabPage

Beitrag von brandelh »

Hallo Jan,

leider gehst du davon aus, dass wir mehr Methoden kennen, als Xbase++ in der Dokumentation aufgeführt hat, das ist nicht so ...
Warum für dich
:minimized geht auch nicht, der reagiert unerwartet und nicht so wie benötigt.
nicht funktioniert weiß ich nicht, aber in einer TAB gibt es eine Regel, es kann innerhalb eines TAB nur eine TabPage aktiv sein und das steuert zwar der Anwender,
intern wird aber der Codeblock in oTab:TabActivate aufgerufen, in diesem codeblock kannst du was unterbringen.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Frage zu XbpTabPage

Beitrag von Jan »

Hubert,

naja, manchmal gibt es ja doch mehr als in der Doku steht. Oder man in der Doku findet. Ich fand die alte Doku bis zur 1.9 extrem hilfreich, weil man dort per Buttonklick wirklich alles sehen konnte, was man mit dieser Klasse machen konnte. Alle Methoden, iVars, etc.

Was ich nicht finde ist etwas, das die Workbench mir zeigt. Dort kann ich eine Liste aller Threads öffnen, inkl. der Funktion in der die erstellt worden waren. Ich finde aber keine Funktion, mit der ich solch eine Liste erstellen könnte. Ansonsten könnte ich ja spätestens beim Erstellen eines neuen Threads feststellen, ob in dieser Funktion schon einer läuft. Und entsprechend reagieren. Klar könnte ich die Threads PUBLIC machen. Aber das widerstrebt mir ein wenig.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Frage zu XbpTabPage

Beitrag von brandelh »

Wenn du die Thread Objekte nicht im Fenster speichern kannst (weil du ja keinen Classcode nutzt) könntest du das Objekt in einer Funktion (static) hinterlegen.
So wie man das aktuelle Fenster in SetAppWindow() speichert, da du ja mehrere aktuelle haben könntest, müsstest du 2 Parameter an die Funktion übergeben, 1. Fenster oder Tabpage zudem der Thread gehört und 2. das Thread Objekt.
So könntest du bei Übergabe von einem Parameter den Zugriff auf das gewünschte Threadobjekt erhalten.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Frage zu XbpTabPage

Beitrag von Tom »

KillInputFocus feuert tatsächlich auch, wenn ein anderes Control auf der Tabpage den Fokus bekommt. Wenn der fragliche Dialog aber nur aus Tabpages besteht, kannst Du umgekehrt agieren, also an das SetInputFocus jeder Tabpage binden, dass ja alle anderen Tabpages jetzt den Fokus nicht mehr haben können, also quasi verlassen sein müssen. Und auch wenn auf dieser Tabpage jetzt etwas anderes den Fokus bekommt, ändert sich an der Situation nichts, denn dieser Slot feuert wirklich erst wieder, wenn eine andere Tabpage angeklickt wird. Sollte der Dialog nicht nur aus Tabpages bestehen, musst Du die Controls außerhalb der Tabpages auch entsprechend ausstatten. Das ginge über eine einzige allgemeingültige Funktion, die bei SetInputFocus aufgerufen wird (der dritte Parameter im Slot ist das Objekt, das ihn auslöst).
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Frage zu XbpTabPage

Beitrag von Tom »

Die Funktion, die aus SetInputFocus aufgerufen wird, sollte sich natürlich auch merken, welche TabPage zuletzt den Fokus bekommen hat, damit die nächste, bei der das passiert, den dazugehörigen Thread beenden kann. Dafür wiederum würde ich ein Signal-Objekt verwenden.
Herzlich,
Tom
Antworten