Pergunta

Eu estou tentando trabalhar o meu caminho através de Extrema de Ron Jeffries Programação Adventures in C #. Eu estou preso, no entanto, no capítulo 3, porque o código não faz, e não podem , faça o que o autor diz que faz.

Basicamente, o texto diz que eu deveria ser capaz de escrever algum texto em uma palavra-wrap caixa de texto habilitado. Se eu, em seguida, mova o cursor para uma linha intermediária e aperte enter, o código deve voltar a exibir as linhas antes do cursor, adicionar um par de linhas e um conjunto de tags de parágrafo HTML, em seguida, acrescentar o resto das linhas. O código não coincide com o texto porque ele usa a propriedade textbox.lines. Bem, não importa quantas linhas envolto palavra-existem em uma caixa de texto, há apenas uma linha na propriedade Lines até atingir um retorno de carro. Assim, a afirmação de que o código deve, "Copie o resto das linhas para o buffer" parece errado para mim.

Eu apreciaria qualquer um ter experiência com o livro me o que estou lendo ou fazendo errado dizer!

Graças.

Eoraptor

Foi útil?

Solução

Tente-mail Ron Jeffries diretamente. Eu tenho o livro - em algum lugar, mas eu não me lembro de não trabalhar. Seu endereço de email é ronjeffries em acm dot org e colocar [Ron] na linha de assunto.

(E para aqueles que querem saber - o seu mail estava certo de seu Web site página Bem-vindo )

Outras dicas

Eu também acabou de começar este livro e tinha exatamente o mesmo problema, embora o código de ter incluído aparência mais adiantada do que onde estou. O 'Índice fora do intervalo' ocorreu por 2 motivos, primeiro como Ron explica ele estava apenas testando e assim retornou um valor codificado hard-de 3 antes de escrever a função CursorLine (), o que significa que eu acho que, pelo menos, 4? linhas de texto que, como você diz necessidade de ser colado no, ou talvez definir o texto a este valor antes de executar, também como você diz que eles precisam ter retornos de carro para fazer txtbox.Lines retornar um array de strings. A segunda razão ocorre mesmo depois CursorLine () foi implementada, mas só acontece se a caixa de texto está vazia como corda txtbox.Lines retornos [0], mas eu acho que Ron está a implementar um 'User Story', que diz que quando o texto foi digitado e usuário pressiona entrar, então não tenho certeza se ele corrige isso mais tarde, mas provavelmente vai descobrir!

do autor fazer estado que eles estão aprendendo C # e irá mostrar da verruga desenvolvimento e tudo, que é uma das razões que eu escolhi para estudar este livro como eu acho que está me incentivando a desenvolver projetos. Eu também tento fazer o código primeiro antes de olhar para suas soluções para ver se eu estou pensando da mesma forma, mas talvez eu sei C # um pouco melhor do que eu me dou crédito por, ou eu sou uma porcaria completamente, mas eu tenho notado algumas coisas, primeiro ele diz que substituir OnKeyDown () não funciona, mas acho que ele deve ter se confundido e tentou fazer em formulário, em vez de derivar de TextBox e substituindo lá. Este foi o meu código ao ler o '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;

Ele funciona de forma diferente para o código de Ron, mas foi apenas a minha interpretação do 'User Story' e não sabe como deve agir se o texto for selecionado ou wether a linha de divisão se cursor de texto no meio etc.

Também em 'My Adventures' em eXtreme Programming Adventures in C #

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

obtém a posição do cursor em linha e não importa se há retornos de carro ou redimensionados, tanto quanto eu posso dizer, eu fiz pequeno teste com:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

que retorna a quantidade total de linhas, o que irá variar se você redimensionar a caixa de texto.

Usando C # Eu sempre procurar soluções que já exsist e as pessoas podem ardósia me para isso, mas eu acho que MS criaram uma grande linguagem com grandes componentes que fazem o que você espera que eles façam, por isso não tem que re-criar a roda de cada vez. Embora, como eu digo que é cedo neste livro e talvez estas soluções simples não são suficientes extensível e talvez tomada de Ron isso em conta, embora ele mencionou apenas fazê-lo funcionar depois se preocupar com isso mais tarde é mais a maneira XP.

Warren.

print("using System;

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

namespace NotepadOne {

classe pública 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;
}

} } ");

O método InsertParagraphTags é chamado pressionando a tecla Enter na caixa de texto.

BTW, a quebra aqui é que há um Índice fora do intervalo de erro se você tentar pressionar enter no final do texto. Tenho certeza de que eu pudesse descobrir como contornar isso, mas depois o meu código não será parecido com o seu código; que é o que eu estou tentando aprender.

Randy

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top