Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вопрос про DW / 17 сообщений из 17, страница 1 из 1
17.01.2006, 17:32
    #33487948
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Привет всем! Просьба помочь в решении маленькой проблемки.
Есть PowerBuilder 9. В нем есть ДВ. В котором размещаются отчеты с переменным числом столбцов. Хотелось бы включать свойство HSplitScroll только при необходимости. То есть только в том случае, когда построенный отчет не помещается в ширину (есть прокрутка). Как бы вычислить или определить такую вещь?

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

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

Заранее спасибо за помощь.
Вадим Романенко.
...
Рейтинг: 0 / 0
17.01.2006, 18:13
    #33488066
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Я думаю должно помочь некоторое шаманство с
Код: plaintext
DataWindow.HorizontalScrollMaximum
и
Код: plaintext
DataWindow.VerticalScrollMaximum
...
Рейтинг: 0 / 0
17.01.2006, 18:41
    #33488132
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Vadim Romanenko
Значение dw.width возвращает ширину не в тех же юнитах, что и dw_sf.Describe('#'+String(li_currCol)+'.width') :( Или я где-то неправильно приготовил??


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

Спасибо, извините за беспокойство!!
...
Рейтинг: 0 / 0
17.01.2006, 18:45
    #33488139
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
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
...
Рейтинг: 0 / 0
17.01.2006, 18:54
    #33488153
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Я сделал по-простому:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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 

Может кому и пригодится...
...
Рейтинг: 0 / 0
17.01.2006, 20:20
    #33488235
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Это, а не проще ли
Код: plaintext
DataWindow.HorizontalScrollMaximum
на неравенство нулю проверить?
...
Рейтинг: 0 / 0
18.01.2006, 15:37
    #33489716
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Локшин МаркЭто, а не проще ли
Код: plaintext
DataWindow.HorizontalScrollMaximum
на неравенство нулю проверить?

Да, действительно dw_sf.Object.DataWindow.HorizontalScrollMaximum выдает ту цифру, которая мне нужна... Но не всегда. Например, при изменении размеров окна с меньшего на больший (повесился на ф-цию of_resize()) свойство .HorizontalScrollMaximum выдает еще старое значение ширины скроллбара... Или вообще какое-то левое... Чего-то даже не пойму!!
...
Рейтинг: 0 / 0
18.01.2006, 16:21
    #33489833
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Vadim RomanenkoДа, действительно dw_sf.Object.DataWindow.HorizontalScrollMaximum выдает ту цифру, которая мне нужна... Но не всегда. Например, при изменении размеров окна с меньшего на больший (повесился на ф-цию of_resize()) свойство .HorizontalScrollMaximum выдает еще старое значение ширины скроллбара... Или вообще какое-то левое... Чего-то даже не пойму!!
А если из of_resize() запостить событие на котором проверять HorizontalScrollMaximum, нормально будет?
...
Рейтинг: 0 / 0
18.01.2006, 18:41
    #33490211
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Vadim RomanenkoИ еще. Почему-то перебор всех колонок таблицы (выборка свойства через Describe) занимает поразительно много времени... 50 колонок - чуть ли не несколько секунд...
Делай один Describe типа Describe('#1.width #2.width #3.width') и разбирай результат. будет намного быстрее.
...
Рейтинг: 0 / 0
19.01.2006, 09:55
    #33490870
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
ЗоринАндрейДелай один Describe типа Describe('#1.width #2.width #3.width') и разбирай результат. будет намного быстрее.
Ну проблема то явно не из-за этого, 50 раз такой describe даже на слабой машине - это явно меньше 1 секунды будет.
...
Рейтинг: 0 / 0
19.01.2006, 11:56
    #33491305
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Локшин МаркНу проблема то явно не из-за этого, 50 раз такой describe даже на слабой машине - это явно меньше 1 секунды будет.
Да, тут Вы правы! Действительно, там был мой глюк в плане скорости... Я так подозреваю, что достаточно долго работает describe в случае, если обращаюсь к атрибутам несуществующих объектов, что у меня и творилось. Со скоростью вобщем-то проблемы решены.
...
Рейтинг: 0 / 0
19.01.2006, 12:51
    #33491528
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Локшин Марк
А если из of_resize() запостить событие на котором проверять HorizontalScrollMaximum, нормально будет?

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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

Так вот! Ресайзю туда-сюда, а в логе - только одна запись :( Что не так???
...
Рейтинг: 0 / 0
19.01.2006, 13:46
    #33491745
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Vadim Romanenko
Код: plaintext
1.
	li_FileNum = FileOpen("c:\asu\sfquery.log", LineMode!, Write!);
Так вот! Ресайзю туда-сюда, а в логе - только одна запись :( Что не так???

Код: plaintext
1.
 li_FileNum = FileOpen("c:\asu\sfquery.log", LineMode!, Write!, Shared!, Append!);
...
Рейтинг: 0 / 0
19.01.2006, 14:03
    #33491814
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Anatoly Moskovsky
Код: plaintext
1.
 li_FileNum = FileOpen("c:\asu\sfquery.log", LineMode!, Write!, Shared!, Append!);


Так аппенд ведь по умолчанию??
...
Рейтинг: 0 / 0
19.01.2006, 14:05
    #33491825
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
Но, как ни странно - помогло... Действительно, там содержится нужное значение!! Вроде как :)
...
Рейтинг: 0 / 0
19.01.2006, 14:33
    #33491947
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
А как бы еще определить физический номер i-той ВИДИМОЙ колонки?? По которому к ней можно обратиться ф-цией describe? (для определения ее координат - х и ширины, т.о. можно получить положение сплита)
...
Рейтинг: 0 / 0
19.01.2006, 14:48
    #33492008
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про DW
ПС: перед определением HorizontalScrollMaximum необходимо ОТКЛЮЧАТЬ сплит!!! иначе HorizontalScrollMaximum при наличии сплита всегда возвращает ненулевое значение :)
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вопрос про DW / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]