Pregunta

Estoy tratando de abrirme camino a través de Extreme Programming Adventures de Ron Jeffries en C #. Sin embargo, estoy atascado en el Capítulo 3 porque el código no hace, y no puede , hacer lo que el autor dice que hace.

Básicamente, el texto dice que debería poder escribir algo de texto en un cuadro de texto habilitado para ajuste de texto. Si luego muevo el cursor a una línea intermedia y presiono enter, el código debería volver a mostrar las líneas antes del cursor, agregar un par de líneas y un conjunto de etiquetas de párrafo HTML, luego agregar el resto de las líneas. El código no coincide con el texto porque usa la propiedad textbox.lines. Bueno, no importa cuántas líneas entrelazadas en un cuadro de texto, solo hay UNA línea en la propiedad Líneas hasta que llegue a un retorno de carro. Entonces, la declaración de que el código debería, "Copiar el resto de las líneas en el búfer" me parece mal

¡Apreciaría que alguien que tenga experiencia con el libro me diga lo que estoy leyendo o haciendo mal!

Gracias.

EoRaptor

¿Fue útil?

Solución

Intenta enviar un correo electrónico a Ron Jeffries directamente. Tengo el libro, en alguna parte, pero no recuerdo que no funcione. Su dirección de correo electrónico es ronjeffries en acm dot org y pone a [Ron] en la línea de asunto.

(Y para aquellos que se preguntan: su información de correo electrónico proviene de su sitio web Página de bienvenida )

Otros consejos

También acabo de comenzar este libro y tuve exactamente el mismo problema, aunque el código que ha incluido se ve más allá de donde estoy. El 'subíndice fuera de rango' ocurrió por 2 razones, primero cuando Ron explica que solo estaba probando y por lo tanto devolvió un valor codificado de 3 antes de escribir la función CursorLine (), lo que significa que creo que al menos 4. líneas de texto que, como usted dice, deben pegarse, o tal vez establecer el texto en este valor antes de ejecutarse, también cuando dice que necesitan retornos de carro para hacer txtbox.Lines devuelven una matriz de cadenas. La segunda razón ocurre incluso después de que CursorLine () se haya implementado, pero solo ocurre si el cuadro de texto está vacío como txtbox.Lines devuelve la cadena [0] pero creo que Ron está implementando una 'Historia de usuario' que dice que cuando se ingresó el texto y el usuario presiona enter, así que no estoy seguro de si lo arregla más tarde, ¡pero probablemente lo descubrirá!

Los autores afirman que están aprendiendo C # y mostrarán las verrugas de desarrollo y todo eso, que es una de las razones por las que he elegido estudiar este libro, ya que creo que me está animando a desarrollar proyectos. También trato de hacer el código primero antes de ver sus soluciones para ver si estoy pensando de la misma manera, pero tal vez conozco C # un poco mejor de lo que me doy crédito, o estoy completamente loco, pero he notó algunas cosas, primero dice que anular OnKeyDown () no funciona, pero creo que debe haberse confundido e intentado hacerlo en Formulario, en lugar de derivar de TextBox y anularlo allí. Este era mi código cuando leía la 'Historia del usuario':

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;

Funciona de manera diferente al código de Ron, pero fue solo mi interpretación de la 'Historia del usuario' y no estoy seguro de cómo actuar si se selecciona el texto o si se debe dividir la línea si el cursor del texto está en el medio, etc.

También en 'Mis aventuras' en Extreme Programming Adventures en C #

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

obtiene la posición de la línea del cursor y no importa si no se devuelve o cambia el tamaño del carro, Por lo que puedo decir, hice una pequeña prueba con:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

que devuelve la cantidad total de líneas, que variará si cambia el tamaño del cuadro de texto.

Usando C # siempre busco soluciones que ya existen y la gente puede pensar en esto, pero creo que MS ha creado un excelente lenguaje con excelentes componentes que hacen lo que espera que hagan, así que no tengo que volver a crear La rueda cada vez. Aunque, como dije, son los primeros días de este libro y tal vez estas soluciones simples no sean lo suficientemente extensibles y tal vez Ron lo esté teniendo en cuenta, aunque mencionó que solo funcionara y luego preocuparse por eso más tarde es más la forma de XP.

Warren.

print("using System;

usando System.Collections; usando System.Collections.Generic; usando System.Text;

espacio de nombres NotepadOne {

Public class 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;
}

} } ");

El método InsertParagraphTags se llama presionando la tecla Intro en el cuadro de texto.

Por cierto, el salto aquí es que hay un error de subíndice fuera de rango si intentas presionar enter al final del texto. Estoy seguro de que podría descubrir cómo solucionar esto, pero mi código no se verá como el suyo; que es lo que intento aprender

Randy

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top