Problem z tabulatorem w okienkach uzywajacych MS Tab (SSTab)



Wyświetlono wersję archiwalną wątku "Problem z tabulatorem w okienkach uzywajacych MS Tab (SSTab)" z forum pl.comp.lang.vbasic





Pszemol - 8 Gru 1998, 03:00

Na pewno wielu z Was stworzyło kiedyś choć jeden
DialogBox (VB: Form) z takimi zakładkami W95 lecz
nie używaliście do tego controlki z Windows95 lecz SSTab.

Otóż mam problem. Wszystko na pierwszy rzut oka
działa ok, lecz problem pojawia się, gdy zapomnimy
na chwilę o istnieniu myszki i zaczniemy używać
wyłącznie klawiatury... Okaże się bowiem, że mimo
poprawnej kolejności controls (kolejność TabIndex)
kursor nie przeskakuje poprawnie podczas naciskania
klawisza 'Tab' na klawiaturze. Po "obejściu" wszystkich
controls, które mają 'TabStop'='True' (np. EditBox,
CheckBox, ListBox...) focus "ucieka" ze wszystkich
widocznych kontrolek :-( Moje przypuszczenie poparte
testami jest takie, że focus ten ucieka na kontrolke
umieszczoną na innej zakładce! Proszę o pomoc
w ustaleniu co robię źle i jak to poprawić aby było
dobrze. Jeśli ktoś sprawdzi, że u niego SSTab działa
intuicyjnie bez żadnych kombinacji to prosze o pomoc
a szczegółowe dane (np. kod nieszczęsnego okienka)
prześlę na e-mail lub grupę (nie wiele bajtów tego źródła)
Pozdrawiam,
Pszemol



Siudek Slawomir - 9 Gru 1998, 03:00


Na pewno wielu z Was stworzyło kiedyś choć jeden
DialogBox (VB: Form) z takimi zakładkami W95 lecz
nie używaliście do tego controlki z Windows95 lecz SSTab.

Otóż mam problem. Wszystko na pierwszy rzut oka
działa ok, lecz problem pojawia się, gdy zapomnimy
na chwilę o istnieniu myszki i zaczniemy używać
wyłącznie klawiatury... Okaże się bowiem, że mimo
poprawnej kolejności controls (kolejność TabIndex)
kursor nie przeskakuje poprawnie podczas naciskania
klawisza 'Tab' na klawiaturze



Kiedyś z tym walczyłem i nic nie wskórałem. Tragedia.
Jako ciekawostkę sprawdź, że - jeżeli stworzysz nową formę, na niej SSTab,
na
SSTab parę paneli z TextBox (położone chaotycznie, np. 4 na pierwszym a
później 4 na drugim panelu), to focus przenosić się będzie prawidłowo!

Siudek


Pszemol - 10 Gru 1998, 03:00


[...]
| Moje przypuszczenie poparte
| testami jest takie, że focus ten ucieka na kontrolke
| umieszczoną na innej zakładce!
[...]

Muszę Cię zmartwić: mam ten sam problem. :))



I jak sobie z tym radzisz? Ustawiasz object.TabStop = False
dla wszystkich innych kontrolek z innych zakładek niż ta
właśnie w danej chwili widoczna? Szlag... a ja mam takie
duże okno i sześć zakładek. A żeby ich pokręciło...

Pszemol


Pszemol - 10 Gru 1998, 03:00


Kiedyś z tym walczyłem i nic nie wskórałem. Tragedia.



Ja to oprogramuję jutro na piechotę, ale myślałem
że coś źle robię a nie chciało mi się pisać takiej protezy...

Jako ciekawostkę sprawdź, że - jeżeli stworzysz nową formę,
na niej SSTab, na SSTab parę paneli z TextBox (położone
chaotycznie, np. 4 na pierwszym a później 4 na drugim panelu),
to focus przenosić się będzie prawidłowo!



Może to tylko jedna, szczególna kontrolka psuje tą kolejność?
Ja mam prawie wszystkie kontrolki na formie więc ciężko
zgadnąć która :-) ale może robiłeś bardziej szczegółowe dochodzenie?

Pszemol



Siudek Slawomir - 10 Gru 1998, 03:00


Może to tylko jedna, szczególna kontrolka psuje tą kolejność?
Ja mam prawie wszystkie kontrolki na formie więc ciężko
zgadnąć która :-) ale może robiłeś bardziej szczegółowe dochodzenie?



Jestem na podobnym etapie co ty - mam formy, a nie ustawialem kolejnosci
focusa. Jeszcze nie wiem, jak do tego podejde.
A zeby chlopkow Gatesa pokrecilo jak smiglo ...
Siudek


Pszemol - 11 Gru 1998, 03:00





| I jak sobie z tym radzisz?

Ano nie radzę sobie. Dla mnie ten problem nie jest aż tak pieklący. :)



Mi też to zwisa i powiewa jak będzie mój program reagował na
ruchy klawiatury zamiast typowej myszki, ale użytkownikom mojego
programu to nie będzie zwisać... Niestety musiałem "przysiąść"
i naprawić tego grzyba (bład kontrolki czy mój?) na piechotę...

W zdarzeniu pochodzącym od przełączenia aktywnej zakładki
umieszczam wołanie funkcji, które mają za zadanie przełączyć
properties object.TabStop na wartość False dla wszystkich
kontrolek w nieaktywnych w danej chwili zakładkach.
Daje mi to pewność, iż TabStop jest ustawione na True,
(a zatem klawisz tab przestawi focus) tyko i wyłącznie na następną
w kolejności kontrolnę z aktywnej zakładki i nie zniknie w pewnym
momencie na kilka naciśnięć Tab aby wrócić niczego sobie

ciągu wszystkie kontrolki muszą mieć poprawną kolejność
indeksów w polu object.TabIndex ale to jest oczywiste we
wszystkich edytorach resourceów, nie tylko w Basicu.

Podsumujmy więc. Każdą kontrolkę z osobna (na całym okienku,
wszystkie zakładki) numeruję od 0 ze skokiem 1 zaczynając od
lewego górnego rogu pierwszej zakładki do prawego dolnego rogu
ostatniej zakładki. Potem przychodzi kolej na klawisze 'OK', 'Cancel'
i 'Apply', które w moim okienku mają malutkie numerki 146, 147, 148 :-)
i na końcu obiekt SSTab ma TabIndex równy 149. Tak ustawione
okienko jest gotowe do zabawy z własnością TabStop kontrolek.
Niestety nie wszystkie kontrolki mają tą własność i nie wszystkie nawet
ją mając potrzebują zmiany (np. option buttons) więc nie mam pomysłu
jak wykorzystać kolekcję Form.Controls. Ponieważ nie mam pomysłu
co do kolekcji a nie za myślenie mi płacą lecz programowanie :-)

dla każdej zakładki przełączającą z True na False i w drugą stronę
(object.TabStop = Not object.TabStop) dla wszystkich potrzebujących
takiej "pielęgnacji" kontrolek. Teraz w zdarzeniu od SSTab (okrojonym
do trzech zakładek) mam coś w stylu:

Private Sub mstEventTabs_Click(PreviousTab As Integer)
       Select Case PreviousTab
          Case 0
             ToggleTabStopForTab0
          Case 1
             ToggleTabStopForTab1
          Case 2
             ToggleTabStopForTab2
        ...
       End Select
       Select Case mstEventTabs.Tab
          Case 0
             ToggleTabStopForTab0
          Case 1
             ToggleTabStopForTab1
          Case 2
             ToggleTabStopForTab2
        ...
       End Select
End Sub

Działa miodzik! :-) Przy używaniu klawiatury fokus przenosi się
kulturalnie, bez wybryków na każdej zakładce począwszy od lewego
górnego rogu do prawego dolnego, potem guziki i fokus idzie na

w lewym górnym rogu zakładki. I tak to powinno się chyba dziać

mieć, lub nie lubi używac myszki w środowisku Windows...
Mój szef jest happy bo jak widział uciekający fokus z ekranu i przy
chodzeniu po drugiej zakładce kursor znikał na trzy naciśnięcia Tab
to rwał włosy z głowy i darł się na mnie, że cóś musiałem spier&^%
bo w innych programach tak paściasto fokus nie przeskakuje...
Zgadzam się z nim w całej rozciągłości ale ja nie jestem happy
z mojej bardzo czasochłonnej metody pisania tych durnych funkcji...
Mam do obsłużenia w ten sposób następnych sześć równie
dużych okieniek, więc jeśli ktoś ma lepszy sposób na ujażmienie
kontrolki z zakładkami SSTab lub zna lepsze zakładki (choć
przesiadka wymagająca przerysowania wszystkich tych okienek
nie bardzo mnie rajcuje na tym etapie) to byłbym baaardzo wdzięczny...

Visual Basic = Rapid Application Development Tool... ha, ha, ha.
Raczej powinno być "Rapid Development Paściastych Aplikacji"!
Niech ich tam sczyści w Microsofcie... :-(
Pszemol


Siudek Slawomir - 11 Gru 1998, 03:00



| | I jak sobie z tym radzisz?

| Ano nie radzę sobie. Dla mnie ten problem nie jest aż tak pieklący. :)



Dobra, jest na dwóch, problem jeden to go rozpierd... .
Sprawdziłem (na szybko co prawda), że - jeżeli na SSTab nie umieścisz
obiektu typu Frame - fokus działa prawidłowo. Frame służy, jak powszechnie
wiadomo, do dwóch rzeczy:
- do wizualnego grupowania elementów
- do grupowania elementów OptionButton
Jeśli tego nie wykorzystujesz na kontrolce - to będzie ok.
Pozdrawiam
Siudek


Pszemol - 11 Gru 1998, 03:00







| | I jak sobie z tym radzisz?

| Ano nie radzę sobie. Dla mnie ten problem nie jest aż tak pieklący. :)

Dobra, jest na dwóch, problem jeden to go rozpierd... .
Sprawdziłem (na szybko co prawda), że - jeżeli na SSTab nie
umieścisz obiektu typu Frame - fokus działa prawidłowo.



Tylko poradź mi proszę jak zastąpić ramki, bo dla mnie to wielka
sztuka zaprojektować intuicyjne okienko bez użycia frames...
Łączę się z wyrazami żalu ze wszystkimi użytkownikami
tej wypociny Microsoftu żartobliwie zwanej RADem :-(
Pszemol
p.s. Czyli sumując w VisualBasicu spier*** jest SSTab czy Frame?


Siudek Slawomir - 14 Gru 1998, 03:00


Tylko poradź mi proszę jak zastąpić ramki, bo dla mnie to wielka
sztuka zaprojektować intuicyjne okienko bez użycia frames...
Łączę się z wyrazami żalu ze wszystkimi użytkownikami
tej wypociny Microsoftu żartobliwie zwanej RADem :-(
Pszemol
p.s. Czyli sumując w VisualBasicu spier*** jest SSTab czy Frame?



Ahoj, grupowicze! Nikt nie ma takiego problemu? Nikt go nie rozwiązał?
A wracając do tematu: Ja to zrobię na pieszo (chyba), ale lepszym sposobem

w SSTab na ramki złożone z linii. Tylko kto ma czas to pisać??? :(
A ogólnie wydaje mi się, że żle działa SSTab - bo nie jest on produkcji
Microsoftu, tylko jest zakupiony od "Sheridan Software System", którzy robią
m.inn. znakomitą kontrolkę od Toolbar-ów i menu identycznych jak w Office
97.


Gustav - 17 Gru 1998, 03:00





Ahoj, grupowicze! Nikt nie ma takiego problemu? Nikt go nie rozwi±za³?



Nie tyle rozwi±za³em, co znalaz³em rozwi±zanie w MSDN'ie

PRB: Tabbing Problem When Sheridan SSTab Control Hosts OCXs
Article ID: Q154885
Creation Date: 16-AUG-1996
Revision Date: 29-AUG-1996
The information in this article applies to:

Standard, Professional, and Enterprise Editions of Microsoft Visual Basic,
16-bit and 32-bit, for Windows, version 4.0

SYMPTOMS

If the SSTab control is used to host OCXs, then the OCX controls remain in
the tab order regardless of whether their host tab is the current tab. When
the user tabs to these controls, it appears that no control has the focus.
This behavior does not occur with intrinsic controls.

WORKAROUND

Disable the TabStop property of all controls hosted by the SSTab control
that do not appear on the current tab. See the More Information Section
below for steps to work around the problem.

MORE INFORMATION

The SSTab control maps hosted controls off the left edge of the form, when
they are not on the current tab, and maps them back onto the form when
necessary. You can use this behavior to help determine whether a control is
able to obtain the focus. If the control's Left property is negative, then
the control should not be able to get the focus.

Steps to Reproduce and Work Around Problem

Start a project in Visual Basic. Form1 is created by default.
Add a SSTab control to Form1. If the SSTab control does not appear in the
toolbox, perform the following:

    - From the Tools menu, choose Custom Controls and check the "Sheridan
      Tabbed Dialog Control" component. If the component is not listed,
      click the browse button and locate TABCTL16.OCX or TABCTL32.OCX.

Add a MaskEdBox control to Tab1 of SSTab1. If the MaskEdBox control does not
appear in the toolbox, perform the following:

    - From the Tools menu, choose Custom Controls and check the "Microsoft
      Masked Edit control" component. If the component is not listed, click
      the browse button and locate MSMASK16.OCX or MSMASK32.OCX.

Choose Start from the Run menu, or press the F5 key to start.
Press the TAB key to tab onto the hidden MaskedEdBox control and note that
the focus rectangle disappears. Now, enter some characters and click on
Tab1. You will see that the MaskEdBox control contains the characters you
typed.

To work around the problem, follow these steps:
Choose End from the Run menu, or click the Stop button on the toolbar to
stop the program.
Add the following code to the General Declarations section of Form1:
Private Sub Form_Load()

     SSTab1_Click 0

End Sub
Private Sub SSTab1_Click(PreviousTab As Integer)

     Dim c As Control
     For Each c In Controls
       If TypeOf c.Container Is SSTab Then
         'Not all controls have the TabStop property
         On Error Resume Next
         c.TabStop = c.Left 0
         On Error GoTo 0
       End If
     Next

End Sub
Choose Start from the Run menu, or press the F5 key to start.

All the controls that are not displayed in the SSTab controls current tab
will now have their TabStop property set to FALSE, making them unable to
receive the focus using the Tab key.
Note that the above workaround assumes that the controls are children of the
SSTab control and not the children of container controls contained by the
SSTab (such as PictureBoxes).

STATUS

This behavior is by design.

REFERENCES

For more information, please see the following article in the Microsoft
Knowledge Base:

   ARTICLE-ID: Q150417
   TITLE     : PRB: Read-Only SSTab Does Not Display Child Controls
               Properly

Pozdrowienia
Gustav


Pszemol - 18 Gru 1998, 03:00


Disable the TabStop property of all controls
hosted by the SSTab control that do not appear
on the current tab



Widzę, że nie jest ze mną najgorzej, bo sam to wymyśliłem... ;-)

    Dim c As Control
    For Each c In Controls
      If TypeOf c.Container Is SSTab Then
        'Not all controls have the TabStop property
        On Error Resume Next
        c.TabStop = c.Left 0
        On Error GoTo 0
      End If
    Next



Ale ta pętelka zrobiła na mnie duże wrażenie...
Jestem burok, że sam tego nie wymyśliłem...
Dzięki za pomoc, Gustav. Jednak spóźniłeś się dwa dni :-(
Widać, że jak ktoś nie ma w głowie to ma w nogach, Pszemolu...

Ale mamy już rozwiązanie na przyszłość... Dzięki.

Pszemol

Problem z załączaniem załączników z www
Próbowałem konta na a4.pl, home. pl, megapolis.pl zawsze ten sam problem.. ...
Problemy z poczta poczta.onet.pl
Kurier Poczty - problem ze sciaganiem poczty
Ryczałt od przychodów ewidencjonowanych rozliczany przez jednego z małżonków. Problem?
Problem z outlook express index.dbx przekroczyl 2gb
Rebeka Becky RimArts
  • fototapety kwiat
  • obrona kreona
  • lodz polonia 150
  • smieszne animowane filmiki
  • wszystko o sony ericssonie w200i
  • 13posterunek flmiki
  • garaz blaszak sprzedaz
  • dojarka;przewodowa
  • v zlot buldogow francuskich
  • Zestaw tematów z for internetowych • Index