화면 위치를 제어하기 위해 VB의 MsgBox를 대체했습니다. Visual Studio 환경에서는 내가 원하는대로 정확히 수행했습니다. 클래스 라이브러리로 변환했지만 vbCrLf 문자가 포함 된 문자열은 빈 줄을 추가하고 들여 쓰기를 위해 줄에 삽입 된 5 개의 공백을 잃습니다.
MyLabel의 너비를 두 배로 늘리려 고했습니다. MyLabel.Width에 술어가 있기 때문에 양식이 더 넓어졌지만 추가 줄은 여전히 존재했습니다. 내 텍스트 줄과 레이블은 다음과 같이 작성됩니다.
'split the string on vbCrLf with some leading spaces on each line to indent the message
strLineArr = strMsg.Split(vbCrLf)
Dim intMaxLength As Integer = 0
Dim intIndex As Int16 = 0
Dim ctrLine As Int16 = 0
strMsg = vbCrLf & vbCrLf 'put some space at the top
For i = 0 To strLineArr.Length - 1
If strLineArr(i).Length > intMaxLength Then
intMaxLength = strLineArr(i).Length 'width of label is based on longest line
intIndex = i 'keep tack of which line
End If
strMsg = strMsg & Space(5) & strLineArr(i) & vbCrLf 'add five leading space for an indent
ctrLine += 1 'line counter for the height of the label
Next
'set up the label and message
Dim lblMsg As New Label()
lblMsg.Font = New Drawing.Font("Arial", 10, FontStyle.Regular)
lblMsg.Text = strLineArr(intIndex) & "cccccccccc" 'longest line; add 10 'c' spaces for margin
Dim g As Graphics = lblMsg.CreateGraphics()
lblMsg.Width = CInt(g.MeasureString(lblMsg.Text, lblMsg.Font).Width)
lblMsg.Height = CInt(g.MeasureString(lblMsg.Text, lblMsg.Font).Height) * (ctrLine + 3)
lblMsg.Text = strMsg
"Short Message"& vbCrLf & "Second row"문자열 사용 :
왼쪽은 코드가 Visual Studio 환경에서 실행되는 경우입니다. 오른쪽은 .dll 내에서 실행되는 동일한 코드입니다.
이것에 대한 모든 생각을 주시면 감사하겠습니다.
범인이 될 것 같습니다. 이것은 당신이 항상 가지고 있어야하는 이유에 대한 완벽한 예입니다 Option Strict On
. 이 줄 :
strLineArr = strMsg.Split(vbCrLf)
존재하지 않는 메서드를 호출하려고합니다. vbCrLf
이며 이와 같은 매개 변수 를 받아들이는 메서드의 String
오버로드가 없습니다 . 를 가지고 있다면 컴파일러는 그 사실을 알리고 수정할 때까지 프로젝트 빌드를 거부합니다. 를 사용 하면 컴파일러가 수행하려는 작업을 가장 잘 추측합니다.Split
String
Option Strict On
Option Strict Off
무엇을 결정하면 실제로 받아 과부하 호출 할 것입니다 ParamArray
의 Char
값을. 이를 달성하기 위해 단순히 첫 번째 문자를 사용 String
하고 나머지는 버립니다. 즉, 캐리지 리턴 문자로만 분할하고 생성 한 첫 번째 하위 문자열을 제외한 모든 부분에 첫 번째 문자로 잘못된 줄 바꿈이 있음을 의미합니다.
나중에 부분 문자열 사이에 줄 바꿈을 삽입하여 원본 텍스트를 재구성하려고 시도합니다. 즉, 실제로 각 부분 문자열 쌍 사이에 캐리지 리턴 하나와 줄 바꿈 두 개로 끝납니다. 코드가 어디에 있는지에 따라 왜 결과가 다른지 모르겠지만, 예상되는 결과를 어디서 얻든 코드가 틀린 것은 그냥 행복한 사고입니다.
기본적으로 코드는 끔찍합니다. 미안하지만 그게 그대로 야 각 줄에 선행 공백을 추가하여 위치를 제어하려는 것은 끔찍합니다. a Label
를 사용 하여 텍스트를 표시하고 컨트롤의 위치가 양식 가장자리로부터의 간격을 제공하도록하거나 GDI +를 사용하여 원하는 위치에 정확하게 모든 텍스트를 그려야합니다. 당신이하는 일은 더러운 해킹이고 당신은 그것을 막아야합니다.
정말로하고있는 일을 계속해야한다면, String
온라인 줄 바꿈 을 나누는 올바른 방법 String.Split
은 실제로 String
구분 기호가 아닌 Char
구분 기호를 받아들이 는 다른 오버로드를 사용 하는 것 입니다. 먼저이 Option Strict On
프로젝트의 속성 페이지 On
에서 설정 하고 IDE 옵션 에서도 설정 하므로 On
향후 프로젝트에 기본적으로 사용됩니다. 늦은 바인딩 또는 암시 적 변환을 다른 곳에서 사용하는 경우 다른 오류를 수정해야 할 수 있습니다. 이제 String
현재 플랫폼에 대해 항상 기본 줄 바꿈이 있다는 사실을 알고 있다면 다음 과 같이하십시오.
strLineArr = strMsg.Split({Environment.NewLine}, StringSplitOptions.None)
줄 바꿈이 Windows (CR-LF)인지 UNIX (LF)인지 모르는 경우 다음을 수행 할 수 있습니다.
strLineArr = strMsg.Split({ControlChars.CrLf, ControlChars.Lf}, StringSplitOptions.None)
후자는 우선적으로 두 문자로 함께 분할되지만 단일 줄 바꿈에서도 분할됩니다.
정말로 원본 텍스트를 재구성하고 싶지만 각 줄 앞에 5 개의 공백이있는 경우 다음을 제안합니다.
Dim spaces = New String(" "c, 5)
strMsg = spaces & String.Join(Environment.NewLine & spaces, strLineArr)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다