8

を使用していSystem.Windows.Forms.TextBoxます。ドキュメントによると、プロパティは、ユーザーがテキストボックスに入力または貼り付けることができる文字の量を制御します(つまり、関数やプロパティMaxLengthを使用してプログラムで追加できる文字数よりも多くなります)。現在の文字数は、プロパティから取得できます。AppendTextTextTextLength

  1. Clear()カスタム制限に達したときに呼び出すカスタムリミッターを作成せずに、最大文字数を設定する方法はありますか?
  2. とにかく、それが保持できる絶対最大値はどれくらいですか?それは記憶によってのみ制限されますか?
  3. 最大値に達した/メモリがいっぱいになるとどうなりますか?クラッシュ?上のx行はクリアされますか?
  4. 上のx行だけを手動でクリアする最良の方法は何でしょうか?部分文字列操作?

編集:に関係なく、60万文字を超える文字を保持できるようにテストしましMaxLengthた。その時点で、プログラムを手動で停止し、この質問をしました。

4

3 に答える 3

12
  1. もちろん。オーバーライド/シャドウAppendTextおよびText派生クラス。以下のコードを参照してください。
  2. プロパティのバッキングフィールドTextは、単純な古い文字列(プライベートフィールドSystem.Windows.Forms.Control::text)です。したがって、最大長は文字列の最大長であり、「2 GB、つまり約10億文字」です(System.Stringを参照)。
  3. やってみてみませんか?
  4. パフォーマンス要件によって異なります。プロパティを使用することもできますが、Lines呼び出すたびに全体textが内部的に行に解析されることに注意してください。コンテンツの長さの制限を押し上げている場合、これは悪い考えです。そのため、(コーディングではなく実行の観点から)より高速な方法は、文字を圧縮してcr/lfsをカウントすることです。もちろん、行末を検討しているものを決定する必要があります。

コード:MaxLengthプログラムでテキストを設定する場合でもプロパティを適用します。

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication5 {
    class TextBoxExt : TextBox {
        new public void AppendText(string text) {
            if (this.Text.Length == this.MaxLength) {
                return;
            } else if (this.Text.Length + text.Length > this.MaxLength) {
                base.AppendText(text.Substring(0, (this.MaxLength - this.Text.Length)));
            } else {
                base.AppendText(text);
            }
        }

        public override string Text {
            get {
                return base.Text;
            }
            set {
                if (!string.IsNullOrEmpty(value) && value.Length > this.MaxLength) {
                    base.Text = value.Substring(0, this.MaxLength);
                } else {
                    base.Text = value;
                }
            }
        }

        // Also: Clearing top X lines with high performance
        public void ClearTopLines(int count) {
            if (count <= 0) {
                return;
            } else if (!this.Multiline) {
                this.Clear();
                return;
            }

            string txt = this.Text;
            int cursor = 0, ixOf = 0, brkLength = 0, brkCount = 0;

            while (brkCount < count) {
                ixOf = txt.IndexOfBreak(cursor, out brkLength);
                if (ixOf < 0) {
                    this.Clear();
                    return;
                }
                cursor = ixOf + brkLength;
                brkCount++;
            }
            this.Text = txt.Substring(cursor);
        }
    }

    public static class StringExt {
        public static int IndexOfBreak(this string str, out int length) {
            return IndexOfBreak(str, 0, out length);
        }

        public static int IndexOfBreak(this string str, int startIndex, out int length) {
            if (string.IsNullOrEmpty(str)) {
                length = 0;
                return -1; 
            }
            int ub = str.Length - 1;
            int intchr;
            if (startIndex > ub) {
                throw new ArgumentOutOfRangeException();
            }
            for (int i = startIndex; i <= ub; i++) {
                intchr = str[i];
                if (intchr == 0x0D) {
                    if (i < ub && str[i + 1] == 0x0A) {
                        length = 2;
                    } else {
                        length = 1;
                    }
                    return i;
                } else if (intchr == 0x0A) {
                    length = 1;
                    return i;
                }
            }
            length = 0;
            return -1;
        }
    }
}
于 2012-04-04T14:17:54.643 に答える
3

理論上の制限は、文字列の制限である〜2GBです。ただし、実際には、実行中のプロセスの条件によって異なります。これは、文字列がいつでも割り当てることができる、メモリの利用可能な最大の連続セクションのサイズに相当します。アプリケーションに約450MBでエラーが発生しているテキストボックスがあります。

于 2015-08-12T12:58:57.207 に答える
2

のTextプロパティSystem.Windows.Forms.TextBoxは文字列であるため、理論的には文字列の最大長にすることができます

于 2012-04-04T13:11:48.697 に答える