2017-03-06 8 views
0

私はMemoEdit-fieldを持っていて、MemoEdit-Fieldよりも多くの文字を含むテキストをユーザーが挿入するとコンポーネントの動作に問題があります。 行の最大長に達すると、コンポーネントは行を分割して次の行に進みます。MemoEditの書式を正しく保存するにはどうすればいいですか?

ただし、これらの改行は「視覚的」なので、改行ごとに改行が追加されていないことを意味します。 改行がないため、正しい書式設定されたテキストであっても、書式設定中のユーザーが改行改行または「ビジュアル」改行がないかどうかを確認することができないため、保存した後に改ざんされます。 Memo-editフィールドのサイズに基づいて、文字列の改行が起こりそうな正確なインデックスを特定する方法はありますか? 特に、個々の文字間隔を考慮しようとすると、普遍的なアプローチを見つけるのはかなり難しいようです。

答えて

0

最も簡単な解決策は、単語の折り返しを無効にすることです。これを達成するには、memoEdit.Properties.WordWrap = falseを設定します。これにより、視覚的に改行するのではなく、エディタが右に流れるようになります。したがって、必要に応じてユーザは改行マニュアルを追加できます。

テキストを壊すべきインデックスを取得するのは難しいようです。

private void memoEdit1_TextChanged(object sender, EventArgs e) 
{ 
    using (Graphics gr = Graphics.FromHwnd(IntPtr.Zero)) 
    { 
     //Get the actual line 
     string text = memoEdit1.Lines[memoEdit1.Lines.Length - 1]; 

     //Calculate the size of the string 
     SizeF size = gr.MeasureString(text, memoEdit1.Font); 

     //Check if the string is as big as the memoedit 
     //Notice the 50 which is constant for the width of the vertical scrollbar 
     //so far you use one. You may need to fit this to your needs. 
     if (size.Width >= memoEdit1.Size.Width - 50) 
     { 
     int index = memoEdit1.Text.Length - 1; 
     } 
    } 
} 

これは単なるアイデアであり、プロジェクトで正しく動作するように修正する必要があるかもしれません。私はvb.netに慣れていないので、これはC#ですが、採用可能でなければなりません。

ご希望の場合はこちらをご覧ください。

0

Win32 APIにはEM_FMTLINESメッセージがあります。このメッセージをTextBox制御に送信した場合、そのTextプロパティには、ソフト改行文字が含まれます。ソフト改行文字はCrCrLf文字の組み合わせであり、ワードラッピングのために行が壊れている場所をマークするために使用されます。

Module TextBoxExtension 

    Private Const EM_FMTLINES As UInteger = &HC8 

    <DllImport("user32.dll", CharSet:=CharSet.Auto)> 
    Private Function SendMessage(hWnd As IntPtr, Msg As UInteger, wParam As Integer, lParam As IntPtr) As IntPtr 
    End Function 

    <Extension()> 
    Public Function GetWrappedText(ByVal textBox As TextBox) As String 

     Dim handle = textBox.Handle 

     SendMessage(handle, EM_FMTLINES, 1, IntPtr.Zero) 

     GetWrappedText = textBox.Text 

     SendMessage(handle, EM_FMTLINES, 0, IntPtr.Zero) 

    End Function 

End Module 

MemoEditクラスはTextBoxMaskBoxクラスのインスタンスを保持するボックスである:ここ
は、単純な拡張モジュールの一例です。 TextBoxMaskBoxクラスはSystem.Windows.Forms.TextBoxクラスから継承されています。あなたはMemoEdit.MaskBoxプロパティからそれを得ることができます。

Dim text = MemoEdit1.MaskBox.GetWrappedText 

そして今、あなたはString.Split方法使用して行を取得することができます:

Dim lines = text.Split({vbCr & vbCrLf, vbCrLf, vbLf}, StringSplitOptions.None) 
関連する問題