Delphi памятка, почему курсор всегда движется влево

В моем проекте VCL у меня есть TMemo со следующим текстом (| это карета):

| |  
Привет, мир | |  
| |  
| тест |  
| |  
| |    

Когда я нажимаю кнопку " Вниз", каретка перемещается сюда:

| |  
Привет, мир |  
|| |  
| тест |
| |  
| |  

Мне нужно, чтобы он переехал сюда:

| |  
Привет, мир |  
| | |   
| тест |  
| |  
| | 

2 ответа

Решение

Я думаю, что вы найдете поучительным, чтобы разработать собственное решение для этого. Поведение по умолчанию для TMemo Ответ на клавишу " Вниз" зависит от количества символов на следующей строке. Если на следующей строке будет как минимум столько же, сколько на текущей строке, каретка останется в том же номере столбца.

Таким образом, простое решение может быть

  • Когда вы обнаружите OnKeyDown событие, вызванное клавишей " Вниз", проверьте количество символов в следующей строке, и, если оно меньше, чем количество символов в текущей строке слева от каретки, добавьте правую строку ниже с пробелами до номеров символы равны. Внешний вид на экране будет точно поддерживать положение столбца, только если в заметке используется шрифт с фиксированной точкой; с пропорциональным шрифтом курсор все еще будет немного "покачиваться" влево и вправо, потому что пробелы уже, чем у большинства других символов.

  • Конечно, вам нужно сделать это и для клавиши "Вверх", и вам решать, будете ли вы делать то же самое для щелчков мышью.

Немного прибегнув к поиску, вы можете легко найти код Delphi для определения текущей строки и номера столбца каретки в TMemo,

TMemo в Delphi просто оборачивает внутренний контроль внутри самой Windows, которая изначально не поддерживает такую ​​функциональность, которая вам нужна. Может быть возможно изменить его поведение таким образом, но проще использовать то, что уже разработано для этого. Одним из наиболее популярных элементов управления, который может сделать это, является SynEdit, предназначенный для редакторов кода и подсветки синтаксиса. Это может сделать гораздо больше, чем вам нужно, но это решает то, что вы ищете.

Другие вопросы по тегам