- PR -

ActiveReport.NETで文字列の長さを取得するには?

1
投稿者投稿内容
雨雲
会議室デビュー日: 2005/08/19
投稿数: 8
投稿日時: 2007-05-25 16:29
ADP.NET2003 + ActiveReport.NET2.0で開発を行なっています。

現在作成中のラベルで文字数に合わせてフォントサイズを動的に変更を行なわなくてはならない箇所があります。
変更の条件は、コントロールの幅と文字数からフォントサイズを逆算した場合と、
コントロール中でワードラップした場合とを比較し、サイズの大きい方のフォントを設定するというものです。

一先ず等幅フォントの全角のみを使用し、フォントの高さを幅として計算し、
フォントサイズを取得する関数を以下のように作成したのですが、実際のデータでは全半角混在のため、
特定のフォントを使用した場合の文字列の長さを取得する方法をご存知の方がいらっしゃればご教示ください。

コード:
Private Function FontResizer(ByRef opTxtBox As DataDynamics.ActiveReports.TextBox) As System.Drawing.Font

    Const INCH_TO_POINT As Single = 72  '1インチ72ポイントとして計算
    Const FONT_NAME As String = "MS ゴシック"

    Dim CtrlWidth As Single = opTxtBox.Size.Width * INCH_TO_POINT
    Dim CtrlHeight As Single = opTxtBox.Size.Height * INCH_TO_POINT
    Dim WordLength As Integer = opTxtBox.Text.Trim.Length

    Dim DefCtrlWidth As Single
    Dim DefCtrlHeight As Single
    Dim DefFontSIze As Single
    Dim LineCnt As Integer = 1
    Dim TmpFont As System.Drawing.Font
    Dim TmpFontSize As Single
    Dim DefWordLength As Double

    Do
        DefCtrlWidth = CtrlWidth * LineCnt    'ワードラップした場合の描画幅
        DefCtrlHeight = CtrlHeight / LineCnt    'ワードラップした場合の描画高
        TmpFontSize = DefCtrlWidth / WordLength
        If DefCtrlHeight < TmpFontSize Then
            TmpFontSize = DefCtrlHeight
        End If
        TmpFont = New System.Drawing.Font(FONT_NAME, TmpFontSize, FontStyle.Regular, GraphicsUnit.Point)
        TmpFontSize = TmpFontSize - TmpFont.GetHeight(GraphicsUnit.Point)

        LineCnt += 1

        DefCtrlHeight = CtrlHeight / LineCnt
        DefFontSIze = DefCtrlHeight
        TmpFont = New System.Drawing.Font(FONT_NAME, DefFontSIze, FontStyle.Regular, GraphicsUnit.Point)
        DefFontSIze = DefFontSIze - TmpFont.GetHeight(GraphicsUnit.Point)

        If TmpFontSize > DefFontSIze Then
            TmpFontSize = CType(System.Math.Floor(TmpFontSize), Single)
            Return New System.Drawing.Font(FONT_NAME, TmpFontSize, FontStyle.Regular, GraphicsUnit.Point)
        Else
            DefWordLength = System.Math.Floor(DefCtrlWidth / DefFontSIze)
            If WordLength <= DefWordLength Then
                DefFontSIze = CType(System.Math.Floor(DefFontSIze), Single)
                Return New System.Drawing.Font(FONT_NAME, DefFontSIze, FontStyle.Regular, GraphicsUnit.Point)

            End If
        End If

    Loop

End Function

ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-05-25 16:35
特定の文字を使うなら普通は「W」あたりを使う。(半角で)
今回は普通にMeasureStringメソッドで取得すればいいんじゃねーかな?
雨雲
会議室デビュー日: 2005/08/19
投稿数: 8
投稿日時: 2007-05-25 16:58
御回答有難うございます。

http://dobon.net/vb/dotnet/graphics/measurestring.html

↑こちらでMeasureStringメソッドについては知っていたのですが、
ActiveReport.NETのコントロールからCreateGraphicsすることが
出来ないようだったので諦めていたのですが、もう一度調べなおしてみます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-25 19:43
引用:

雨雲さんの書き込み (2007-05-25 16:58) より:

ActiveReport.NETのコントロールからCreateGraphicsすることが
出来ないようだったので諦めていたのですが、もう一度調べなおしてみます。


CreateGraphics メソッドでインスタンスが欲しいのであれば、System.Windows.Forms.Control かその派生クラスである必要があります。
その他の一般的な方法としては System.Drawing.Image のインスタンスから得る方法、Paint 系のイベント引数から得る方法がありますが、帳票はあくまで帳票ですから用紙やドライバなどによって誤差は確実に生まれます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
雨雲
会議室デビュー日: 2005/08/19
投稿数: 8
投稿日時: 2007-05-28 11:22
じゃんぬねっとさん、御回答ありがとうございます。

長さを取得できればいいのだから、別に実際に表示させるコントロールから
CreateObject させる必要はなかったのですね。
思考が硬直してました。
1

スキルアップ/キャリアアップ(JOB@IT)