문제

나는 C#의 Ron Jeffries의 극단적 인 프로그래밍 모험을 통해 내 길을 가고 있습니다. 그러나 코드는 그렇지 않기 때문에 3 장에 갇혀 있습니다. 할 수 없습니다, 저자가하는 일을하십시오.

기본적으로 텍스트는 단어 랩 활성화 텍스트 상자에 텍스트를 쓸 수 있어야한다고 말합니다. 그런 다음 커서를 중간 줄로 이동하고 Enter를 누르면 코드가 커서 앞에 선을 다시 선포하고 몇 줄과 HTML 단락 태그 세트를 추가 한 다음 나머지 라인을 추가해야합니다. 텍스트 상자를 사용하기 때문에 코드는 텍스트와 일치하지 않습니다. 글쎄, 텍스트 상자에 몇 개의 단어로 랩핑 된 줄이 있더라도, 캐리지 리턴에 부딪 칠 때까지 라인 속성에 한 줄만 있습니다. 따라서 코드가 "나머지 줄을 버퍼에 복사"해야한다는 진술은 나에게 잘못된 것 같습니다.

책에 경험이있는 사람이 내가 읽고 있거나 무엇을 잘못하고 있는지 말해 주셔서 감사합니다!

감사.

EORAPTOR

도움이 되었습니까?

해결책

Ron Jeffries에게 직접 이메일을 보내십시오. 나는 책이 있습니다 - 어딘가에 있지만 작동하지 않는 것을 기억하지 못합니다. 그의 이메일 주소는 Acm dot org의 Ronjeffries이며 [Ron]을 제목 줄에 넣습니다.

(그리고 궁금한 사람들을 위해 - 그의 이메일 정보는 그의 웹 사이트에서 바로였습니다. 환영 페이지)

다른 팁

나는 또한이 책을 시작했고 포함 된 코드가 내가있는 곳보다 더 멀리 보이지만 정확히 같은 문제를 겪었습니다. Ron이 먼저 테스트 중이라고 설명 하듯이 '범위의 첨자 구역'은 두 가지 이유로 발생했으며, Cursorline () 함수를 작성하기 전에 3의 하드 코딩 된 값을 반환했습니다. 이는 적어도 4라고 생각합니까? 당신이 말하는대로, 실행하기 전에 텍스트를이 값으로 설정 해야하는 텍스트 라인, 또한 txtbox를 만들기 위해 캐리지 리턴이 필요하다고 말하면 문자열 배열을 반환합니다. 두 번째 이유는 Cursorline ()가 구현 된 후에도 발생하지만 텍스트 상자가 txtbox가 비어있는 경우에만 발생합니다. lines liness string [0] 그러나 Ron이 텍스트를 입력하고 입력했을 때 '사용자 스토리'를 구현하고 있다고 생각합니다. 사용자 누름이 입력하므로 나중에이 문제를 해결하는지 확실하지 않지만 아마 알게 될 것입니다!

저자는 그들이 C#을 배우고 있으며 개발 사마귀와 모든 것을 보여줄 것이라고 말합니다. 이것이 제가이 책을 연구하기로 선택한 이유 중 하나입니다. 나는 또한 그의 솔루션을 살펴보기 전에 코드를 먼저하려고 노력하지만 같은 방식으로 생각하는지 확인하지만 C#이 자신에게 신용을 주거나 완전한 쓰레기보다 조금 더 잘 알고 있을지도 모릅니다. 몇 가지 사항을 알아 차렸다. 먼저 그는 OnkeyDown ()을 우선하는 것이 효과가 없다고 말하지만, TextBox에서 파생하고 그곳에서 우선하는 대신 혼란스러워하고 형태로 시도 했어야한다고 생각한다. 이것은 '사용자 스토리'를 읽을 때 내 코드였습니다.

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#의 Extreme Programming Adventures의 'My Adventures'에서

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

커서 라인 위치를 가져오고 캐리지가 반환되거나 크기가 크지 않은 경우에는 중요하지 않습니다.

txtbox.GetLineFromCharIndex(txtbox.TextLength)

텍스트 상자를 크기를 조정하면 총 라인의 양을 반환합니다.

C# 사용 C# 나는 항상 이미 엑시 스트리즘을 찾는 솔루션을 찾고 사람들은 이것을 위해 나를 슬레이트 할 수 있지만 MS는 당신이 기대하는 일을하는 훌륭한 구성 요소로 훌륭한 언어를 만들었으므로 각각 바퀴를 다시 만들 필요가 없습니다. 시각. 내가이 책의 초기에 말한 것처럼, 아마도이 간단한 솔루션은 충분히 확장 가능하지 않으며 Ron이 그것을 고려하고 있을지도 모른다.

야생 조수 사육 특권.

print("using System;

시스템 사용; System.collections.generic 사용; system.text 사용;

네임 스페이스 메모장 {

공개 클래스 텍스트 모드 {

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 키를 눌러 호출됩니다.

BTW, 여기서 브레이크는 텍스트 끝에서 Enter를 누르려고 할 때 범위에 오류가 발생하지 않는다는 것입니다. 나는 이것을 돌아 다니는 방법을 알아낼 수 있다고 확신하지만 내 코드는 그의 코드처럼 보이지 않습니다. 그것이 내가 배우려고하는 것입니다.

랜디

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top