Ошибки в Экстремальных приключениях по программированию на C #?

StackOverflow https://stackoverflow.com/questions/310164

  •  08-07-2019
  •  | 
  •  

Вопрос

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

По сути, в тексте говорится, что я должен иметь возможность написать некоторый текст в текстовом поле с поддержкой переноса слов.Если я затем наведу курсор на промежуточную строку и нажму enter, код должен повторно отобразить строки перед курсором, добавить пару строк и набор тегов HTML-абзаца, затем добавить остальные строки.Код не соответствует тексту, поскольку он использует свойство textbox.lines.Что ж, независимо от того, сколько строк, обернутых в слова, содержится в текстовом поле, в свойстве Lines есть только ОДНА строка, пока вы не нажмете на возврат каретки.Итак, утверждение о том, что код должен "Скопировать остальные строки в буфер", кажется мне неправильным.

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

Спасибо.

ЭоРаптор

Это было полезно?

Решение

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

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

Другие советы

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

Авторы заявляют, что они изучают C # и покажут методы разработки и все такое, что является одной из причин, по которой я решил изучить эту книгу, поскольку я думаю, что это вдохновляет меня на разработку проектов.Я также пытаюсь сначала выполнить код, прежде чем смотреть на его решения, чтобы понять, думаю ли я так же, но, возможно, я знаю C # немного лучше, чем сам себе представляю, или я полное дерьмо, но я заметил несколько вещей, сначала он говорит, что переопределение OnKeyDown() не работает, но я думаю, что он, должно быть, запутался и попытался сделать в форме, вместо того, чтобы извлекать из 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;

Это работает иначе, чем код Рона, но это была всего лишь моя интерпретация "Истории пользователя", и я не уверен, как следует действовать, если текст выделен или нужно разделить строку, если текстовый курсор посередине и т.д.

Также в "Моих приключениях" в Extreme Programming Adventures на C#

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

возвращает положение строки курсора и не имеет значения, возвращается ли каретка или изменяется размер, насколько я могу судить, я провел небольшой тест с:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

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

Используя C #, я всегда ищу решения, которые уже существуют, и люди могут обвинить меня в этом, но я думаю, что MS создала отличный язык с отличными компонентами, которые делают то, что вы от них ожидаете, так что не нужно каждый раз заново создавать колесо.Хотя, как я уже сказал, эта книга только начинается, и, возможно, эти простые решения недостаточно расширяемы, и, возможно, Рон принимает это во внимание, хотя он и упомянул, что просто заставить это работать, а потом беспокоиться об этом позже - это больше для XP.

Уоррен.

print("using System;

использование системы.Коллекции;использование системы.Коллекции.Общий;использование 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 в текстовом поле.

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

Рэнди

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top