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

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

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

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


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

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

Код: 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
Вопрос про DW
    #33488235
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это, а не проще ли
Код: plaintext
DataWindow.HorizontalScrollMaximum
на неравенство нулю проверить?
...
Рейтинг: 0 / 0
Вопрос про DW
    #33489716
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркЭто, а не проще ли
Код: plaintext
DataWindow.HorizontalScrollMaximum
на неравенство нулю проверить?

Да, действительно dw_sf.Object.DataWindow.HorizontalScrollMaximum выдает ту цифру, которая мне нужна... Но не всегда. Например, при изменении размеров окна с меньшего на больший (повесился на ф-цию of_resize()) свойство .HorizontalScrollMaximum выдает еще старое значение ширины скроллбара... Или вообще какое-то левое... Чего-то даже не пойму!!
...
Рейтинг: 0 / 0
Вопрос про DW
    #33489833
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoДа, действительно dw_sf.Object.DataWindow.HorizontalScrollMaximum выдает ту цифру, которая мне нужна... Но не всегда. Например, при изменении размеров окна с меньшего на больший (повесился на ф-цию of_resize()) свойство .HorizontalScrollMaximum выдает еще старое значение ширины скроллбара... Или вообще какое-то левое... Чего-то даже не пойму!!
А если из of_resize() запостить событие на котором проверять HorizontalScrollMaximum, нормально будет?
...
Рейтинг: 0 / 0
Вопрос про DW
    #33490211
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoИ еще. Почему-то перебор всех колонок таблицы (выборка свойства через Describe) занимает поразительно много времени... 50 колонок - чуть ли не несколько секунд...
Делай один Describe типа Describe('#1.width #2.width #3.width') и разбирай результат. будет намного быстрее.
...
Рейтинг: 0 / 0
Вопрос про DW
    #33490870
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗоринАндрейДелай один Describe типа Describe('#1.width #2.width #3.width') и разбирай результат. будет намного быстрее.
Ну проблема то явно не из-за этого, 50 раз такой describe даже на слабой машине - это явно меньше 1 секунды будет.
...
Рейтинг: 0 / 0
Вопрос про DW
    #33491305
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркНу проблема то явно не из-за этого, 50 раз такой describe даже на слабой машине - это явно меньше 1 секунды будет.
Да, тут Вы правы! Действительно, там был мой глюк в плане скорости... Я так подозреваю, что достаточно долго работает describe в случае, если обращаюсь к атрибутам несуществующих объектов, что у меня и творилось. Со скоростью вобщем-то проблемы решены.
...
Рейтинг: 0 / 0
Вопрос про DW
    #33491528
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк
А если из 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
Вопрос про DW
    #33491745
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопрос про DW
    #33491814
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Код: plaintext
1.
 li_FileNum = FileOpen("c:\asu\sfquery.log", LineMode!, Write!, Shared!, Append!);


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


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