2008-11-21 10 views
0

J'essaie de me frayer un chemin à travers Extreme Programming Adventures de Ron Jeffries en C#. Je suis coincé, cependant, dans le chapitre 3 parce que le code ne fonctionne pas, et ne peut pas, faire ce que l'auteur dit qu'il fait. Fondamentalement, le texte dit que je devrais être en mesure d'écrire du texte dans une boîte de texte activée par l'habillage de mots. Si je déplace ensuite le curseur sur une ligne intermédiaire et que j'appuie sur Entrée, le code devrait réafficher les lignes avant 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. Eh bien, peu importe le nombre de lignes terminées par un mot dans une zone de texte, il n'y a qu'une ligne dans la propriété Lines jusqu'à ce que vous atteigniez un retour chariot. Ainsi, l'affirmation que le code devrait "Copier le reste des lignes dans le tampon" me semble erronée.Errata dans Extreme Programming Adventures en C#?

J'apprécierais que quelqu'un ayant de l'expérience avec le livre me dise ce que je lis ou fais, mal!

Merci.

Eoraptor

Répondre

1

Essayez emailing Ron Jeffries directement. J'ai le livre - quelque part, mais je ne me souviens pas que ça ne marche pas. Son adresse e-mail est ronjeffries sur acm dot org et met [Ron] dans la ligne d'objet.

(Et pour ceux qui se demandent - son courriel à info avait raison de son site Welcome page)

+0

Merci. J'ai pensé à cela, mais je voulais m'assurer que je n'allais pas paraître plus stupide que je ne le suis avant de contacter l'auteur! ;-) – EoRaptor013

0
print("using System; 

using System.Collections; en utilisant System.Collections.Generic; en utilisant 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é en appuyant sur la touche Entrée dans la zone de texte

.

BTW, la coupure ici est qu'il y a un indice en dehors de l'erreur de plage si vous essayez de frapper entrer à t 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

1

Je viens juste de commencer ce livre et avait exactement le même problème, bien que le code que vous avez inclus des regards plus loin que là où je suis. Le 'indice hors de portée' est survenu pour 2 raisons, d'abord parce que Ron explique qu'il ne faisait que tester et qu'il a retourné une valeur codée en dur de 3 avant d'écrire la fonction CursorLine(), ce qui signifie au moins 4? Des lignes de texte qui, comme vous le dites, doivent être collées, ou peut-être définir le texte à cette valeur avant de s'exécuter, comme vous le dites, elles doivent avoir des retours chariot pour que txtbox.Lines renvoie un tableau de chaînes. La deuxième raison se produit même après que CursorLine() a été implémentée mais seulement si la zone de texte est vide comme txtbox.Lines renvoie la chaîne [0] mais je pense que Ron est en train d'implémenter une 'User Story' et l'utilisateur appuie sur entrer, donc pas sûr s'il corrige cela plus tard, mais le découvrira probablement!Les auteurs affirment qu'ils apprennent le C# et montreront le développement de la verrue et tout ce qui est l'une des raisons pour lesquelles j'ai choisi d'étudier ce livre car je pense qu'il m'encourage à développer des projets. J'essaie d'abord de faire le code avant de regarder ses solutions pour voir si je pense de la même façon, mais peut-être que je connais un peu mieux C# que moi, ou je suis complètement merdique, mais j'ai J'ai remarqué quelques choses, d'abord il dit que surcharger OnKeyDown() ne fonctionne pas, mais je pense qu'il a dû être confus et a essayé de le faire dans Form, au lieu de dériver de TextBox et de surcharger là. Ce fut mon code lors de la lecture du « 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; 

Il fonctionne différemment au code de Ron, mais était juste mon interprétation de la « User Story » et ne savez pas comment doit agir si le texte est sélectionné ou wether à la ligne fendue si le curseur de texte au milieu, etc.

également dans 'My Adventures' Extreme Programming Adventures in C#

txtbox.GetLineFromCharIndex(txtbox.SelectionStart) 

obtient la position de ligne du curseur et n'a pas d'importance si aucun retour chariot ou redimensionnées , pour autant que je peux dire, je fait petit test avec:

txtbox.GetLineFromCharIndex(txtbox.TextLength) 

qui retourne le montant total des lignes, qui varient si vous redimensionnez la zone de texte. En utilisant C#, je recherche toujours des solutions qui existent déjà et que les gens peuvent me proposer, mais je pense que MS a créé un langage génial avec de superbes composants qui font ce que vous attendez d'eux, donc pas besoin de créer la roue à chaque fois. Bien que je dise que ce soit les premiers jours de ce livre et peut-être que ces solutions simples ne sont pas assez extensibles et peut-être que Ron en tienne compte.

Warren.

Questions connexes