Tab in einem SSTab Objekt fokussieren

DrMueller

Erfahrenes Mitglied
Hallo Leute,
ich habe immer noch dieses kleienre Problem beim Resize und mir ist nach einiger Forschung aufgefallen, dass ich falsche Werte für die Tabs bekomme, wenn diese nicht im Fokus sind.
Darum kurze Frage: Gibt es eine Möglichkeit per Code die einzelnen Tabs zu fokussieren? Mir ist irgendwie keine Funktion aufgefallen, die so was könnte.
 
Du kannst glaube ich über den Index gehen

Es gibt da eine Eigenschaft .SelectedIndex

bei ssTabs kann man auch über die Key eigenschaft gehen

Grüsse bb
 
Wenn ich Dich richtig verstehe, willst Du nacheinander auf die verschiedenen Tab's umschalten?

Das ginge mit:

Code:
SSTab1.Tab = 2       'schaltet auf den 2. Tab
 
Irgendwie hattet Ihr recht, habe jetzt ein Testprojekt erstellt um das Problem ein wenig genauer zu betrachten. Ich lade das Projekt mal hoch, wenn ich herausgefunden habe wie.
Um einen kurzen Beschrieb zu geben: Ich möcht bei einem Resize, dass alle 3 Tabs geresizt und sauber dargestellt werden. Der auskommentierte Teil war eine Idee, jedes Tab einzeln zu fokussieren und dann zu resizen. Hat aber auch net geklappt.

Anzumerken ist, dass die Resize Funktion net von mir ist, sondern nur verwendet wird.
 

Anhänge

  • testFrameIndex.zip
    4 KB · Aufrufe: 25
Das Problem ist Folgendes:

Wenn Du das Programm startest, ist Tab(1) aktiv, und damit Frame1(0) visible. Die Frame1(1) und (2), die sich auf den anderen Tab's befinden, sind unsichtbar. Unsichtbare Controls sind jedoch keineswegs wirklich unsichtbar, sie erhalten nur eine negative "Left"-Eigenschaft, so dass sie irgendwo weit links von Deinem Bildschirm sind!

Und das SSTab schaltet keineswegs irgendetwas wirklich um, es ändert eigentlich nur die Bildschirmdarstellung. Controls auf nicht aktiven Tabs werden einfach unsichtbar gemacht!

Du kannst das reproduzieren, wenn Du z.B. im Form_Load einfach mal folgenden Code einbaust:

Code:
   Dim k As Integer
   For k = 0 To 2
      Debug.Print "Frame " + Str(k), Frame1(k).Left, Frame1(k).Top
   Next

Dies ergibt dann etwa folgendes Resultat:
Frame 0 170 979
Frame 1 -170043 979
Frame 2 -170043 979

Frame(0) hat eigentlich die gleiche Position wie die anderen Frames, nur Frame(0) ist sichtbar, die anderen nicht!

Aus diesem Grund schlägt Deine Klasse fehl, da sie sich irgendwie die Positionen der Controls merkt, und umrechnet. Und wenn nun beim Resize die negativen Positionen neu berechnet werden, bleiben sie immer noch negativ, und teilweise in Bereichen, wo sie überhaupt nicht mehr hin gehören.

Du musst also die Logik Deiner Klasse komplett neu durchdenken. Lass Dir die Frame-Positionen mal nach dem Resize anzeigen...

Viele Grüsse
ronaldh
 
Tatsächlich habe ich das mit den negativen und riesen Werten auch bemerkt, aber ich habe eben gehofft, dass ein Umstellen das beheben könnte. Nun scheint das nicht zu klappen, wie Du ja berichtest. Werde mir wohl für diese Spezialfälle etwas anderes ausdenken müssen.

Falls wer grad so ein Problem schon hatte und gleich eine Lösung in der Hinterhand hat, würde ich natüröich nicht nein sagen. :)
 
Das Problem ist doch relativ dumm:
Bei meinem Beispiel ists kein Problem, ich muss nur die Frames anpassen und die sind erst noch alle gleich gross.
Das Problem ist, ich muss das Resizen allgemein gültig halten, damit das jeder theoretisch benutzen kann.
Es ist also möglich, dass gar kein Frame auf dem Tab ist und sich die Werte der einzelnen Controls auf den Tabs extremst unterscheiden.

Was ich wissen müsste: GIbt es irgend eine Möglichkeit, die einzelnen Tabs so zu focussen, dass die Controls darauf automatisch visible sind und somit den korrekten Wert zugeordnet bekommen?
 
So hallo Leute noch mal,
ich habe einen Teil des Problems ganz billig gemacht:
Da bei Visible False die .Left Position einfach .left -75000 gemacht wird, addiere ich diese wieder dazu = Funktioniert.
Die andere Frage ist folgende:
Wenn ich die das zweite oder dritte Tab fokussiere und dann resize, erscheinen immer die Controls des Ersten, und das, welches ich angewählt habe, wird unsichtbar.

Kann man irgendwie überprüfen welches Tab angewählt wurde oder hat mir wer grad noch ne bessere Lösung für das problem?
 
Zuletzt bearbeitet:
ich habe einen Teil des Problems ganz billig gemacht:
Da bei Visible False die .Left Position einfach .left -75000 gemacht wird, addiere ich diese wieder dazu = Funktioniert.
Die andere Frage ist folgende:
Wenn ich die das zweite oder dritte Tab fokussiere und dann resize, erscheinen immer die Controls des Ersten, und das, welches ich angewählt habe, wird unsichtbar.

Kann man irgendwie überprüfen welches Tab angewählt wurde oder hat mir wer grad noch ne bessere Lösung für das problem?

Ja, das hast Du dann wohl zu "billig" gemacht. Du merkst Dir im Form_Load die Ursprungspositionen, und da sind die Controls des ersten Tabs nicht negativ, die der anderen Tabs sind negativ. Deshalb klappt das nicht so ohne weiteres.

Die Logik hierfür ist sicherlich sehr komplex, weil Du Dir für alle Controls (ob negativ oder nicht) merken müsstest, ob sie sich auf dem SSTab befinden oder nicht. Mit "billig" wird das nicht klappen! Mit SSTab klappt beispielsweise auch das entsprechende Beispiel von ActiveVB nicht.

Es gibt für dieses Problem beispielsweise (kostenpflichtig!) das Control SizerOne von ComponentOne. Falls Du das ganze professionell nutzt, dann solltest Du auf der Anschaffung eines derartigen Controls rumdenken. Bei dem zu diesem Control gehörenden OCX "ElasticLight" ziehst Du das einfach auf die Form, und brauchst Dir um Anpassungen der Controls keinen Kopf mehr machen.
 
Zurück