Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Привет всем! Просьба помочь в решении маленькой проблемки.
Есть PowerBuilder 9. В нем есть ДВ. В котором размещаются отчеты с переменным числом столбцов. Хотелось бы включать свойство HSplitScroll только при необходимости. То есть только в том случае, когда построенный отчет не помещается в ширину (есть прокрутка). Как бы вычислить или определить такую вещь?

Я пошел таким путем - найти, сколько места занимают колонки, сравнить со свободным пространством ДВ, и если надо - включать прокрутку. То есть сколько занимают столбцы я уже нашел (суммируем dw_sf.Describe('#'+String(li_currCol)+'.width') для всех колонок). Но как бы определить свободное пространство для данных - никак не пойму.
Значение dw.width возвращает ширину не в тех же юнитах, что и dw_sf.Describe('#'+String(li_currCol)+'.width') :( Или я где-то неправильно приготовил??

И еще. Почему-то перебор всех колонок таблицы (выборка свойства через Describe) занимает поразительно много времени... 50 колонок - чуть ли не несколько секунд... Так что может есть какой-то другой способ определения-нужна ли прокрутка в данном ДВ при просмотре на экране??

Заранее спасибо за помощь.
Вадим Романенко.
17 янв 06, 17:32    [2263070]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Я думаю должно помочь некоторое шаманство с
DataWindow.HorizontalScrollMaximum
и
DataWindow.VerticalScrollMaximum
17 янв 06, 18:13    [2263278]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Vadim Romanenko

Значение dw.width возвращает ширину не в тех же юнитах, что и dw_sf.Describe('#'+String(li_currCol)+'.width') :( Или я где-то неправильно приготовил??


Оказалось, что я где-то неправильно приготовил :) Закрался глюк в индексы цикла... Вобщем, копи-пасте привело к плачевным результатам :) Все заработало.

Спасибо, извините за беспокойство!!
17 янв 06, 18:41    [2263380]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Dmitry.
Member

Откуда: Boston, MA
Сообщений: 849
dw.width это pbunits
describe("#1.width") юниты указанные в свойствах DW.

т.е. чтобы это сравнивать надо приводить к единым юнитам.

dw.width = ширина рабочей области + ширина бордера + ширина вертикального скролинга.

чтобы взять ширину рабочей области - надо пользовать виндовую ф-ю
BOOL GetClientRect(
HWND hWnd, // handle of window
LPRECT lpRect // address of structure for client coordinates
);
из user32.dll
17 янв 06, 18:45    [2263392]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Я сделал по-простому:

integer li_needSplit, li_splitCnt, i, li_currCol, li_fullCnt, li_colCount
long ll_splitWidth
string ls_desc, ls_colCount

//Нужен ли вообще сплит, выбираем из ини-файла
li_needSplit = Integer(profileString(cgIniFile, "Sform " + string(idws.il_formid), "Split", '1'))
if li_needSplit = 0 then
	dw_sf.HSplitScroll = false
	return 1
end if
//Сколько колонок закрепляем, выбираем из ини-файла
li_splitCnt = Integer(profileString(cgIniFile, "Sform " + string(idws.il_formid), "SplitColumnCount", '1'))

ls_colCount = dw_sf.Describe('DataWindow.Column.Count')
if (ls_colCount = '!') or (not isNumber(ls_colCount)) or isNull(ls_colCount) then
	dw_sf.HSplitScroll = false
	return 1
end if
li_colCount = Integer(ls_colCount)
li_currCol = 1
i = 0
li_fullCnt = 0						//Ширина, занимаемая колонками DW
ll_splitWidth = 0					//Ширина, которую планируется зафиксировать
//Проверяем: если ВПРИНЦИПЕ не нужно прокрутки (отсутствует ScrollBar), то просто отменяем split
do while li_currCol < li_colCount
	ls_desc = dw_sf.Describe('#'+String(li_currCol)+'.width')
	if isNumber(ls_desc) then
		if i < li_splitCnt then
			ll_splitWidth += Long(ls_desc) + 9
		end if
		li_fullCnt += Long(ls_desc) + 9
		i = i + 1
	end if
	li_currCol = li_currCol + 1
	if i > 2000 then
		//На всякий случай выход из цикла
		i = li_colCount
	end if
Loop

if li_fullCnt < dw_sf.width - 20 then
	//Значит, полезная площадь отчета меньше области, выделенной для ее размещения, и ГОРИЗОНТАЛЬНАЯ
	//прокрутка НЕ НУЖНА!!! Ну и отменяем ее.
	dw_sf.HSplitScroll = false
	return 1
end if

//закрепление колонок при прокрутке
if li_needSplit = 1 then
	dw_sf.HSplitScroll = true
	dw_sf.Modify('DataWindow.HorizontalScrollSplit = '+String(ll_splitWidth))
end if

return 1

Может кому и пригодится...
17 янв 06, 18:54    [2263415]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Это, а не проще ли
DataWindow.HorizontalScrollMaximum
на неравенство нулю проверить?
17 янв 06, 20:20    [2263573]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Локшин Марк
Это, а не проще ли
DataWindow.HorizontalScrollMaximum
на неравенство нулю проверить?


Да, действительно dw_sf.Object.DataWindow.HorizontalScrollMaximum выдает ту цифру, которая мне нужна... Но не всегда. Например, при изменении размеров окна с меньшего на больший (повесился на ф-цию of_resize()) свойство .HorizontalScrollMaximum выдает еще старое значение ширины скроллбара... Или вообще какое-то левое... Чего-то даже не пойму!!
18 янв 06, 15:37    [2266219]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Vadim Romanenko
Да, действительно dw_sf.Object.DataWindow.HorizontalScrollMaximum выдает ту цифру, которая мне нужна... Но не всегда. Например, при изменении размеров окна с меньшего на больший (повесился на ф-цию of_resize()) свойство .HorizontalScrollMaximum выдает еще старое значение ширины скроллбара... Или вообще какое-то левое... Чего-то даже не пойму!!

А если из of_resize() запостить событие на котором проверять HorizontalScrollMaximum, нормально будет?
18 янв 06, 16:21    [2266442]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
ЗоринАндрей
Member

Откуда: Санкт-Петербург
Сообщений: 3004
Vadim Romanenko
И еще. Почему-то перебор всех колонок таблицы (выборка свойства через Describe) занимает поразительно много времени... 50 колонок - чуть ли не несколько секунд...

Делай один Describe типа Describe('#1.width #2.width #3.width') и разбирай результат. будет намного быстрее.
18 янв 06, 18:41    [2267082]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
ЗоринАндрей
Делай один Describe типа Describe('#1.width #2.width #3.width') и разбирай результат. будет намного быстрее.

Ну проблема то явно не из-за этого, 50 раз такой describe даже на слабой машине - это явно меньше 1 секунды будет.
19 янв 06, 09:55    [2268150]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Локшин Марк
Ну проблема то явно не из-за этого, 50 раз такой describe даже на слабой машине - это явно меньше 1 секунды будет.

Да, тут Вы правы! Действительно, там был мой глюк в плане скорости... Я так подозреваю, что достаточно долго работает describe в случае, если обращаюсь к атрибутам несуществующих объектов, что у меня и творилось. Со скоростью вобщем-то проблемы решены.
19 янв 06, 11:56    [2268875]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Локшин Марк

А если из of_resize() запостить событие на котором проверять HorizontalScrollMaximum, нормально будет?


Чего-то не получается :( Делаю так: из of_resize вызывается:
PostEvent("ue_applySplit")

содержимое event'а:

string ls_scroll
int li_scroll

ls_scroll = dw_sf.Describe("DataWindow.HorizontalScrollMaximum")

// Запись журнала
integer li_FileNum
String ls_Msg
	li_FileNum = FileOpen("c:\asu\sfquery.log", LineMode!, Write!);
	FileWrite(li_FileNum, "")
	FileWrite(li_FileNum, "Date   : " + String (Today()) + " " + String(Now()) + "~r~n")
	FileWrite(li_FileNum, ls_scroll)
	FileClose(li_FileNum)

if not isNumber(ls_scroll) then return

Так вот! Ресайзю туда-сюда, а в логе - только одна запись :( Что не так???
19 янв 06, 12:51    [2269212]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Vadim Romanenko

	li_FileNum = FileOpen("c:\asu\sfquery.log", LineMode!, Write!);
Так вот! Ресайзю туда-сюда, а в логе - только одна запись :( Что не так???


 li_FileNum = FileOpen("c:\asu\sfquery.log", LineMode!, Write!, Shared!, Append!);
19 янв 06, 13:46    [2269481]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Anatoly Moskovsky
 li_FileNum = FileOpen("c:\asu\sfquery.log", LineMode!, Write!, Shared!, Append!);


Так аппенд ведь по умолчанию??
19 янв 06, 14:03    [2269561]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
Но, как ни странно - помогло... Действительно, там содержится нужное значение!! Вроде как :)
19 янв 06, 14:05    [2269573]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
А как бы еще определить физический номер i-той ВИДИМОЙ колонки?? По которому к ней можно обратиться ф-цией describe? (для определения ее координат - х и ширины, т.о. можно получить положение сплита)
19 янв 06, 14:33    [2269724]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про DW  [new]
Vadim Romanenko
Member

Откуда: Харьков, Украина
Сообщений: 1462
ПС: перед определением HorizontalScrollMaximum необходимо ОТКЛЮЧАТЬ сплит!!! иначе HorizontalScrollMaximum при наличии сплита всегда возвращает ненулевое значение :)
19 янв 06, 14:48    [2269801]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить