سؤال

أحاول شق طريقي من خلال مغامرات البرمجة المتطرفة لرون جيفريز في لغة C#.ومع ذلك، فأنا عالق في الفصل الثالث لأن الكود لا يفعل ذلك، و لا تستطيع, ، افعل ما يقول المؤلف أنه يفعله.

في الأساس، ينص النص على أنني يجب أن أكون قادرًا على كتابة بعض النص في مربع نص مُمكّن لالتفاف الكلمات.إذا قمت بعد ذلك بتحريك المؤشر إلى سطر متوسط ​​وضغطت على زر الإدخال، فيجب أن يعيد الكود عرض السطور قبل المؤشر، وإضافة سطرين ومجموعة من علامات فقرات HTML، ثم إلحاق بقية الأسطر.الكود لا يطابق النص لأنه يستخدم خاصية textbox.lines.حسنًا، بغض النظر عن عدد الأسطر الملتفة بالكلمات الموجودة في مربع النص، يوجد سطر واحد فقط في خاصية الأسطر حتى تصل إلى حرف العودة.لذا، فإن العبارة التي تقول بأن الكود يجب أن يكون "انسخ بقية الأسطر إلى المخزن المؤقت" تبدو خاطئة بالنسبة لي.

سأكون ممتنًا لأي شخص لديه خبرة في الكتاب ويخبرني بما أقرأه أو أفعله بشكل خاطئ!

شكرًا.

يورابتور

هل كانت مفيدة؟

المحلول

حاول إرسال بريد إلكتروني إلى رون جيفريز مباشرة.لدي الكتاب - في مكان ما، ولكن لا أتذكر أنه لا يعمل.عنوان بريده الإلكتروني هو ronjeffries at acm dot org ووضع [Ron] في سطر الموضوع.

(ولأولئك الذين يتساءلون - كانت معلومات بريده الإلكتروني صحيحة من موقعه على الإنترنت صفحة الترحيب)

نصائح أخرى

لقد بدأت للتو هذا الكتاب وواجهت نفس المشكلة تمامًا على الرغم من أن الكود الذي قمت بتضمينه يبدو أبعد من المكان الذي أنا فيه.حدث "المنخفض خارج النطاق" لسببين، أولاً كما أوضح رون أنه كان يختبر للتو ولذلك أعاد قيمة مشفرة 3 قبل أن يكتب وظيفة CursorLine()، مما يعني أنك أعتقد أن 4 على الأقل؟أسطر النص التي كما تقول تحتاج إلى لصقها، أو ربما تعيين النص على هذه القيمة قبل التشغيل، كما تقول أيضًا أنها تحتاج إلى أحرف إرجاع لجعل txtbox.Lines ترجع مجموعة من السلاسل.يحدث السبب الثاني حتى بعد تنفيذ CursorLine() ولكنه يحدث فقط إذا كان مربع النص فارغًا حيث تقوم txtbox.Lines بإرجاع سلسلة [0] ولكن أعتقد أن رون يقوم بتنفيذ "قصة المستخدم" التي تشير إلى أنه عندما يتم إدخال النص و يضغط المستخدم على زر الإدخال، لذا لست متأكدًا مما إذا كان قد أصلح هذه المشكلة لاحقًا، ولكن من المحتمل أن يكتشف ذلك!

يذكر المؤلف أنهم يتعلمون 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;

إنه يعمل بشكل مختلف عن كود رون، ولكنه كان مجرد تفسيري لـ "قصة المستخدم" ولست متأكدًا من كيفية التصرف إذا تم تحديد النص أو إذا تم تقسيم الخط إذا كان مؤشر النص في المنتصف وما إلى ذلك.

أيضًا في "مغامراتي" في مغامرات البرمجة المتطرفة في C#

txtbox.GetLineFromCharIndex(txtbox.SelectionStart)

يحصل على موضع خط المؤشر ولا يهم إذا لم ترد أي عربة أو تغيير حجمها ، بقدر ما أستطيع أن أقول ، لقد أجريت اختبارًا كبيرًا مع:

txtbox.GetLineFromCharIndex(txtbox.TextLength)

والذي يُرجع إجمالي عدد الأسطر، والذي سيختلف إذا قمت بتغيير حجم مربع النص.

باستخدام C#، أبحث دائمًا عن الحلول الموجودة بالفعل وقد ينتقدني الأشخاص لذلك، ولكن أعتقد أن MS قد أنشأ لغة رائعة بمكونات رائعة تفعل ما تتوقع منهم أن يفعلوه، لذلك لا يتعين عليك إعادة إنشاء العجلة كل مرة وقت.على الرغم من أنني أقول إن هذه الأيام الأولى في هذا الكتاب وربما لا تكون هذه الحلول البسيطة قابلة للتوسيع بدرجة كافية وربما يأخذ رون ذلك في الاعتبار، على الرغم من أنه ذكر أن مجرد تشغيله ثم القلق بشأن ذلك لاحقًا هو طريقة XP.

وارن.

print("using System;

باستخدام System.Collections؛باستخدام System.Collections.Generic؛باستخدام System.Text؛

مساحة الاسم NotepadOne {

نموذج نص الطبقة العامة {

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 بالضغط على مفتاح الإدخال في مربع النص.

راجع للشغل، والفاصل هنا هو أن هناك خطأ منخفض خارج النطاق إذا حاولت الضغط على زر الإدخال في نهاية النص.أنا متأكد من أنني أستطيع معرفة كيفية التغلب على هذا ولكن بعد ذلك لن يبدو الكود الخاص بي مثل الكود الخاص به؛وهو ما أحاول أن أتعلمه.

راندي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top