vb net устанавливает размер шрифта на основе длины строки

#vb.net #font-size

#vb.net #размер шрифта

Вопрос:

Я пытаюсь установить размер шрифта на основе длины трех строк текста
Ограничивающим фактором является область печати, которая является адресной меткой 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)
  

Это РЕДАКТИРОВАНИЕ с ИСПРАВЛЕНИЕМ, которое, как @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
  

Комментарии:

1. Что такое gv_AD, gv_CT, gv_FN и gv_LN? Глядя на вашу логику, кажется вполне возможным, что последние условия переопределяют первые. Возможно, ваш ответ может быть «ElseIf», а не отдельными операциями

2. @Hursey Плохое соглашение об именах, это глобальные переменные AD = Address, FN и LN — это имена и фамилии, а CT — это город, максимальные значения контролируются в текстовых полях ввода данных. Позвольте мне попробовать код с помощью Elseif

3. @Hursey Некоторое улучшение, НО НЕ достижение последнего теста, в котором размер шрифта установлен на 15, возможно, это значения теста Or во втором тесте, можно просто попробовать Last ElseIf без параметров

4. Есть некоторые тестовые значения, которые вы ожидаете ввести в 3-й if? Возможно, обновите вопрос своим новым кодом

5. @Hursey В противном случае, если проблема решена, я обновлю вопрос Спасибо за помощь

Ответ №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
  

Комментарии:

1. Обучение программированию похоже на то, как я пытался научиться играть в бридж очень медленно, временами я уверен, что вы можете оценить, что использование List(of — реальный КЛЮЧ здесь, он устраняет все операторы ELSEIF и IF, за которые я цепляюсь для тестирования переменных Извлеченный урок

2. @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
  

Комментарии:

1. Выглядит многообещающе, поверит в это

2. Как насчет использования OrElse для короткого замыкания оператора If.