Ошибки в экстремальных приключениях программирования на C #? - PullRequest
0 голосов
/ 21 ноября 2008

Я пытаюсь проработать приключения Рона Джеффриса по экстремальному программированию на C #. Однако я застрял в главе 3, потому что код не делает, а не может делать то, что говорит автор.

В основном, текст говорит, что я должен быть в состоянии написать некоторый текст в текстовом поле с включенной переносом слов. Если я затем переместлю курсор на промежуточную строку и нажму клавишу ввода, код должен заново отобразить строки перед курсором, добавить пару строк и набор тегов абзаца HTML, а затем добавить остальные строки. Код не соответствует тексту, потому что он использует свойство textbox.lines. Ну, независимо от того, сколько строк заключено в текстовое поле, в свойстве Lines есть только ОДНА строка, пока вы не нажмете возврат каретки. Таким образом, утверждение, что код должен «Скопировать оставшиеся строки в буфер», мне кажется неверным.

Буду признателен всем, кто имеет опыт работы с книгой, рассказывающей, что я читаю или делаю, неправильно!

Спасибо.

Eoraptor

Ответы [ 3 ]

1 голос
/ 30 ноября 2009

Я также только начал эту книгу, и у меня была точно такая же проблема, хотя код, который вы включили, выглядит намного дальше, чем я. «Подписание вне диапазона» произошло по двум причинам, во-первых, Рон объясняет, что он только что тестировал, и поэтому вернул жестко запрограммированное значение 3, прежде чем написал функцию CursorLine (), что означает, что вы думаете, по крайней мере, 4? строки текста, которые, как вы говорите, должны быть вставлены, или, возможно, установить текст в это значение перед запуском, также как вы говорите, что они должны иметь возврат каретки, чтобы txtbox.Lines возвращал массив строк. Вторая причина возникает даже после того, как CursorLine () была реализована, но происходит, только если текстовое поле пусто, поскольку txtbox.Lines возвращает строку [0], но я думаю, что Рон реализует «Пользовательскую историю», которая говорит, что когда текст был введен и пользователь нажимает ввод, поэтому не уверен, исправит ли он это позже, но, вероятно, узнает!

Авторы заявляют, что они изучают 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 создала отличный язык с отличными компонентами, которые делают то, что вы от них ожидаете, поэтому не нужно заново создавать колесо каждый раз. Хотя, как я уже сказал, в этой книге первые годы, и, возможно, эти простые решения недостаточно расширяемы, и, возможно, Рон учитывает это, хотя он упомянул, что он просто работает, а потом беспокоится о том, что позже это больше XP.

Уоррен.

1 голос
/ 22 ноября 2008

Попробуйте отправить электронное письмо Рону Джеффрису напрямую. У меня есть книга - где-то, но я не помню, чтобы она не работала. Его адрес электронной почты - ronjeffries в acm dot org и в строке темы укажите [Ron].

(И для тех, кто интересуется - его адрес электронной почты был прямо с его сайта Страница приветствия )

0 голосов
/ 22 ноября 2008
print("using System;

с использованием System.Collections; using System.Collections.Generic; используя System.Text;

namespace 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 вызывается нажатием клавиши ввода в текстовом поле.

Кстати, разрыв здесь в том, что существует ошибка индекса вне диапазона, если вы попытаетесь нажать ввод в конце текста. Я уверен, что смогу понять, как обойти это, но тогда мой код не будет похож на его код; вот чему я пытаюсь научиться

Randy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...