powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Подбор ширины колонки перед печатью
25 сообщений из 28, страница 1 из 2
Подбор ширины колонки перед печатью
    #36295947
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Есть данные в колонке DataWindow(DW).
Необходимо узнать, сколько по ширине будет занимать печатаемый текст, чтобы выделить для его колонки в DW соответствующую ширину.

Может кто поможет "добрым кодом"?

Заранее спасибо!
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36295984
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bagzoid ,
можно начать от сюда .
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36296273
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, есть такая функция:
private function boolean GetTextExtentPoint32 (long hDC, string lpString, long cbString, ref SIZE lpSize) ALIAS FOR "GetTextExtentPoint32A" LIBRARY "GDI32.DLL"

Вот бы примерчик, как получить hDC принтера (первый параметр функции).
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36296545
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бьюсь над изменением рабочего кода с определения ширины статик текста на определение ширины текста для принтера. SelectObject возвращает ошибку (0).

Код: 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.
Integer li_Size, li_Len, li_Return, li_WM_GETFONT =  49  	//  hex 0x0031
ULong lul_Hdc, lul_Handle, lul_hFont
os_size lstr_Size
os_printer_defaults pr_def
ulong printer_hdc
string sdev

li_Len = Len(as_Text)

// Get the handle of the Object and create a Device Context
lul_Handle = Handle(a_obj)
lul_Hdc = GetDC(lul_Handle) 

// Получение hdc принтера (тут все нормально, hdc получен)
sdev = 'PDFCreator'
printer_hdc = Get_Printer_Handle(sdev)
// Get_Printer_Handle - возвращает phPrinter внешней функции Function boolean OpenPrinter(string pPrinterName, ref ulong phPrinter ,long p) Library "winspool.drv" alias for "OpenPrinterA;Ansi"

// Get the font in use on the Static Text
lul_hFont = Send(lul_Handle, li_WM_GETFONT,  0 ,  0 )

// Select it into the device context
//SelectObject(lul_Hdc, lul_hFont)
SelectObject(printer_hdc, lul_hFont) // Для hdc принтера эта функция возвращает  0 , выше вариант для статика, все в порядке
//SelectObject -это внешняя Function ulong SelectObject(ulong hdc, ulong hWnd) Library "GDI32.DLL"

// Get the size of the text.
//If Not GetTextExtentpoint32A(lul_Hdc, as_Text, li_Len, lstr_Size ) Then Return - 1 
// Определение ширины текста с использованием hdc принтера
If Not GetTextExtentpoint32A(printer_hdc, as_Text, li_Len, lstr_Size ) Then Return - 1 

//ReleaseDC(lul_Handle, lul_Hdc)
DeleteDC(printer_hdc)

Return PixelstoUnits(lstr_Size.l_cx, XPixelsToUnits!)
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36296657
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagzoidЗдравствуйте!

Есть данные в колонке DataWindow(DW).
Необходимо узнать, сколько по ширине будет занимать печатаемый текст, чтобы выделить для его колонки в DW соответствующую ширину.

Может кто поможет "добрым кодом"?

Заранее спасибо!
Я чего-то не понял, зачем Вы к принтеру вообще лезете? Все содержимое DataWindow на принтере тоже все сами отрисовывать будете? Определяйте размер в контексте экарана, а функция print() отмасштабирует его на принтер при печати самостоятельно.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36296677
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин Марк,
дело в том, что в контексте экрана определяется правильно для экрана.
Когда дело доходит до принтера (начиная с preview), рассчитанной ширины не хватает - текст обрезается (если без пробелов) либо переносится на другую строку (включен Autosize height).
По этому, сложилось впечатление, что необходимо рассчитывать в контексте принтера.
Но не всегда расчет неверен. Например, для шрифта Times New Roman, в зависимости от размера шрифта:
8 - верный расчет
9 - неверный расчет
10 - неверный расчет
11 - верный расчет
12 - неверный расчет
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297020
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикладываю снимок, что получается при расчете ширины сейчас.
Включил бордер, чтоб было видно границы объекта.
С первого взгляда - ширина колонки точно соответствует ширине содержимого этой колонки (максимальная ширина текста для каждой строки DW с учетом текста в шапке).
Но в каждой строке есть пустое место. Если распечатать отчет или поставить Zoom 120%, то можно увидеть какие колонки увеличились по высоте или другими словами - каким колонкам не хватило выделенной ширины.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297023
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикладываю также пример увеличенного отчета (Zoom 120%), при котором видны проблемные колонки.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297063
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример отчета, как он выглядит без preview.
В этом варианте он выглядит правильно, чего и хочется добиться при печати.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297066
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bagzoid, не доводилось с таким сталкиваться, но определенная логика поведения есть, в строках где пробелы.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297084
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxATC,

логика там только в том, что их возможно переносить на следующую строку из-за наличия пробелов (перенос по словам).
Если поставить в preview zoom 140%, то это намного ближе к тому, что будет на бумаге по факту печати. Теперь виден не влезший текст, в котором нет пробелов:
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297255
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bagzoid,
Ну вот по последнему посту и видна проблема.
Смотри General->Units, догадываюсь у тебя что нибудь типа Inch стоят, а не PowerBuilder. Это в выпадающем списке.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297302
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxATC,
посмотрел, units=0 (PowerBuilder)
Если бы было что-то отличное от 0, то проблема была, наверное, и при отображении данных без preview.
Обратите внимание, что проблема начинается тогда, когда дело к печати идет (preview, сама печать). Как я понимаю, выполняется какой-то пересчет с учетом текущих характеристик выбранного принтера (принтера по умолчанию) и, как оказывается, то, что хорошо отображалось на экране, уже не соответствует тому, что пойдет на печать на этом принтере.

Никому не приходилось ранее подобным заниматься или ограничивались расчетом ширины для экрана?
Будут какие-то еще идеи? Вообще, возможен ли расчет ширины текста в контексте принтера или неправильно выбран способ решения?

P.S. Как временное решение, подберу для каждого проблемного размера шрифта константу в процентах, на которую буду увеличивать рассчитанную ширину колонки. Но боюсь, как бы мне это боком не вышло... Да и минус, если будет необходимость выбора шрифта отчета самостоятельно пользователем, то константы на все варианты не предусмотришь.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297383
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bagzoid,
>Если бы было что-то отличное от 0, то проблема была, наверное, и при отображении данных без preview.
Как раз и нет, данная проблема возникает только при масштабировании в preview, если бы было что-то отличное от 0. Типично Ваша проблема.

>Будут какие-то еще идеи?
Установи другой драйвер принтера и сделай его по умолчанию. Посмотри, будет ли такая же проблема.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297468
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне кажется проблема несколько надуманная.
сождаешь datawindow с необходимой шириной.

если надо привязаться к размеру бумаги, можно выставить юниты - сантиметры.
если у тебя есть колонки с длинным текстом - ширину оставляешь как есть и выставляешь autosize height.
если выставлять ширину колонки под текст, можно неуложиться в ширину листа или получить достаточно кривой отчет...
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297489
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxATCBagzoid,
Установи другой драйвер принтера и сделай его по умолчанию. Посмотри, будет ли такая же проблема.
В системе были еще стандартные Fax и Microsoft XPS Document Writer - с ними все тоже самое.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297499
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry..
если выставлять ширину колонки под текст, можно неуложиться в ширину листа или получить достаточно кривой отчет...
Почему же так пессимистично?
Вполне можно уложиться в ширину листа и получить ничуть не кривой отчет! :)
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297641
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Возможно у Вас есть расчетные параметры (x, ширина и т.п.) столбцов/полей, и поэтому при изменении масштаба в этих формулах идет округление и дает такой результат. Кстати, ширина столбца не всегда одно и тоже с шириной колонки, и здесь может формироваться та дельта ошибки.
2. Произвольное изменение масштаба (я так думаю) скверно стыкуется с пропорциональным изменением шрифта и по факту, а не расчету подставляется тот, который ближе к расчетному. Возможно можно отловить закономерность при смене типа шрифта.
3. Возможно необходимо выдержать очередность действий: сначала установить масштаб для DW либо установить новый размер шрифта, а потом выполнять вычисления по определению длины строки и установлению параметров столбца, ну и в конце прорисовать заново.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297688
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagzoidДа, есть такая функция:
private function boolean GetTextExtentPoint32 (long hDC, string lpString, long cbString, ref SIZE lpSize) ALIAS FOR "GetTextExtentPoint32A" LIBRARY "GDI32.DLL"

Вот бы примерчик, как получить hDC принтера (первый параметр функции).
Функция то есть, но применить её помню не так просто оказалось, т.е. "с нахрапа" у меня тоже когда-то она считала не верно.
Я делал всплывающую подсказку для DW, аналогичную LVview, т.е. если строка вся не видна, то на месте столбца появляется подсказка необходимой длины и с идентичным шрифтом. Вроде и делал правильно, но шрифт подставлялся похожий и соответственно эта "подсказка" не ложилась чётко на столбец, а была больше (например) и текст весь не помещался. Благо можно было тут же со столбцом сравнивать. Даже при добалении лишней буквы к результату проблема все равно когда-нибудь, но появлялась.
Всё это я про то, что возможно вы не правильно применяете данную функцию и весь алгоритм расчета.
Вот часть кода, что-то типа "примерчика" (покрайней мере в таком виде у меня всё заработало):
Код: 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.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
/*
Function boolean GetTextExtentPoint32 (ulong hdcr, string lpString, long nCount, Ref point size) Library "gdi32.dll" Alias For "GetTextExtentPoint32W"

Function: of_GetTextSize(ref string as_text, ref integer ai_width, integer ai_height, ref unsignedlong aul_font, string as_colname)
*/	
string		ls_value, ls_format
Integer		li_Return
ULong		lul_Hdc, lul_hFont, lul_Handle
Point 		lstr_Size
StaticText	lst_text

li_Return = Parent.Dynamic Function OpenUserObject(lst_text)

If li_Return <>  1  Then RETURN li_Return

// get column format string
ls_format = this.Describe(as_colname + ".Format")
// give static text same font properties as column
lst_text.FaceName = this.Describe(as_colname + ".Font.Face")
lst_text.TextSize = Integer(this.Describe(as_colname + ".Font.Height"))
lst_text.Weight = Integer(this.Describe(as_colname + ".Font.Weight"))
// set italic property
If this.Describe(as_colname + ".Font.Italic") = "1" Then
   lst_text.Italic = True
Else
   lst_text.Italic = False
End If
// set charset property
CHOOSE CASE this.Describe(as_colname + ".Font.CharSet")
   CASE "0"
      lst_text.FontCharSet = ANSI!
   CASE "2"
      lst_text.FontCharSet = Symbol!
   CASE "128"
      lst_text.FontCharSet = ShiftJIS!
   CASE "255"
      lst_text.FontCharSet = OEM!
   CASE ELSE
      lst_text.FontCharSet = DefaultCharSet!
END CHOOSE
// set family property
CHOOSE CASE this.Describe(as_colname + ".Font.Family")
   CASE "1"
      lst_text.FontFamily = Roman!
   CASE "2"
      lst_text.FontFamily = Swiss!
   CASE "3"
      lst_text.FontFamily = Modern!
   CASE "4"
      lst_text.FontFamily = Script!
   CASE "5"
      lst_text.FontFamily = Decorative!
   CASE ELSE
      lst_text.FontFamily = AnyFont!
END CHOOSE
// set pitch property
CHOOSE CASE this.Describe(as_colname + ".Font.Pitch")
   CASE "1"
      lst_text.FontPitch = Fixed!
   CASE "2"
      lst_text.FontPitch = Variable!
   CASE ELSE
      lst_text.FontPitch = Default!
END CHOOSE
// create device context for statictext
ul_Handle = Handle(lst_text)
lul_hDC = GetDC(lul_Handle)
// get handle to the font used by statictext
lul_hFont = Send(lul_Handle, WM_GETFONT,  0 ,  0 )
// Select it into the device context
SelectObject(lul_hDC, lul_hFont)

aul_font = lul_hFont

ls_value = RightTrim(String(as_text, ls_format))
// determine text width
If Not GetTextExtentPoint32(lul_hDC, ls_value, Len(ls_value), lstr_Size) Then
    ReleaseDC(lul_Handle, lul_hDC)
    li_Return = Parent.Dynamic Function CloseUserObject(lst_text)
    Return - 1 
End If

ai_Width = lstr_Size.al_x
ai_Height = lstr_Size.al_y

ReleaseDC(lul_Handle, lul_Hdc)
//Destroy st_text
li_Return = Parent.Dynamic Function CloseUserObject(lst_text)

Return li_Return
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36297789
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати!

Чтобы получить hdc принтера надо пользоват ф-ю
Код: plaintext
1.
2.
3.
4.
5.
HDC CreateDC(
    LPCTSTR lpszDriver,	// pointer to string specifying driver name 
    LPCTSTR lpszDevice,	// pointer to string specifying device name  
    LPCTSTR lpszOutput,	// do not use; set to NULL 
    CONST DEVMODE *lpInitData 	// pointer to optional printer data 
   );

ф-я OpenPrinter не возвращает HDC ;-)

PS: Удачи. Хотя все еще не вижу в этом смысла...
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36298082
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry.., спасибо за подсказку с функцией.
Теперь код по определению ширины текста отработал, да вот только результат идентичен определению ширины для экрана.
Что-то я упускаю в происходящем...
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36298273
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagzoidDmitry.., спасибо за подсказку с функцией.
Теперь код по определению ширины текста отработал, да вот только результат идентичен определению ширины для экрана.
Что-то я упускаю в происходящем...
Так происходит потому, что при масштабировании появляются округления.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36299944
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркТак происходит потому, что при масштабировании появляются округления.
А что если для ДВ включить сантиметровые или дюймовые юниты. По идее тогда при выводе на экран будет преобразование, а при печати будет печататься как есть. Ну еще возможно придется значения полученные через GetTextExtentPoint32 переводить в сантиметры, если они для контекста принтера уже не в сантиметрах.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36300424
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЛокшин МаркТак происходит потому, что при масштабировании появляются округления.
А что если для ДВ включить сантиметровые или дюймовые юниты. По идее тогда при выводе на экран будет преобразование, а при печати будет печататься как есть. Ну еще возможно придется значения полученные через GetTextExtentPoint32 переводить в сантиметры, если они для контекста принтера уже не в сантиметрах.
Как мне кажется, нужно размерность в DataWindpw поставить в пикселях и переводить с учетом коэффициента который получается из DPI принтера деленных на DPI экрана. Или воспользоваться моноширинным шрифтом, там картина должна получше выглядеть. С True type шрифтами одновременно и на экране и на принтере не получится.
...
Рейтинг: 0 / 0
Подбор ширины колонки перед печатью
    #36301961
Bagzoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приводу DPI принтера и экрана.
dpi_printer = 600
dpi_screen = 96

Кэффициент получается 600/96=6,25

Попытался подобрать для одного шрифта коэффициент, на который умножаю после расчета ширины текста. Для разных размеров шрифта разный коэффициент, а в случае использования коэффициента с соотношением DPI ведь будет всегда один коэффициент? Получается, я не выйду на примерно полученные коэффициенты:
Код: plaintext
1.
2.
- 9   =  1 . 018 
- 10  =  1 . 118 
- 12  =  1 . 11 
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Подбор ширины колонки перед печатью
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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