라이브러리 .DLL로 변환 할 때 MyLabel.Text에 배치 된 ebedded vbCrLf가있는 문자열이 빈 줄을 추가하지 못하도록하는 방법

CPRouse

화면 위치를 제어하기 위해 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 내에서 실행되는 동일한 코드입니다.

이것에 대한 모든 생각을 주시면 감사하겠습니다.

jmcilhinney

범인이 될 것 같습니다. 이것은 당신이 항상 가지고 있어야하는 이유에 대한 완벽한 예입니다 Option Strict On. 이 줄 :

strLineArr = strMsg.Split(vbCrLf)

존재하지 않는 메서드를 호출하려고합니다. vbCrLf이며 이와 같은 매개 변수 를 받아들이는 메서드의 String오버로드가 없습니다 . 를 가지고 있다면 컴파일러는 그 사실을 알리고 수정할 때까지 프로젝트 빌드를 거부합니다. 를 사용 하면 컴파일러가 수행하려는 작업을 가장 잘 추측합니다.SplitStringOption Strict OnOption Strict Off

무엇을 결정하면 실제로 받아 과부하 호출 할 것입니다 ParamArrayChar값을. 이를 달성하기 위해 단순히 첫 번째 문자를 사용 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관