【问题标题】:vb net set font size based on string lengthvb net 根据字符串长度设置字体大小
【发布时间】:2020-09-30 16:05:57
【问题描述】:

我正在尝试根据三个文本字符串的长度设置字体大小
限制因素是打印区域,即 Avery 地址标签 1" X 2-5/8"
需要打印的三串数据用全局变量gv表示
因为这三个字符串的长度可能会根据数据而有所不同,所以我测试长度的代码试图比较 3 个元素以决定字体大小。如果一组太长,则它决定了字体大小
如果所有数据都非常长,则第一个测试有效
第二个测试有效,但无法允许第三个测试运行。发布的代码将使这一点更加清晰。希望

我不确定失败是否是我的测试代码构造,因为我尝试了许多设计
我看过这个概念,但觉得它不适用于我的问题

StringSize = e.Graphics.MeasureString(strS, myFont)

因为我要处理 3 个高度可变的元素,所以我觉得我的测试代码不是一个可行的概念

如果有更好的解决方案可以帮助解决此问题,请提出建议
或者我的测试代码可以修复吗?

测试代码

    Dim FL As Integer = gv_FN.Length + gv_LN.Length

    If gv_AD.Length >= 24 Or FL >= 26 Or gv_CT.Length >= 16 Then
        fontSIZE = 11
    End If
    If gv_AD.Length = 23 Or gv_AD.Length = 22 Or gv_AD.Length = 21 Or gv_AD.Length = 20 Or gv_AD.Length = 19 _
        Or FL = 25 Or FL = 24 Or FL = 23 Or FL = 22 Or FL = 21 _
        Or gv_CT.Length = 15 Or gv_CT.Length = 14 Or gv_CT.Length = 13 Or gv_CT.Length = 12 Then
        fontSIZE = 13
    End If
    If gv_AD.Length <= 18 Or FL <= 20 Or gv_CT.Length <= 11 Then
        fontSIZE = 15
    End If
    tbInfo.Text = fontSIZE.ToString
    Dim labelFont As Font = New Font("Times New Roman", fontSIZE, FontStyle.Bold)

这是一个带有 FIX 的 EDIT,@Hursey 建议使用 ElseIf

        If gv_AD.Length >= 24 Or FL >= 26 Or gv_CT.Length >= 16 Then
        fontSIZE = 11

    ElseIf gv_AD.Length = 23 Or gv_AD.Length = 22 Or gv_AD.Length = 21 Or gv_AD.Length = 20 Or gv_AD.Length = 19 _
     Or FL = 25 Or FL = 24 Or FL = 23 Or FL = 22 Or FL = 21 _
     Or gv_CT.Length = 15 Or gv_CT.Length = 14 Or gv_CT.Length = 13 Or gv_CT.Length = 12 Then
        fontSIZE = 13
    Else
        fontSIZE = 15
    End If
    tbInfo.Text = fontSIZE.ToString
    Dim labelFont As Font = New Font("Times New Roman", fontSIZE, FontStyle.Bold) 'Times New Roman

【问题讨论】:

  • 什么是gv_AD、gv_CT、gv_FN和gv_LN?从你的逻辑来看,后面的条件覆盖第一个条件似乎是很可行的。也许您的答案可能是“ElseIf”而不是单独的操作
  • @Hursey 糟糕的命名约定它们是全局变量 AD = 地址 FN 和 LN 是名字和姓氏,CT 是城市 在数据输入文本框中控制最大值 让我试试 Elseif 的代码
  • @Hursey 一些改进但没有达到字体大小设置为 15 的最后一个测试它可能是第二个测试中的 Or 测试值可以尝试 Last ElseIf 没有参数
  • 获得了一些您希望进入第三个的测试值,如果?也许用你的新代码更新问题
  • @Hursey ElseIF 解决了问题,我将更新问题感谢您的帮助

标签: vb.net font-size


【解决方案1】:

我希望标签的3行都是相同的字体大小。获取最长的行并测试它以获得字体大小。

一次解析字符串长度;然后使用局部变量。使用 .Max 函数返回最长的行。

Private gv_FN As String
Private gv_LN As String
Private gv_AD As String
Private gv_CT As String
Private Sub OP2Code()
    Dim fontSIZE As Integer
    Dim FirstLine As Integer = gv_FN.Length + gv_LN.Length
    Dim SecondLine = gv_AD.Length
    Dim ThirdLine = gv_CT.Length
    Dim Longest = (New List(Of Integer)({FirstLine, SecondLine, ThirdLine})).Max
    Select Case Longest
        Case >= 26
            fontSIZE = 11
        Case >= 21
            fontSIZE = 13
        Case <= 20
            fontSIZE = 15
    End Select
    tbInfo.Text = fontSIZE.ToString
    Dim labelFont As Font = New Font("Times New Roman", fontSIZE, FontStyle.Bold)
End Sub

【讨论】:

  • 学习编码就像我尝试学习打桥牌的时候一样,有时速度很慢我相信你会理解使用 List(of 是这里的真正关键它消除了所有 ELSEIF 和 IF 语句我坚持测试变量的经验教训
  • @Vector 我还在慢慢地学习这两种方法。我本可以使用一个数组,但我已经开始列出很多我只是习惯性地做的事情。目前正在学习桥牌中的弱二重奏。 :-)
【解决方案2】:

你可以把三个字符串元素加起来,然后你只需要测试一个值
测试值将与您当前的测试值大不相同
我整理了一些抽象数字,所以你需要自己的集合

    Dim FL As Integer = gv_FN.Length + gv_LN.Length
    Dim AD As Integer = gv_AD.Length
    Dim CT As Integer = gv_CT.Length
    Dim tot As Integer = FL + AD + CT
    If tot >= 54 Then
        fontSIZE = 12
    End If
    If tot = 53 Or tot = 52 Or tot = 51 Or tot = 50 Or tot = 49 Or tot = 48 _
        Or tot = 47 Or tot = 46 Or tot = 45 Or tot = 44 Or tot = 43 Then
        fontSIZE = 13
    End If
    If tot <= 42 Then
        fontSIZE = 15
    End If

【讨论】:

  • 看起来很有希望会试一试
  • 使用 OrElse 将 If 语句短路怎么样。
猜你喜欢
  • 2014-07-15
  • 2011-05-13
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2016-09-17
  • 2014-07-24
  • 1970-01-01
相关资源
最近更新 更多