コラムがありますvarchar(5000)
。PowerBuilder データ ウィンドウ。4600
フォント サイズが 12 の場合、文字列の長さがそれを超える場合、この列の表示は切り捨てられます。
ただし、フォントのサイズが 8 の場合、その列のすべての値/コンテンツが表示されます。
それがPBの制限であるという私の考えを確認したいと思います。
コラムがありますvarchar(5000)
。PowerBuilder データ ウィンドウ。4600
フォント サイズが 12 の場合、文字列の長さがそれを超える場合、この列の表示は切り捨てられます。
ただし、フォントのサイズが 8 の場合、その列のすべての値/コンテンツが表示されます。
それがPBの制限であるという私の考えを確認したいと思います。
正しく表示されていない文字列の表示サイズが顕著な値を超えているかどうかを確認できます。文字列が 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)
そのコードは、多くの GDI 関数を配置するユーザー オブジェクトの一部です。誰かが興味を持っている場合は、そのコードを共有できます。