Вычисление высоты StringGrid при добавлении строки

Учитывая, что я хочу, чтобы в моей сетке строк были строки одинаковой высоты...

Я знаю, что он будет начинаться ровно с 5 строк, и я делаю это во время разработки.

Во время выполнения я могу захотеть добавить несколько дополнительных строк (и у меня есть код, который нельзя добавлять ниже нижней части родителя; в этот момент я полагаюсь на полосы прокрутки).

Кажется, что sg.height := sg.height + sg.RowHeights[0]; не дает ожидаемого результата - после последней строки есть неожиданный пробел (я все еще пытаюсь рассчитать, как дополнительная высота соответствует количеству строк, но похоже, что это высота одной строки, независимо от того, сколько строк находятся в сетке).

Есть ли что-то еще, что я должен принять во внимание? (возможно, GridLineWidth?) Или я мог неправильно установить свойство в инспекторе объектов? Должен ли я использовать GridHeight, а не Height?

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

Может ли кто-нибудь сказать мне формулу для расчета новой высоты сетки после добавления ряда строк? Или где я что-то не так делаю.


[Обновление] Фактор выдумки 3, по-видимому, соответствует свойству margin


person Mawg says reinstate Monica    schedule 30.10.2012    source источник
comment
Действительно? Вы говорите о свойстве Margins, которое представляет собой массив целых чисел? Это помогает определить, где будет размещена сетка при использовании свойства Align. По умолчанию установлено значение 3. Чтобы определить высоту сетки, если вам нужно включить свойство Margins, вам нужно будет включить как верх, так и низ, и это сделает число 6. Я начинаю больше доверять своему выводу о том, что высота сетки определяется суммой высот строк плюс верхняя и нижняя границы плюс (безымянный) отступ в 1 пиксель. Высота строк включает толщину линий сетки.   -  person jrodenhi    schedule 28.11.2012


Ответы (2)


Я добавлю свои пробы и ошибки к вашему исследованию, если оно будет иметь какую-либо ценность.
TMS AdvStringGrid. Вот изображение TMS AdvStringGrid. Я думаю, что он во многом основан на обычной сетке строк с множеством полезных расширений. Чтобы упростить подсчет строк, я увеличил изображение с помощью SnagIt и сделал видимыми линии сетки пикселей. Я добавил несколько красных линий в верхний ряд сетки. В этой сетке для DefaultRowHeight установлено значение 21. Между красными линиями есть 5 пикселей, поэтому, чтобы получить 21 пиксель для DefaultRowHeight, вам нужно будет включить линию сетки stringgrid, высота которой равна 1 пикселю. Когда я загружаю эту сетку, я использую этот код:

with gridLimits do
    begin
      RowCount := 3;
      Cells[0, 0] := 'Maximum Amount';
      Cells[0, 1] := 'Maximum Base';
      Cells[0, 2] := 'Maximum Period';
      IntegralHeight := False;
      MyHeight := 0;
      for i := 0 to RowCount - 1 do
        inc(MyHeight, RowHeights[i]);
      Height := MyHeight + 5;
    end;
end;

Я захватил сетку с помощью SnagIt и позволил ей захватить объект на экране. Он включал серую линию в 1 пиксель вокруг сетки. На самом деле сетка явно начинается с синей линии, поэтому, чтобы получить высоту, я думаю, мне нужно будет добавить DefaultRowHeight, умноженный на три, плюс верхнюю синюю линию плюс нижнюю синюю линию, но если я сделаю это и нажму на кнопку нижний ряд, сетка прокручивается вверх. Он также прокручивается вверх, если я добавляю 3 к высоте. Если я добавлю 4 к высоте, он не прокручивается. Я не знаю, почему я установил его на 5, и сейчас я установлю его на 4, потому что вы можете видеть, что внизу на 1 пиксель слишком много.

Возможно, нужно добавить верхнюю и нижнюю серые линии, чтобы получить общую высоту сетки, и именно поэтому DefaultRowHeight умножается на 3 плюс верхняя и нижняя линии плюс еще две для серых линий, включенных SnagIt.

person jrodenhi    schedule 30.10.2012

На всякий случай, если кому-то, кроме меня, интересно, вот что я сделал, чтобы заставить его работать.

При добавлении строки:

newHeight := stringGrid.Height + 
             stringGrid.RowHeights[Pred(stringGrid.Row)] + 
             stringGrid.GridLineWidth;  

if newHeight < maxheight then
   stringGrid.Height := newHeight;

stringGrid.RowCount := stringGrid.RowCount + 1;

В качестве альтернативы я могу оставить его до тех пор, пока не добавлю все строки, а затем

stringGrid.Height := ((stringGrid.RowHeights[1] + stringGrid.GridLineWidth) *              
                      (stringGrid.VisibleRowCount + stringGrid.FixedRows)) + 3;
person Mawg says reinstate Monica    schedule 30.10.2012
comment
Вы знаете, зачем нужны дополнительные 3 пикселя? Это одна и та же константа независимо от разрешения экрана? Можно ли найти эти 3 пикселя на изображении String Grid? Я спрашиваю об этом только потому, что сам столкнулся с той же проблемой, и, хотя я также использовал постоянную настройку, я не знаю, насколько хорошо она работает при других разрешениях. - person jrodenhi; 30.10.2012
comment
Я экспериментировал, пока это не выглядело хорошо, но 4 и 5 тоже выглядели хорошо ... извините, больше ничем помочь не могу - person Mawg says reinstate Monica; 03.11.2012
comment
Я не могу поверить, что никто не повысил это, когда это идеальное решение, +1 за полезное для меня - person Kieran Wilson; 09.11.2012
comment
+1 Спасибо, @KieranWilson Кстати, см. обновление вопроса, чтобы объяснить загадочную цифру 3. - person Mawg says reinstate Monica; 20.11.2012