Question

J'essaie de parcourir les aventures de programmation extrême de Ron Jeffries en C #. Je suis toutefois coincé au chapitre 3, car le code ne fonctionne pas et ne peut pas faire ce que l'auteur dit qu'il fait.

En gros, le texte indique que je devrais être capable d’écrire du texte dans une zone de texte activée pour le retour à la ligne. Si je déplace ensuite le curseur sur une ligne intermédiaire et appuie sur Entrée, le code doit afficher à nouveau les lignes précédant le curseur, ajouter quelques lignes et un ensemble de balises de paragraphe HTML, puis ajouter le reste des lignes. Le code ne correspond pas au texte car il utilise la propriété textbox.lines. Quel que soit le nombre de lignes recouvertes de mots dans une zone de texte, il n’ya qu’UNE ligne dans la propriété Lines jusqu’à ce que vous atteigniez un retour à la ligne. Ainsi, la déclaration selon laquelle le code doit: "Copier le reste des lignes dans la mémoire tampon" semble faux pour moi.

J'apprécierais que quiconque ayant une expérience avec le livre me dise ce que je lis ou ce que je fais est faux!

Merci.

EoRaptor

Était-ce utile?

La solution

Essayez d’envoyer un courriel à Ron Jeffries directement. J'ai le livre - quelque part, mais je ne me souviens pas qu'il ne fonctionne pas. Son adresse électronique est ronjeffries at acm dot org et place [Ron] dans la ligne d'objet.

(Et pour ceux qui s’interrogent - ses informations de courrier électronique se trouvent sur son site page de bienvenue .)

Autres conseils

Je viens également de commencer ce livre et je rencontre exactement le même problème, bien que le code que vous avez inclus semble plus avancé que celui où je suis. L '"indice en dehors de la plage" est apparu pour deux raisons. Tout d'abord, Ron a expliqué qu'il était en train de tester. Il a donc renvoyé une valeur codée en dur de 3 avant d'écrire la fonction CursorLine (). Cela signifie-t-il au moins 4? lignes de texte qui, comme vous le dites, doivent être collées, ou définissez le texte sur cette valeur avant de s'exécuter, ainsi que vous indiquez que les retours chariot sont nécessaires pour que txtbox.Lines retourne un tableau de chaînes. La deuxième raison se produit même après que CursorLine () ait été implémentée mais ne se produit que si la zone de texte est vide en tant que txtbox.Lines renvoie la chaîne [0] mais je pense que Ron implémente une 'User Story' qui dit que lorsque le texte a été entré et l’utilisateur appuie sur entrer, donc il ne sait pas s’il corrige cela plus tard, mais le découvrira probablement!

L’auteur déclare qu’il apprend le C # et qu’il montrera les verrues de développement, c’est une des raisons pour lesquelles j’ai choisi d’étudier ce livre, car j’estime que cela m’encourage à développer des projets. J'essaie également de faire le code d'abord avant de regarder ses solutions pour voir si je pense de la même façon, mais peut-être que je connais C # un peu mieux que je ne le pense moi-même, ou que je suis complètement nul, mais j'ai remarqué quelques petites choses, tout d’abord, il dit que surcharger OnKeyDown () ne fonctionne pas, mais je pense qu’il doit avoir été confus et essayé de le faire dans Form, au lieu de dériver de TextBox et d’y remplacer. C'était mon code lors de la lecture de la 'User Story':

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;

Cela fonctionne différemment du code de Ron, mais c’était juste mon interprétation de la 'User Story' et je ne savais pas comment réagir si du texte était sélectionné ou s'il fallait séparer la ligne si le curseur de texte était au milieu, etc.

Aussi dans 'Mes aventures' dans Extreme Programming Adventures en C #

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

obtient la position de la ligne du curseur et n'a pas d'importance si aucun retour chariot ni redimensionné, pour autant que je sache, j’ai fait un petit test avec:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

qui renvoie le nombre total de lignes, ce qui variera si vous redimensionnez la zone de texte.

Utilisation de C # Je recherche toujours des solutions qui existent déjà et les gens peuvent bien m'énerver pour cela, mais je pense que MS a créé un langage génial avec d’excellents composants qui font ce que vous attendez de vous, alors n’avez pas à recréer la roue à chaque fois. Bien que, comme je l'ai dit, ce livre en soit à ses débuts, ces solutions simples ne sont peut-être pas suffisamment extensibles et Ron en tient peut-être compte, bien qu'il ait mentionné que cela fonctionnait bien, puis que l'inquiétude à son sujet reviendrait davantage à la manière de XP.

Warren.

print("using System;

using System.Collections; using System.Collections.Generic; using System.Text;

espace de noms 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;
}

} } ");

La méthode InsertParagraphTags est appelée en appuyant sur la touche Entrée dans la zone de texte.

BTW, la rupture ici est qu’il ya une erreur d’indice en dehors de la plage si vous essayez d’appuyer sur entrée à la fin du texte. Je suis sûr que je pourrais trouver comment contourner cela, mais mon code ne ressemblera pas à son code. c'est ce que j'essaie d'apprendre.

Randy

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top