C#中极限编程冒险的勘误表?

时间:2008-11-21 20:55:02

标签: c# textbox extreme-programming

我正试图通过Ron Jeffries的C#极限编程历险记来解决问题。然而,我在第3章中陷入困境,因为代码没有,不能,做了作者所说的。

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

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

感谢。

始盗龙

3 个答案:

答案 0 :(得分:1)

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

(对于那些想知道的人 - 他的电子邮件信息来自他的网站Welcome page

答案 1 :(得分:1)

我刚刚开始写这本书并且遇到了完全相同的问题,尽管你所包含的代码看起来比我的位置更进一步。 '下标超出范围'出现有两个原因,首先是因为Ron解释他只是在测试,因此在编写CursorLine()函数之前返回了硬编码值3,这意味着你认为你至少有4个?正如您所说,需要粘贴的文本行,或者可能在运行之前将文本设置为此值,正如您所说,他们需要使用回车来使txtbox.Lines返回一个字符串数组。 第二个原因即使在CursorLine()实现后也会发生,但只有在文本框为空时才会发生,因为txtbox.Lines返回字符串[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;

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

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

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

获取光标行位置,如果没有回车或调整大小,则无关紧要, 据我所知,我做了很少的测试:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

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

使用C#我总是寻找已经存在的解决方案,人们可​​能会为此提出建议,但我认为MS已经创建了一个很棒的语言,其中有很多组件可以按照您的期望去做,所以不必重新创建每次轮子。 虽然我在本书的早期就已经说过,也许这些简单的解决方案不够具有可扩展性,也许罗恩正在考虑这一点,尽管他确实提到了让它工作然后担心以后更多的是XP方式。

沃伦。

答案 2 :(得分:0)

print("using System;

使用System.Collections; 使用System.Collections.Generic; 使用System.Text;

命名空间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;
}

} } “);

通过按文本框​​中的回车键调用InsertParagraphTags方法。

顺便说一下,如果你试图在文本的末尾点击输入,那么这里的断点就是有一个下标超出范围错误。我敢肯定我可以弄清楚如何解决这个问题但是我的代码看起来不像他的代码;这就是我想要学习的东西。

兰迪