0

我正在尝试通过 Ron Jeffries 的 C# 极限编程冒险。然而,我被困在第 3 章中,因为代码没有也不能按照作者所说的那样做。

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

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

谢谢。

猛禽

4

3 回答 3

1

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

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

于 2008-11-21T22:02:56.203 回答
1

我也刚刚开始阅读这本书并且遇到了完全相同的问题,尽管您包含的代码看起来比我现在的位置更远。“下标超出范围”的发生有两个原因,首先是 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;

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

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

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

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

txtbox.GetLineFromCharIndex(txtbox.TextLength)

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

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

沃伦。

于 2009-11-30T12:38:03.760 回答
0
print("using System;

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

命名空间 NotepadOne {

公共类文本模型 {

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 方法。

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

兰迪

于 2008-11-21T22:05:11.643 回答