private void qScrollBar_ScrollSkip(bool Up)
        {
            int fvi = Math.Max(1, FirstVisibleItem);

            if (Up)
            {
                fvi--;
            }

            if ((Up || Values.Count > fvi) && (!Up || fvi > 0))
            {
                char c  = Lib.FirstCharNoTheUpper(Values[fvi]);
                char c2 = c;
                Func <string, char> getChar = GetFilterChar();

                if (c != ' ')
                {
                    if (Up)
                    {
                        do
                        {
                            fvi--;
                            c = c2;
                        }while (fvi > 1 && c == (c2 = getChar(Values[fvi - 1])));

                        FirstVisibleItem = Math.Min(fvi, FirstVisibleItem - 1);
                    }
                    else
                    {
                        char min = 'A';
                        int  max = Values.Count - NumVisibleItems + 1;
                        do
                        {
                            fvi++;
                            c = c2;
                        }while (fvi < max && ((c == (c2 = getChar(Values[fvi + 1]))) || (c2 < min)));

                        FirstVisibleItem = Math.Max(fvi + 1, FirstVisibleItem - 1);
                    }
                }
                if (FirstVisibleItem > 0)
                {
                    controller.ShowLetter(getChar(Values[FirstVisibleItem]));
                }
            }
        }