0

Ron Jeffries の C# でのエクストリーム プログラミング アドベンチャーに取り組んでいます。しかし、私は第 3 章で立ち往生しています。なぜなら、このコードは、作者が言っていることを実行せず、実行できないからです。

基本的に、テキストは、ワードラップが有効なテキスト ボックスにテキストを書き込めるはずだと言っています。次に、カーソルを中間行に移動して Enter キーを押すと、コードはカーソルの前の行を再表示し、いくつかの行と一連の HTML 段落タグを追加してから、残りの行を追加する必要があります。textbox.lines プロパティを使用しているため、コードはテキストと一致しません。テキスト ボックスにワードラップされた行がいくつあっても、キャリッジ リターンを押すまで、Lines プロパティには 1 行しかありません。したがって、コードが「残りの行をバッファにコピーする」というステートメントは、私には間違っているように見えます。

この本を読んだ経験のある人なら、私が何を読んでいるのか、何をしているのか、間違っていることを教えてくれるとありがたいです!

ありがとう。

エオラプトル

4

3 に答える 3

1

私もこの本を始めたばかりで、まったく同じ問題を抱えていましたが、あなたが含めたコードは私がいる場所よりも先に見えます. 「範囲外の添字」は 2 つの理由で発生しました。最初に Ron が説明したように、彼はちょうどテストしていたので、CursorLine() 関数を書く前にハードコードされた値 3 を返しました。つまり、少なくとも 4 だと思いますか? あなたが言うように、テキストを貼り付ける必要があるか、実行する前にテキストをこの値に設定する必要があるテキスト行。2 番目の理由は、CursorLine() が実装された後でも発生しますが、txtbox.Lines が string[0] を返すため、テキスト ボックスが空の場合にのみ発生しますが、Ron は、テキストが入力されたときにそれを示す「ユーザー ストーリー」を実装していると思います。ユーザーがEnterキーを押し、

著者は、C# を学習中であり、開発の疣贅をすべて表示すると述べています。これが、プロジェクトを開発する励みになると思うので、この本を研究することを選択した理由の 1 つです。私も彼の解決策を見る前に最初にコードを実行しようとしますが、おそらく私は自分の功績を認めるよりもC#を少しよく知っているか、完全にがらくたですが、私は最初に、彼は OnKeyDown() のオーバーライドは機能しないと言っていますが、TextBox から派生してそこでオーバーライドするのではなく、混乱して Form で実行しようとしたに違いないと思います。「ユーザーストーリー」を読んだときの私のコードは次のとおりです。

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;

Ron のコードとは動作が異なりますが、「ユーザー ストーリー」の私の解釈であり、テキストが選択された場合にどのように動作するか、またはテキスト カーソルが中央にある場合に行を分割するかどうかなどはわかりません。

C# でのエクストリーム プログラミング アドベンチャーの「マイ アドベンチャー」にもあります。

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

カーソル行の位置を取得し、改行やサイズ変更がないかどうかは関係ありません。私が知る限り、次のテストをほとんど行いませんでした。

txtbox.GetLineFromCharIndex(txtbox.TextLength)

これは、行の合計数を返します。これは、テキスト ボックスのサイズを変更すると変化します。

C# を使用して、私は常に既存の解決策を探しており、人々は私にこれを提案するかもしれませんが、MS は、あなたが期待することを実行する優れたコンポーネントを備えた優れた言語を作成したと思います。そのため、毎回ホイールを再作成する必要はありません。時間。私が言ったように、それはこの本の初期であり、おそらくこれらの単純なソリューションは十分に拡張可能ではなく、おそらくロンはそれを考慮に入れています.

ウォーレン。

于 2009-11-30T12:38:03.760 に答える
1

Ron Jeffries に直接メールしてみてください。私は本を​​どこかに持っていますが、それが機能しなかったことを覚えていません。彼の電子メール アドレスは acm dot org の ronjeffries で、件名に [Ron] を入力してください。

(そして疑問に思っている人のために - 彼の電子メール情報は彼のウェブサイトのウェルカム ページからのものでした)

于 2008-11-21T22:02:56.203 に答える
0
print("using System;

System.Collections を使用します。System.Collections.Generic の使用; System.Text を使用します。

名前空間のメモ帳 {

パブリッククラス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;
}

} } ");

InsertParagraphTags メソッドは、テキスト ボックスで Enter キーを押すことによって呼び出されます。

ところで、ここでのブレークは、テキストの最後で Enter キーを押そうとすると、添字が範囲外のエラーになることです。これを回避する方法を理解できると確信していますが、私のコードは彼のコードのようには見えません。それが私が学ぼうとしているものです。

ランディ

于 2008-11-21T22:05:11.643 に答える