Domanda

Sto cercando di farmi strada attraverso le Extreme Programming Adventures di Ron Jeffries in C #. Sono bloccato, tuttavia, nel Capitolo 3 perché il codice non funziona e non è possibile fare ciò che l'autore dice di fare.

Fondamentalmente, il testo dice che dovrei essere in grado di scrivere del testo in una casella di testo abilitata a capo automatico. Se poi muovo il cursore su una riga intermedia e premo Invio, il codice dovrebbe visualizzare nuovamente le righe prima del cursore, aggiungere un paio di righe e un set di tag di paragrafo HTML, quindi aggiungere il resto delle righe. Il codice non corrisponde al testo perché utilizza la proprietà textbox.lines. Bene, indipendentemente da quante righe racchiuse in una casella di testo, c'è solo UNA riga nella proprietà Lines fino a quando non si raggiunge un ritorno a capo. Quindi, l'affermazione secondo cui il codice dovrebbe, " copiare il resto delle righe nel buffer " mi sembra sbagliato.

Gradirei chiunque avesse esperienza con il libro che mi dicesse cosa sto leggendo o facendo di sbagliato!

Grazie.

Eoraptor

È stato utile?

Soluzione

Prova a inviare un'e-mail a Ron Jeffries direttamente. Ho il libro - da qualche parte, ma non ricordo che non funzionasse. Il suo indirizzo e-mail è ronjeffries presso acm dot org e inserisce [Ron] nella riga dell'oggetto.

(E per quelli che si chiedono: le sue informazioni e-mail erano direttamente dal suo sito web Pagina di benvenuto )

Altri suggerimenti

Ho anche appena iniziato questo libro e ho avuto esattamente lo stesso problema, anche se il codice che hai incluso sembra più lontano di quello che sono. Il 'pedice fuori portata' si è verificato per 2 motivi, in primo luogo mentre Ron spiega che stava solo testando e quindi ha restituito un valore hardcoded di 3 prima di scrivere la funzione CursorLine (), il che significa che pensi almeno 4? righe di testo che, come dici tu, devono essere incollate, o magari impostare il testo su questo valore prima di essere eseguito, anche come dici che devono avere ritorni a capo per creare txtbox. Le linee restituiscono una matrice di stringhe. Il secondo motivo si verifica anche dopo l'implementazione di CursorLine () ma si verifica solo se la casella di testo è vuota come txtbox.Lines restituisce la stringa [0] ma penso che Ron stia implementando una "User Story" che dice che quando è stato inserito il testo e l'utente preme invio, quindi non è sicuro se lo risolverà in seguito, ma probabilmente lo scoprirà!

Gli autori affermano che stanno imparando C # e mostreranno la verruca di sviluppo e tutto il resto, che è uno dei motivi per cui ho scelto di studiare questo libro poiché penso che mi stia incoraggiando a sviluppare progetti. Provo anche a fare il codice prima di guardare le sue soluzioni per vedere se sto pensando allo stesso modo, ma forse conosco C # un po 'meglio di quanto mi dia credito, o sto completamente schifo, ma ho notato alcune cose, in primo luogo dice che l'override di OnKeyDown () non funziona, ma penso che debba essersi confuso e provato a fare in Form, invece di derivare da TextBox e sovrascrivere lì. Questo era il mio codice durante la lettura della "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;

Funziona diversamente dal codice di Ron, ma era solo la mia interpretazione della "User Story" e non sono sicuro di come agire se il testo è selezionato o se dividere la linea se il cursore di testo nel mezzo ecc.

Anche in "Le mie avventure" in Extreme Programming Adventures in C #

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

ottiene la posizione della linea del cursore e non importa se nessun carrello ritorna o ridimensionato, per quanto ne so, ho fatto pochi test con:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

che restituisce la quantità totale di righe, che varia se si ridimensiona la casella di testo.

Usando C # cerco sempre soluzioni che già esistono e le persone potrebbero pensarmi, ma penso che MS abbia creato un linguaggio eccezionale con componenti eccellenti che fanno ciò che ti aspetti che facciano, quindi non è necessario ricreare la ruota ogni volta. Anche se, come ho detto, sono i primi giorni di questo libro e forse queste semplici soluzioni non sono abbastanza estensibili e forse Ron lo sta prendendo in considerazione, anche se ha menzionato solo farlo funzionare, quindi preoccuparsi che in seguito sia più il modo XP.

Warren.

print("using System;

utilizzando System.Collections; utilizzando System.Collections.Generic; utilizzando System.Text;

namespace NotepadOne {

TextModel di classe pubblica {

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

} } & Quot;);

Il metodo InsertParagraphTags viene chiamato premendo il tasto Invio nella casella di testo.

A proposito, l'interruzione qui è che c'è un errore di sottoscrizione fuori intervallo se si tenta di premere invio alla fine del testo. Sono sicuro che potrei capire come aggirare questo, ma poi il mio codice non assomiglierà al suo codice; che è quello che sto cercando di imparare.

Randy

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top