Frage

Ich versuche, meinen Weg durch Ron Jeffries Extreme Programming Adventures in C # zu arbeiten. Ich bin fest, aber in Kapitel 3, da der Code nicht, und nicht , das tun, was der Autor sagt, es tut.

Im Grunde sagt der Text, dass ich in der Lage sein sollte, einen Text in einem Zeilenumbruch aktiviert Textfeld zu schreiben. Wenn ich dann den Cursor auf eine Zwischenlinie bewegen und die Eingabetaste drücken, sollte der Code die Zeilen wieder angezeigt werden vor dem Cursor, fügen Sie ein paar Zeilen und eine Reihe von HTML-Absatz-Tags, dann fügen Sie den Rest der Zeilen. Der Code entspricht nicht den Text, weil es die textbox.lines Eigenschaft verwendet. Nun, egal wie viele Wort gewickelte Linien dort in einem Textfeld ist, gibt es nur eine Zeile in der Eigenschaft Lines, bis Sie einen Wagenrücklauf getroffen. So sollte die Aussage, dass der Code, „Kopieren Sie den Rest der Zeilen in den Puffer“ scheint mir falsch.

Ich würde schätzen jemand mit Erfahrung mit dem Buch sagen Sie mir, was ich lese, oder tut, falsch!

Danke.

eoraptor

War es hilfreich?

Lösung

Versuchen Sie direkt Ron Jeffries per E-Mail. Ich habe das Buch - irgendwo, aber ich erinnere mich nicht, dass es nicht funktioniert. Seine E-Mail-Adresse ist bei Ron Jeffries acm dot org und put [Ron] in der Betreffzeile.

(Und für diejenigen fragen - seine E-Mail info war direkt von seiner Website Willkommen )

Andere Tipps

Ich habe auch gerade dieses Buch begonnen und hatte genau das gleiche Problem, obwohl der Code, den Sie sieht weiter enthalten ist, zusammen als da, wo ich bin. Der ‚Index außerhalb des Bereichs‘ aufgetreten aus 2 Gründen, zunächst als Ron erklärt er nur testen und kehrte so einen hartcodierte Wert von 3, bevor er die CursorLine () Funktion geschrieben, was bedeutet, Sie mich mindestens 4 denken? Textzeilen, die, wie Sie benötigen sagen eingefügt in sein, oder vielleicht den Text auf diesen Wert gesetzt, bevor ausgeführt wird, wie Sie auch sagen, dass sie Wagen kehrt txtbox.Lines zu machen ein Array von Strings haben müssen. Der zweite Grund tritt auch nach CursorLine () implementiert, sondern geschieht nur, wenn das Textfeld leer ist als txtbox.Lines zurück string [0], aber ich denke, Ron eine ‚User Story‘ implementiert, die besagen, dass, wenn Text eingegeben wurde und Drücken der Eingabetaste, so dass nicht sicher, ob er dies behebt später, wird aber wahrscheinlich herausfinden!

Der Autor ist es erklären, dass sie C # lernen und wird die Entwicklung Warze ist und alle zeigen, die einer der Gründe, warum ich gewählt haben, dieses Buch zu studieren, wie ich denke, dass es mich ermutigt, Projekte zu entwickeln. Ich versuche auch, den Code zuerst zu tun, bevor auf seinen Lösungen zu suchen, um zu sehen, ob ich die gleiche Art und Weise denke, aber vielleicht weiß ich C # ein wenig besser als ich gebe mir Kredit für, oder ich bin völlig Mist, aber ich habe er sagt, ein paar Dinge bemerkt, zuerst, dass zwingende OnKeyDown () nicht funktioniert, aber ich glaube, er verwirrt haben muss und versucht, in Form zu tun, statt die sie aus TextBox und zwingenden dort. Dies war mein Code, wenn die 'User Story' zu lesen:

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;

Es funktioniert anders zu Rons Code, aber es war nur meine Interpretation der ‚User Story‘ und nicht sicher, wie handeln soll, wenn Text ausgewählt ist oder ob Zeile, wenn Textcursor in der Mitte geteilt etc.

Auch in 'My Adventures' in Extreme Programming Adventures in C #

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

wird der Cursor Linienposition und spielt keine Rolle, wenn keine Zeilenumbrüche oder die Größe neu bestimmt, soweit ich sagen kann, ich wenig Test durchgeführt mit:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

, welche die Gesamtmenge der Zeilen zurückgibt, die variieren, wenn Sie das Textfeld ändern.

Mit C # ich nach Lösungen suchen immer die bereits exsist und die Leute können mich Schiefer dafür, aber ich denke, MS hat eine große Sprache mit großen Komponenten geschaffen, die das tun, was Sie erwarten, dass sie, dies zu tun, muß nicht neu erstellen das Rad jedes Mal. Obwohl, wie ich sage es noch zu früh in diesem Buch ist und vielleicht diese einfachen Lösungen sind nicht erweiterbar genug und vielleicht Rons nehmen, dass zu berücksichtigen, auch wenn er nur nicht erwähnt bekommen es funktioniert, dann befürchtet, dass später ist die XP Art und Weise.

Warren.

print("using System;

System.Collections verwendet wird; Verwendung System.Collections.Generic; using System.Text;

Namespace 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;
}

} } „);

Die InsertParagraphTags Methode durch Drücken der Enter-Taste in dem Textfeld aufgerufen wird.

BTW, hier der Bruch ist, dass es einen Index außerhalb des zulässigen Bereichs Fehler ist, wenn Sie am Ende des Textes drücken Sie die Eingabetaste versuchen. Ich bin sicher, dass ich herausfinden konnte, wie dies zu umgehen, aber dann wird mein Code nicht wie sein Code aussehen; Das ist, was ich versuche zu lernen.

Randy

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top