Seite 1 von 1

Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 9:29
von klammerauf
Wie kann ich denn feststellen, wie viele Tabs in einer TabPage enthalten sind?

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 9:35
von Jan
Moin Sebastian,

Du könntest die Children des Dialoges zählen, die ein XbpTabPage sind. Um das sauber hinzubekommen müsstest Du eventuell den :cargo der Tabpages mit einem Wert belegen, den Du beim Auslesen der :childList() abfragen kannst.

Ich mach das sonst in der ChildList gerne über :isDerivedFrom() um z. B. alle Statics o. ä. festzustellen, aber das könnte bei den Tabpages schwierig werden.

Jan

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 10:01
von Tom
Jan, in der Childlist eines Objekts (z.B. eines Fensters, eines Statics oder irgendeines anderen Containers, der XbpTabPages enthält) sind direkt immer nur die Tabpages, die sich auf ihm befinden. Sollten sich auf einer dieser Tabpage weitere befinden, sind die in der Childlist dieses Objekts. Ich verstehe Deine Anmerkung mit dem cargo nicht ganz.

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 10:09
von Jan
Hallo Tom,

jetzt verstehe ich Deine Anmerkung nicht so ganz. Ja klar kann z. B. ein Dialog mehrere Tabpages beinhalten, und manche dieser Tabpages haben ebenfalls eigene Tabpages. Sowas mache ich ja auch. Ich hatte jetzt aber die Eingangsfrage so verstanden das es um die Anzahl der Tabpages eines bestimmten Objektes ging. Und das wären für mich nur die direkten Tabpages, nicht die in einem Unterobjekt.

Das mit dem :cargo meinte ich weil es eventuell schwierig sein könnte festzustellen, ob ein Objekt in der :childlist jetzt wirklich eine Tabpage ist, oder doch etwas anderes. Wenn aber der :cargo der Tabpages gesetzt wird auf "Ich bin eine Tabpage", dann kann man die :childlist abarbeiten nach Objekten, die genau das im :cargo stehen haben. Und die dann jeweils hoch zählen.

Oder habe ich jetzt Dich mißverstanden? Soll ja schon mal vorkommen :roll: ...

Jan

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 10:13
von Tom
Ich habe die Frage so verstanden, dass danach gefragt wird, wie viele Tabpages in einer Tabpage enthalten sind. Ein bestimmte XbpTabPage-Objekt ist also der Parent, nach dem gefragt wird, und dann muss ich in dessen ChildList() nur zählen, wie viele XbpTabPages darauf sind.

Wenn ich einen komplexen Dialog habe und die diversen ChildLists traversiere, um sämtliche Tabpages zu ermitteln, dann brauche ich tatsächlich zusätzliche Informationen, um herauszubekommen, wer zu wem gehört. Aber das Eltern-Kind-Verhältnis sollte trotzdem immer eindeutig sein.

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 10:26
von Jan
Hallo Tom,

theoretisch hast Du natürlich Recht. Aber was ist wenn jemand mein, er müsste auf den Parent (egal ob das ein Dialog, ein Static, eine übergeordnete Tabpage, was auch immer ist) nicht nur Tabpages platzieren, sondern auch noch irgend welche anderen Elemente? Info-Texte, Laufbalken, Grafiken, was auch immer. Daher meine Überlegung auszulesen, ob das Objekt in der :childlist wirklich eine Tabpage ist, oder doch etwas anderes.

Jan

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 10:33
von Tom
Hallo, Jan.

Aber die Frage war, wie viele Tabpages sich auf einer Tabpage (direkt, nehme ich dann an) befinden. Da zählt man einfach in oMyTabPage:ChildList() die Objekte, die selbst XbpTabPage (oder davon abgeleitet) sind.

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 11:20
von Jan
Hallo Tom,

blöde Frage: Und wie identifiziere ich in einer :childlist die Tabpages?

Jan

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 11:39
von Dominik Krebs
Ich verwende die Klasse tbxTabControl() von Friedhelm.
Über eine Instanzvariable können wir das abfragen.
Ist tatsächlich auch gar nicht so kompliziert eine solche Klasse zu basteln.

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 11:45
von Tom
Und wie identifiziere ich in einer :childlist die Tabpages?

Code: Alles auswählen

FUNCTION CountPagesOnMyself(oMyTab)
LOCAL nCtr, nNumberOfTabpages := 0, aChildList := oMyTab:ChildList(), nLen := Len(aChildList)
FOR nCtr := 1 TO nLen
  IF aChildList[nCtr]:isDerivedFrom('XbpTabPage')
     nNumberOfTabPages ++
  ENDIF
NEXT
RETURN nNumberOfTabPages 

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 12:35
von Jan
Hallo Tom,

OK, wenn das geht ist das natürlich OK. Mir war jetzt nicht bewußt das die XbpTabPage da mit im isDerived() drin stehen kann. In dem Fall ist der :cargo natürlich tatsächlich vollkommen überflüssig.

Jan

Re: Anzahl Tabs in XbpTabPage

Verfasst: Fr, 16. Feb 2024 13:00
von Tom
Mir war jetzt nicht bewußt das die XbpTabPage da mit im isDerived() drin stehen kann.
Mit der isDerivedFrom()-Methode kann jede Klasse abgefragt werden, die ein Objekt beerbt hat. Warum sollte XbpTabPage da eine Ausnahme sein?

Re: Anzahl Tabs in XbpTabPage

Verfasst: Mo, 19. Feb 2024 7:49
von klammerauf
Danke für alle Antworten, meine Frage war tatsächlich etwas missverständlich formuliert.

Ich wollte auf jeden Fall wissen, wie viele Tabpage-Objekte sich auf einem Parent befinden. Und wie ich gezielt bei einem davon die :caption ändern kann. Aus der Online-Doku bin ich auch nicht schlau geworden.

Der Trick von Tom mit :isderivedfrom() ist vermutlich die Lösung, Danke.

Re: Anzahl Tabs in XbpTabPage

Verfasst: Mo, 19. Feb 2024 10:44
von Tom
Der "Trick" von Tom sagt Dir nur, wie viele Tabpages es auf einem bestimmten Parent gibt.

Der einfachste Weg, um die Caption einer bestimmten Tabpage zu ändern, besteht in der Verwendung der Methode ":SetCaption()". Um das gezielt zu machen, ist es sinnvoll, alle Tabpages in unterschiedlichen Variablen (oTab1, oTab2) oder in einem Array ("aTabs[1 ... x]") unterzubringen, dann kannst Du mit oTab1:Caption die Caption abfragen und mit oTab:SetCaption("So heißt das jetzt") neu setzen (danach: oTab1:InvalidateRect(), damit die Lasche neu gezeichnet wird). Du kannst natürlich auch die ChildList() des Parents durchwandern und schauen, ob ein bestimmtes Tabpage-Objekt die Caption hat, die Du erwartest, und änderst das dann:

Code: Alles auswählen

FUNCTION ChangeCaption(oMyTab,cCaption,cNewCaption)
LOCAL nCtr, aChildList := oMyTab:ChildList(), nLen := Len(aChildList)
FOR nCtr := 1 TO nLen
  IF aChildList[nCtr]:isDerivedFrom('XbpTabPage')
    IF aChildList[nCtr]:Caption == cCaption
      aChildList[nCtr]:SetCaption(cNewCaption)
      EXIT
     ENDIF
  ENDIF
NEXT
RETURN NIL
Aber das ist unnötig kompliziert. Wenn Du weißt, dass "oTab1" (statt "oXbp", wo in den Beispielen alle XbParts gespeichert werden) die Tabpage ist, deren Caption Du ändern willst, dann mach das einfach direkt. oTab1:SetCaption("Aber hallo"), oTab:InvalidateRect(), feddisch.

Re: Anzahl Tabs in XbpTabPage

Verfasst: Mo, 19. Feb 2024 12:22
von flanelli
Tom hat geschrieben: Mo, 19. Feb 2024 10:44 Aber das ist unnötig kompliziert. Wenn Du weißt, dass "oTab1" (statt "oXbp", wo in den Beispielen alle XbParts gespeichert werden) die Tabpage ist, deren Caption Du ändern willst, dann mach das einfach direkt. oTab1:SetCaption("Aber hallo"), oTab:InvalidateRect(), feddisch.
Nach meinem bescheidenen Wissenstand gibt es zumindest in den Versionen < 2.0 keine Methode setcaption für ein xbptabpage
aber ich lasse mich gerne eines besseren belehren :-)

Re: Anzahl Tabs in XbpTabPage

Verfasst: Mo, 19. Feb 2024 12:30
von Tom
Ich habe XbpTabpage:SetCaption() zur Verfügung und kann die Methode verwenden. Aber ich kann auch der iVar "Caption" einfach einen Wert zuweisen, das geht ebenso. InvalidateRect() danach, und die Caption ist gesetzt.

Edit: Hat es bis zur 1.9 tatsächlich nicht gegeben. Nutzt die noch jemand? :o

Re: Anzahl Tabs in XbpTabPage

Verfasst: Mo, 19. Feb 2024 12:49
von Jan
Tom,

Wenn ich aus welchem Grund auch immer kein :SetCaption() machen kann, und nur ein :caption geht, mach ich immer ein :configure() im Anschluß, um das im Objekt wegzuspeichern. Daß das auch mit InvaliudateRect() war mir bislang unbekannt. Wobei ich damit auch nicht wirklich aktiv arbeite.

Jan

Re: Anzahl Tabs in XbpTabPage

Verfasst: Mo, 19. Feb 2024 12:56
von Tom
Jan, so war es auch dokumentiert. Und es gibt einen PDR von Anno Tobak (zur 1.2), der noch offen ist, und der das Fehlen von SetCaption bemängelt: https://www.alaska-software.com/scripts ... PDRID=2626

Grundsätzlich, da, wo es geht: Wenn ich eine Caption mit SetCaption() ändere, ist in aller Regel das Repaint implizit, z.B. bei einem Static oder einem Button. Bei einer Tabpage muss man eigenartigerweise nachhelfen, etwa mit InvalidateRect(). Setze ich die iVar Caption direkt, muss ich bei Statics, Buttons das Configure() ausführen. Bei XbpTabpages reicht auch da ein InvalidateRect().

Weil bei mir Tabpages sowieso in stark aufgepumpten Klassen sitzen, muss ich nichts davon tun. ;)

Re: Anzahl Tabs in XbpTabPage

Verfasst: Mo, 19. Feb 2024 14:19
von flanelli
Tom hat geschrieben: Mo, 19. Feb 2024 12:30 Ich habe XbpTabpage:SetCaption() zur Verfügung und kann die Methode verwenden. Aber ich kann auch der iVar "Caption" einfach einen Wert zuweisen, das geht ebenso. InvalidateRect() danach, und die Caption ist gesetzt.

Edit: Hat es bis zur 1.9 tatsächlich nicht gegeben. Nutzt die noch jemand? :o
@Tom
:caption:="xxx" mit anschließenden :configure() hat auch in der 1.9 funktioniert, nur ein :setcaption("xxx") gab es nicht.

btw. ich bin überzeugt, dass noch etliche Applikationen unter 1.9 am Laufen sind, aus welchen Gründen auch immer.
Wir selbst haben zwei kleine Apps ( mit geringer Komplexität ) auch nie umgestellt weil es einfach bis dato nicht die geringste
Notwendigkeit dafür ergeben hat.

Aber ansonsten hast Du natürlich in allen Punkten völlig recht =D>