Этот вопрос, вероятно, заставит меня звучать довольно бестолково. Это потому, что я есть.
Я просто думаю, если бы я гипотетически интересовался разработкой собственного элемента управления графическим интерфейсом, виджетом или как вы хотите его называть (а я нет), как бы я вообще это сделал?
Искушение для новичка, такого как я, состояло бы в том, чтобы хранить содержимое текстового редактора в форме строки, что кажется довольно дорогостоящим (не то, чтобы я слишком хорошо знал, как реализации строк различаются для одного языка / платформы и следующее, но я знаю, что в .NET, например, они неизменяемы, поэтому частые манипуляции, такие как то, что вам нужно поддерживать в текстовом редакторе, были бы невероятно расточительными, создавая один экземпляр строки за другим очень быстро последовательность).
Предположительно, вместо этого используется некоторая изменяемая структура данных, содержащая текст; но выяснение того, как эта структура может выглядеть, кажется мне немного сложной задачей. Произвольный доступ был бы хорош (в любом случае я бы подумал - в конце концов, разве вы не хотите, чтобы пользователь мог прыгать где-нибудь в тексте?), Но потом меня интересует стоимость Скажем, перейдя куда-то посередине огромного документа и сразу начав печатать. Опять же, новичок (скажем, вы сохраняете текст в виде массива символов с изменяемым размером) может привести к очень низкой производительности, я думаю, так как с каждым символом, набранным пользователем, будет огромный объем данных для «смещения» более.
Так что, если бы мне пришлось угадывать, я бы предположил, что текстовые редакторы используют какую-то структуру, которая разбивает текст на более мелкие части (линии, может быть?), Которые по отдельности включают массивы символов со случайным доступом, и которые сами по себе случайным образом доступны в виде дискретных кусков. Даже кажется, что должно быть довольно чудовищным упрощением, хотя, если оно хотя бы отдаленно близко, с самого начала.
Конечно, я также понимаю, что не может быть"стандартным" способом реализации текстовых редакторов; может быть, это резко меняется от одного редактора к другому. Но я подумала, что, поскольку эта проблема явно решалась много, много раз, возможно, с годами возник относительно распространенный подход.
В любом случае, мне просто интересно узнать, есть ли у кого-нибудь знания по этой теме. Как я уже сказал, я определенно не собираюсь писать свой собственный текстовый редактор; Мне просто любопытно.