首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确保存MemoEdit的格式

如何正确保存MemoEdit的格式
EN

Stack Overflow用户
提问于 2017-03-06 22:02:01
回答 2查看 437关注 0票数 0

我有一个MemoEdit-Field,当用户插入一个每行字符数比我的MemoEdit-field多的文本时,组件的行为会出现问题。一旦达到一行的最大长度,组件就会中断该行并继续下一行。

然而,这些换行符只是“视觉的”,这意味着不会在每个换行符中添加任何类型的换行符。由于这些缺失的换行符,即使格式正确的文本在保存后也会被打乱排序,因为格式化它们的用户无法看到是否有回车换行符或只有一个“视觉”换行符。有没有一种方法可以根据Memo编辑字段的大小来确定字符串中将出现换行的确切索引?特别是当我尝试考虑单个字符间距时,似乎很难找到一种通用的方法。

EN

回答 2

Stack Overflow用户

发布于 2017-03-07 16:00:14

到目前为止,最简单的解决方案是禁用换行。您可以通过设置memoEdit.Properties.WordWrap = false来实现此目的。这将导致编辑器向右流动,而不是进行视觉换行。这样你的用户就可以在需要的时候添加换行符。

获取文本应该被分隔处的索引似乎很困难。我想出了这样的东西:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2017-03-07 18:07:48

Win32接口中有EM_FMTLINES消息。如果将此消息发送到TextBox控件,则其Text属性将包含软换行符。软换行符是CrCrLf字符的组合,用于标记换行导致换行的位置。

下面是简单扩展模块示例:

代码语言:javascript
运行
复制
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属性中获取它。

代码语言:javascript
运行
复制
Dim text = MemoEdit1.MaskBox.GetWrappedText

现在,您可以使用String.Split方法获取这些行:

代码语言:javascript
运行
复制
Dim lines = text.Split({vbCr & vbCrLf, vbCrLf, vbLf}, StringSplitOptions.None)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42627569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档