2009-04-22 9 views
0

Как вы вычисляете высоту таблицы flexgrid в VB6 так, чтобы она содержала только количество заполненных строк.Как правильно рассчитать высоту таблицы

В настоящее время

myFlexGrid.Height = (myFlexGrid.CellHeight * myFlexGrid.Rows) ' paraphrased from code 

выходит около 3 пикселей коротких в каждой строке. Добавление в магическое число немного хакерское и хотелось бы сделать это, не прибегая к этому.

Обновление: Чтобы усложнить дело, ему также необходимо обрабатывать многострочные ячейки.

ответ

1

Вы должны пойти

Me.MSFlexGrid1.Height = (Me.MSFlexGrid1.CellHeight) * (Me.MSFlexGrid1.Rows + Me.MSFlexGrid1.FixedRows) + 30

30, чтобы сделать это два пикселя длиннее, чтобы показать черную границу, бегущую вокруг flexgrid.

Также отключает вертикальную полосу прокрутки.

+0

На самом деле 30 неверно из того, что я могу найти: если пользователь работает в режиме 120dpi, то 12 твипов равны 1 пикселю. Но это добавление полуорбитального числа - это то, чего я пытаюсь избежать. –

+0

Я также нашел, что ему нужно обрабатывать многострочные ячейки. –

+0

Если элемент управления явно не поддерживает функцию автоматического сохранения или не отображает значения высоты каждого элемента пользовательского интерфейса, вы не сможете избежать использования магических чисел. Это потому, что элементы управления разработаны как черные ящики. Похоже, ваша логика будет сложной здесь. Я предлагаю обернуть flexgrid внутри класса управления и добавить функцию автоматического управления там, чтобы код в ваших основных процедурах оставался чистым. –

2

RS Coneley близко, но вот правильный путь, который учитывает все настройки DPI:

Me.MSFlexGrid1.Height = Me.MSFlexGrid1.CellHeight _ 
         * (Me.MSFlexGrid1.Rows + Me.MSFlexGrid1.FixedRows) _ 
         + (Screen.TwipsPerPixelY * 2) 
0

Это последний код, который я придумал

For i = 0 To fgrComments.Rows - 1 
     'Set MSFlexGrid to appropriate Cell 
     myFlexGrid.Row = i 

     'Set textbox to match the selected cell 
     txtSizer.Width = myFlexGrid.ColWidth(2) 
     txtSizer.Font = myFlexGrid.Font 
     txtSizer.Text = myFlexGrid.Text 

     'Call API to determine how many lines of text are in text box 
     lLinesOfText = SendMessage(txtSizer.hwnd, EM_GETLINECOUNT, 0&, 0&) 

     ' Update the running values 
     lTotalNumberOfRows = lTotalNumberOfRows + lLinesOfText 
     lCurrentHeight = lCurrentHeight + myFlexGrid.CellHeight 
    Next i 

    ' resize the grid 
    Dim iSpacers As Integer 
    iSpacers = Screen.TwipsPerPixelY * lTotalNumberOfRows 
    myFlexGrid.Height = lCurrentHeight + iSpacers 

Вы должны будете Объявить SendMessage (see here to see how) и значение EM_GETLINECOUNT, но вы должны быть в состоянии сделать это самостоятельно :-)

Он не удаляет магические числа, но он рационализирует м, что достаточно близко для меня.

Смежные вопросы