Убегают столбики в StringGrid.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

VirtUX писал(а):Как, уже однажды, посоветовали мне, хочи предложить и Вам использовать KControls. Там очень хорошо сделан Grid (например: есть возможность объединять ячейки) - не глючит. А стандартный Grid - имеет ряд ошибок, запостенных в багтрекере. Можете добавить еще одну здесь ;)

KGrid это DBGrid ???
Ищу замену RxDBGrid от alexs. Нужен DBGrid с многострочными заголовками и подвалом, т.е. фиксированной нижней строкой.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

KGrid - это сторонний компонент, в LCL не входит, живёт здесь.
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Nik писал(а):KGrid - это сторонний компонент, в LCL не входит, живёт здесь.

Ага. Спс. Поставил уже.
У kgrid него многострочные заголовки вообще есть? Не получается найти/включить...
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Судя по демке - есть (см. kgriddemolaz, вкладка megre cells).
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

dunin писал(а):У kgrid него многострочные заголовки вообще есть?

100% есть! В одной из прог использовал эту фичу. Но уже не помню как управлять.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Написал в freepascal bugtracker.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Словил, как реализовать баг :) Если откомпилировать в "Классической теме", а запускать в теме "Windows XP", то баг имеет место.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Предлагают использовать свойство AutoFillColumns. Но разве для этого оно предназначено?

Добавлено спустя 11 часов 31 минуту 5 секунд:
Если кто-то желает подключиться к решению проблемы, присоединяйтесь: http://bugs.freepascal.org/view.php?id=17610
А то я не совсем хорошо понимаю, что предлагают разработчики.

Добавлено спустя 3 минуты 43 секунды:
Modifying grid's width may be OK for an application but is not something the grid should do, what if the grid is resized automatically? like when it's anchored or aligned.

Что этим хотят сказать?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Как умею ^_^ переводить писал(а):Возможно подгонять ширину таблицы, но это не всегда возможно, что если таблица изменяет размер автоматом? Когда она привязана или выровнена.

Как вариант - пользоваться ColWidth и рассчитывать ширину самостоятельно в событии OnResize (я обычно обрабатываю OnResize формы), оставив запас под скролл?
//хотя я бы все-равно предложил переделать на VirtualStringTreeView ^_^
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Я так и предлагал, но проблема в том, как просчитать ширину скролла? Либо просто делать запас ширины между последней колонкой и скроллом, но это не красиво.

О VirtualStringTreeView где можно почитать?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Код: Выделить всё

...
Uses
  ..., LCLIntf;
...

А дальше примерно так

//upd
А ещё там есть

Код: Выделить всё

function GetScrollBarSize(Handle: HWND; SBStyle: Integer): integer; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}
function GetScrollbarVisible(Handle: HWND; SBStyle: Integer): boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

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

Добавлено спустя 16 минут 23 секунды:
Я делаю так:

Код: Выделить всё

 ScrollBarWidth:=GetScrollBarSize(Handle, 2);
  StringGrid1.Width:=StringGrid1.Columns[0].Width+
  StringGrid1.Columns[1].Width+
  StringGrid1.Columns[2].Width+
  StringGrid1.Columns[3].Width+
  StringGrid1.Columns[4].Width+StringGrid1.ColCount+
  ScrollBarWidth;     
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Я вообще не совсем понимаю, при каких условиях можно менять ширину грида ^_^ Обычно Width для меня - данность, из-за упомянутых девелоперами "anchored or aligned" ^_^ И я считал бы ширину столбца:

Код: Выделить всё

Procedure ResizeCols(Const aGrid: TStringGrid;
  Const aMainCol: Integer; Const aMinWidth: Integer = 0);
Var
  i, aOtherCols: Integer;
Begin
  aOtherCols := 5;
  For i := 0 To aGrid.ColCount - 1 Do
    If Not(i = aMainCol) Then
      Inc(aOtherCols, aGrid.ColWidths[i] + 1);
  If GetScrollbarVisible(aGrid.Handle, 1) Then
    Inc(aOtherCols, GetScrollBarSize(aGrid.Handle, 1));
  aGrid.ColWidths[aMainCol] := Max(aMinWidth, aGrid.Width - aOtherCols);
End;

Но TVirtualStringTreeView делает это за меня ^_^ Читать о нём здесь, а брать - отсюда
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

GAMER писал(а):GetScrollBarSize - вариант хороший для меня. Но не для тех, кто использует авторасчет ширины грида в зависимости от других параметров.

Я расчитываю ширину "подгоночного" столбца вручную (подгоняю не последний столбец, а столбец с самыми "длинными" данными - так экономнее). Если использовать в формуле расчёта GetScrollBarSize - вполне неплохо получится, наверное.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Я согласен с авторами, для которых ширина грида более приоритетная, чем ширина столбца (-ов). Я привел пример, в котором ширина грида не критична. Хотя, менять ширину столбца, наверное, более верно.

Добавлено спустя 1 час 27 минут 10 секунд:
Подскажите, что за второй параметр в

Код: Выделить всё

function GetScrollBarSize(Handle: HWND; SBStyle: Integer): integer; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}

Подозреваю, что тип скроллбара.
Ответить