我正在尝试阅读 Ron Jeffries 的《C# 极限编程冒险》。然而,我被困在第 3 章,因为代码没有,并且 不能, ,按照作者所说的去做。

基本上,文本说我应该能够在启用自动换行的文本框中写入一些文本。如果我随后将光标移动到中间行并按 Enter 键,则代码应重新显示光标之前的行,添加几行和一组 HTML 段落标记,然后附加其余行。该代码与文本不匹配,因为它使用了 textbox.lines 属性。好吧,无论文本框中有多少行自动换行,在按下回车键之前,Lines 属性中都只有一行。因此,代码应该“将其余行复制到缓冲区中”的说法对我来说似乎是错误的。

我很感激任何有这本书经验的人告诉我我在读什么或做错了什么!

谢谢。

始祖猛禽

有帮助吗?

解决方案

尝试直接向Ron Jeffries发送电子邮件。我有这本书 - 某处,但我不记得它不起作用。他的电子邮件地址是acm dot org的ronjeffries,并将[Ron]放在主题行中。

(对于那些想知道的人 - 他的电子邮件信息来自他的网站欢迎页面

其他提示

我也刚刚开始这本书,并且遇到了完全相同的问题,尽管您所包含的代码看起来比我所在的位置更进一步。发生“下标超出范围”有两个原因,首先,Ron 解释说他只是在测试,因此在编写 CursorLine() 函数之前返回了硬编码值 3,这意味着您认为至少是 4?正如您所说,需要粘贴文本行,或者可能在运行之前将文本设置为该值,也正如您所说,它们需要回车符才能使 txtbox.Lines 返回字符串数组。第二个原因甚至在 CursorLine() 已实现之后也会发生,但仅当文本框为空时才会发生,因为 txtbox.Lines 返回 string[0] 但我认为 Ron 正在实现一个“用户故事”,它表示当输入文本时并且用户按下回车键,所以不确定他以后是否修复了这个问题,但可能会发现!

作者确实声明他们正在学习 C#,并将展示开发的优点和全部,这是我选择学习这本书的原因之一,因为我认为它鼓励我开发项目。我也尝试先编写代码,然后再查看他的解决方案,看看我是否以同样的方式思考,但也许我对 C# 的了解比我自以为的要好一点,或者我完全是垃圾,但我已经注意到一些事情,首先他说重写 OnKeyDown() 不起作用,但我认为他一定感到困惑并尝试在 Form 中执行,而不是从 TextBox 派生并重写那里。这是我在阅读“用户故事”时的代码:

int curPos = txtbox.SelectionStart;
string Wrd = Environment.NewLine + "<P></P>" + Environment.NewLine;              
txtbox.SelectedText = Wrd;
int pl = Environment.NewLine.Length + 3; // "<P>" length is 3
// Put text cursor inbetween <P> tags
txtbox.SelectionStart = curPos + pl;

它的工作方式与罗恩的代码不同,但只是我对“用户故事”的解释,不确定如果选择文本应该如何操作,或者如果文本光标位于中间等是否要分割线。

也在“C# 极限编程历险记”中的“我的历险记”中

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

获取光标线的位置,据我所知,没有运输返回或调整大小都没有关系,我很少进行测试:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

它返回总行数,如果调整文本框的大小,行数会有所不同。

使用 C#,我总是寻找已经存在的解决方案,人们可​​能会为此推荐我,但我认为 MS 已经创建了一种很棒的语言,其中包含很棒的组件,可以完成您期望它们做的事情,因此不必每次都重新创建轮子时间。尽管就像我说的,这还处于本书的早期阶段,也许这些简单的解决方案可扩展性还不够,也许 Ron 已经考虑到了这一点,尽管他确实提到了先让它工作,然后担心以后更多的是 XP 方式。

沃伦.

print("using System;

使用系统集合;使用 System.Collections.Generic;使用系统文本;

命名空间 NotepadOne {

公共类 TextModel {

private String[] lines;
private int selectionStart;
private int cursorPosition;

public TextModel() {

}

public String[] Lines {
  get {
    return lines;
  }
  set {
    lines = value;
  }
}

public int SelectionStart {
  get {
    return selectionStart;
  }
  set {
    selectionStart = value;
  }
}

public int CursorPosition {
  get {
    return cursorPosition;
  }
  set {
    cursorPosition = value;
  }
}

public void InsertControlPText() {
  lines[lines.Length - 1] += "ControlP";
}

public void InsertParagraphTags() {
  int cursorLine = CursorLine();
  String[] newlines = new String[lines.Length + 2];
  for (int i = 0; i <= cursorLine; i++) {
    newlines[i] = lines[i];
  }
  newlines[cursorLine + 1] = "";
  newlines[cursorLine + 2] = "<P></P>";
  for (int i = cursorLine + 1; i < lines.Length; i++) {
    newlines[i + 2] = lines[i];
  }
  lines = newlines;
  selectionStart = NewSelectionStart(cursorLine + 2);
}

private int CursorLine() {
  int length = 0;
  int lineNr = 0;
  foreach (String s in lines) {
    if (length <= SelectionStart && SelectionStart <= length + s.Length + 2) {
      break;
      length += s.Length + Environment.NewLine.Length;
      lineNr++;
    }
    lineNr++;
  }
  return lineNr;
}

private int NewSelectionStart(int cursorLine) {
  int length = 0;
  for (int i = 0; i < cursorLine; i++) {
    length += lines[i].Length + Environment.NewLine.Length;
  }
  return length + 3;
}

} } ");

通过在文本框中按 Enter 键来调用 InsertParagraphTags 方法。

顺便说一句,这里的中断是,如果您尝试在文本末尾按 Enter 键,则会出现下标超出范围错误。我确信我可以弄清楚如何解决这个问题,但是我的代码看起来不会像他的代码;这就是我正在努力学习的。

兰迪

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top