Как создать нестандартную процедуру переноса слов для TEdit, TMemo
Негр играет в шахматы с компьютером и получает мат на 15 ходу. В сердцах бьет по клавиатуре:
- Проклятый виндоуз, опять глючит.
В следующем примере создается процедура разбиения слов при переносах для TMemo. Заметьте, что
реализованная процедура просто всегда разрешает перенос. Для дополнительной информации см.таже
документацию к сообщению EM_SETWORDBREAKPROC.
Код, который вы предоставили, создает нестандартную процедуру разбиения слов для контролов TEdit и TMemo в Delphi. Это позволяет вам переопределить стандартное поведение разбиения слов, которое используется при нажатии клавиши Enter или Shift+Enter при редактировании контрола.
В этом конкретном примере функция MyWordBreakProc всегда возвращает 0, что означает, что слово может быть разбито в любом месте. Это означает, что текст не будет переноситься на новую строку до тех пор, пока он не достигнет конца контрола.
Вот шаг за шагом, как код работает:
Переменная OriginalWordBreakProc используется для хранения оригинальной процедуры разбиения слов для контрола.
В событии FormCreate, переменная NewWordBreakProc устанавливается в указатель на функцию MyWordBreakProc. Это заменяет оригинальную процедуру разбиения слов.
Когда пользователь нажимает Enter или Shift+Enter при редактировании контрола, функция MyWordBreakProc будет вызвана вместо оригинальной процедуры.
В событии FormDestroy, оригинальная процедура разбиения слов восстанавливается, установив OriginalWordBreakProc в его исходное значение.
Функции MakeProcInstance и FreeProcInstance используются на не-Windows платформах (MacOS) для управления памятью custom-процедуры. На Windows эти функции не нужны, потому что компилятор может напрямую вызывать custom-процедуру.
Вот альтернативное решение, позволяющее вам указать custom-поведение разбиения слов:
Создайте новую функцию, которая принимает два параметра: LPTSTR (указатель на null-terminated строку) и integer (текущее положение в тексте). Функция должна возвращать целочисленное значение, указывающее, может ли слово быть разбито в указанном месте.
В событии OnCreate, вызовите сообщение EM_ GETWORDBREAKPROC, чтобы получить оригинальную процедуру разбиения слов для контрола.
Храните оригинальную процедуру в переменной (например, OriginalWordBreakProc).
Установите custom-процедуру как новую процедуру разбиения слов с помощью сообщения EM_ SETWORDBREAKPROC.
В событии OnDestroy, восстановите оригинальную процедуру разбиения слов.
Вот пример, как можно реализовать это:
typeTMyWordBreakProc=function(LPTSTR:pchar;ichCurrent:integer;cch:integer):integer;stdcall;varOriginalWordBreakProc:TMyWordBreakProc;CustomWordBreakProc:TMyWordBreakProc;procedureTForm1.FormCreate(Sender:TObject);beginOriginalWordBreakProc:=GetProcedureAddress(Edit1,'WordBreakProc');CustomWordBreakProc:=@MyCustomWordBreakProc;SendMessage(Edit1.Handle,EM_SETWORDBREAKPROC,0,LongInt(CustomWordBreakProc));end;procedureTForm1.FormDestroy(Sender:TObject);beginSendMessage(Edit1.Handle,EM_SETWORDBREAKPROC,0,LongInt(OriginalWordBreakProc));end;functionMyCustomWordBreakProc(LPTSTR:pchar;ichCurrent:integer;cch:integer):integer;begin// Custom word breaking logic hereif(ichCurrentmod2)=0thenResult:=1elseResult:=0;end;
В этом примере функция MyCustomWordBreakProc принимает три параметра и возвращает целочисленное значение, указывающее, может ли слово быть разбито в указанном месте. Функция проверяет, является ли текущее положение четным (mod 2), и если да, то позволяет слову быть разбиты.
Помните, что вам нужно заменить контрол Edit1 на ваш реальный TEdit или TMemo контрол.
В статье описывается, как создать нестандартную процедуру переноса слов для компонентов TEdit и TMemo в Delphi, позволяя пользователю определять правила разбиения текста при переносах.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.