【问题标题】:Errata in Extreme Programming Adventures in C#?C# 极限编程冒险中的勘误表?
【发布时间】:2010-09-23 12:50:44
【问题描述】:

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

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

如果有人对这本书有经验,请告诉我我在读什么或做错了什么,我将不胜感激!

谢谢。

EoRaptor

【问题讨论】:

    标签: c# textbox extreme-programming


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我想到了这一点,但我想确保在联系作者之前我不会看起来比实际更愚蠢! ;-)
    【解决方案2】:
    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 方法通过在文本框中按回车键调用。

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

    兰迪

    【讨论】:

      【解决方案3】:

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

      沃伦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-04
        • 2020-10-08
        • 2010-09-09
        • 2011-04-20
        • 2020-10-16
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        相关资源
        最近更新 更多