![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уважаемые мастера. Вопрос о DBGrid. [D6]
Anatoliy © (2002-12-25 16:00:00)Нужно сделать одну из колонок авторазмерной.
Я делал что то вроде: на OnResize формы вешал процедурку
procedure ResizeAutoGrid(AGrid:TDBGrid;AAutoCol:Integer);
VAR I:Integer;
FW,FWC:Integer;
begin
if Assigned(AGrid) then
with AGrid do
begin
FW:=ClientWidth;
FWC:=0;
for I:=0 to Columns.Count-1 do
if I<>AAutoCol then FWC:=FWC+Columns[I].Width;
Columns[AAutoCol].Width:=FW-FWC-8;
end;
end;
Работат сносно, до тех пор, пока в gride больше больше одной строки - есть scrollbar. Скроллбар исчезает - нужно пересчитать размер.
Как поймать момент появления скроллбара в гриде. Или может по другому решить задачу?
Lady D (2002-12-26 13:04:00) [1]uses Windows;
ShowScrollBar(DBGrid1.Handle, SB_VERT, true);
Anatoliy (2002-12-25 18:03:00) [2]Решение проблемы я нашел в другом :)
Хотя так нечестно, изначально в задаче дожно быть 2 грида - один сверху, другой под ним. Размеры колонок одинаковы, и я просто копирую размеры из верхнего грида (у него всегда есть скроллбар). Но думаю тему можно продолжить.
Lady D (2002-12-25 17:47:00) [3]
> Хотя я убрал "штучку по которой бегает курсор".
А вот об этом ClientWidth ничего не знает :-)
Anatoliy (2002-12-25 17:44:00) [4]
> ClientWidth как раз таки подразумевает, что ScrollBar и
> Border уже есть, а Ваша 8-ка - это та штучка, по которой
> бегает курсор.
И точно. Хотя я убрал "штучку по которой бегает курсор".
Anatoliy (2002-12-25 17:35:00) [5]
>
> > Стоит ли так долго думать об этом. Пусть ширина гепотетического
>
> > ScrollBar будет учтена сразу.
>
> Хотя в таком варианте тоже неплохо!
Нет. Не годится. Только меняешь размер формы - плывет. В ClientWidth уже заложена ширина скроллбара!
Anatoliy (2002-12-25 17:31:00) [6]
> Стоит ли так долго думать об этом. Пусть ширина гепотетического
> ScrollBar будет учтена сразу.
Хотя в таком варианте тоже неплохо!
Lady D (2002-12-25 17:27:00) [7]
> 8-ку я подобрал эмпирически. Попробовал подставить вместо
> нее GetSystemMetrics(SM_CXVSCROLL). Оказывается в ClientWidth
> учитывается ширина скроллбара! Но откуда эта восьмерка сам
> не пойму!
ClientWidth как раз таки подразумевает, что ScrollBar и Border уже есть, а Ваша 8-ка - это та штучка, по которой бегает курсор.
Anatoliy (2002-12-25 17:13:00) [8]
> Columns[AAutoCol].Width:=FW-FWC-8;
8-ку я подобрал эмпирически. Попробовал подставить вместо нее GetSystemMetrics(SM_CXVSCROLL). Оказывается в ClientWidth учитывается ширина скроллбара! Но откуда эта восьмерка сам не пойму!
> Стоит ли так долго думать об этом. Пусть ширина гепотетического
> ScrollBar будет учтена сразу.
Тогда получится пустое место справа грдида при наличии скроллбара. Это не эстетично.
Lady D (2002-12-25 17:04:00) [9]
> Тоже верно. Но все-же как узнать есть ли полоса или нет.
> Может API-шной функцией?
Стоит ли так долго думать об этом. Пусть ширина гепотетического ScrollBar будет учтена сразу.
Anatoliy (2002-12-25 16:53:00) [10]
> Для правильного Resize потребуется знать и ширину Scrollbar.
Тоже верно. Но все-же как узнать есть ли полоса или нет. Может API-шной функцией?
Lady D (2002-12-25 16:50:00) [11]
> Мне нужно узнать не ширину а наличие вертикального скроллбара
> в гриде.
Для правильного Resize потребуется знать и ширину Scrollbar.
Anatoliy (2002-12-25 16:42:00) [12]
> Ehlib
> Или посмотри как у них реализовано это.
TDBGrid наследник TCustomGrid, а него свойство ScrollBars - protected!
Anatoliy (2002-12-25 16:33:00) [13]
> GetSystemMetrics(SM_CXVSCROLL) - ширина ScrollBar
Мне нужно узнать не ширину а наличие вертикального скроллбара в гриде.
vopros (2002-12-25 16:06:00) [14]Ehlib
Или посмотри как у них реализовано это.
Lady D (2002-12-25 16:04:00) [15]GetSystemMetrics(SM_CXVSCROLL) - ширина ScrollBar