Столбец усекается в PowerBuilder с учетом определенных шрифтов - PullRequest
0 голосов
/ 05 августа 2011

У меня есть столбец varchar(5000). В окне данных PowerBuilder. отображение этого столбца усекается, если длина строки превышает 4600, когда размер шрифта равен 12.

Но если шрифт имеет размер 8, он отображает все значение / содержимое этого столбца.

Я хотел бы подтвердить свою идею об ограничении PB.

1 Ответ

0 голосов
/ 05 августа 2011

Вы можете проверить, имеет ли строка, которая отображается неправильно, размер отображения сверх значительного значения.Я подозреваю, что если строка превышает 32768/65536 единиц ширины, она может быть обрезана, когда PB «рисует» значение столбца ...

Вот код для проверки в пикселях и единицах, вызовите его с тем же именеми размер, который указан в DW:

public function long of_getstringwidth (window aw_parent, string as_text, string as_fontname, integer ai_size, boolean ab_bold, boolean ab_italic);// computes the width in pixels of a string as drawn in the specified font

ulong ll_handle, ll_hdc, ll_hdcbis
ulong ll_hfont
ulong weight
long height
long width = -1
st_size size

ll_handle = handle(aw_parent)
ll_hdc = GetDC(ll_handle)

// create the specified font
if ab_bold then weight = FW_BOLD else weight = FW_NORMAL
// compute the height using the display device physical properties
height = -MulDiv(ai_size, GetDeviceCaps(ll_hdc, LOGPIXELSX), 72)
ll_hfont = CreateFont( height, 0, 0, 0, weight, ab_italic, false, false, 0, DEFAULT_CHARSET, 0, 0, 0, as_fontname)
// use that font for the device context
SelectObject(ll_hdc, ll_hfont)

if GetTextExtentPoint32(ll_hdc, as_text, len(as_text), size) then
    width = size.cx + 1 //add 1 is better, look trhough MSDN for clues ;o)
end if

ReleaseDC(ll_handle, ll_hdc)

return width

end function

public function long of_getstringwidthunits (window aw_parent, string as_text, string as_fontname, integer ai_size, boolean ab_bold, boolean ab_italic);// computes the size in pixels of a string as drawn in the specified font
// returns a result in PB units

long width = -1

width = of_getstringwidth(aw_parent, as_text, as_fontname, ai_size, ab_bold, ab_italic)
width = PixelsToUnits(width, XPixelsToUnits!) 

return width

end function

А вот необходимые внешние функции и объявления (надеюсь, что я не пропустил ни одного, но значения можно получить в SDK / MSDN платформы):

Function ULong GetDC(ULong hWnd) Library "User32.DLL"
Function ULong ReleaseDC(ULong hWnd, ULong hDC) Library "User32.DLL"
function long MulDiv(long nNumber, long nNumerator, int nDenominator) library "kernel32.dll"
Function ulong CreateFont(long nHeight,ulong nWidth,ulong nEscapement,ulong nOrientation,ulong fnWeight,boolean fdwItalic,boolean fdwUnderline,boolean fdwStrikeOut,ulong fdwCharSet,ulong fdwOutputPrecision,ulong fdwClipPrecision,ulong fdwQuality,ulong dwPitchAndFamily,ref string lpszFace) LIBRARY "gdi32.dll" ALIAS FOR "CreateFontW"  
Function Ulong SelectObject (Ulong hDC, Ulong hObject) Library "gdi32.dll"
Function Boolean GetTextExtentpoint32(ULong hdc, string lpString, int cbString, ref ST_SIZE lpSize) library "gdi32.dll" alias for "GetTextExtentPoint32W"
Function ulong GetDeviceCaps(ulong hdc,ulong nIndex) library "gdi32.dll"
constant integer FW_NORMAL     = 400
constant integer FW_BOLD       = 700
constant ulong LOGPIXELSX = 88  //Number of pixels per logical inch along the screen width.
constant ulong DEFAULT_CHARSET     = 1   //(x01)

Этот код является частью userobject, куда я помещаю множество функций GDI.Я могу поделиться этим кодом, если кому-то интересно.

...