Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как создать нестандартную процедуру переноса слов для TEdit, TMemo

Delphi , Компоненты и Классы , TEdit

Как создать нестандартную процедуру переноса слов для TEdit, TMemo

Негр играет в шахматы с компьютером и получает мат на 15 ходу. В сердцах бьет по клавиатуре:
- Проклятый виндоуз, опять глючит.

В следующем примере создается процедура разбиения слов при переносах для TMemo. Заметьте, что реализованная процедура просто всегда разрешает перенос. Для дополнительной информации см.таже документацию к сообщению EM_SETWORDBREAKPROC.


var
  OriginalWordBreakProc: pointer;
  NewWordBreakProc: pointer;

function MyWordBreakProc(LPTSTR: pchar;
  ichCurrent: integer;
  cch: integer;
  code: integer): integer
{$IFDEF WIN32} stdcall;
{$ELSE}; export;
{$ENDIF}
begin
  result := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalWordBreakProc := Pointer(
    SendMessage(Memo1.Handle,
    EM_GETWORDBREAKPROC,
    0,
    0));
{$IFDEF WIN32}
  NewWordBreakProc := @MyWordBreakProc;
{$ELSE}
  NewWordBreakProc := MakeProcInstance(@MyWordBreakProc,
    hInstance);
{$ENDIF}
  SendMessage(Memo1.Handle,
    EM_SETWORDBREAKPROC,
    0,
    longint(NewWordBreakProc));

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SendMessage(Memo1.Handle,
    EM_SETWORDBREAKPROC,
    0,
    longint(@OriginalWordBreakProc));
{$IFNDEF WIN32}
  FreeProcInstance(NewWordBreakProc);
{$ENDIF}
end;

Код, который вы предоставили, создает нестандартную процедуру разбиения слов для контролов TEdit и TMemo в Delphi. Это позволяет вам переопределить стандартное поведение разбиения слов, которое используется при нажатии клавиши Enter или Shift+Enter при редактировании контрола.

В этом конкретном примере функция MyWordBreakProc всегда возвращает 0, что означает, что слово может быть разбито в любом месте. Это означает, что текст не будет переноситься на новую строку до тех пор, пока он не достигнет конца контрола.

Вот шаг за шагом, как код работает:

  1. Переменная OriginalWordBreakProc используется для хранения оригинальной процедуры разбиения слов для контрола.
  2. В событии FormCreate, переменная NewWordBreakProc устанавливается в указатель на функцию MyWordBreakProc. Это заменяет оригинальную процедуру разбиения слов.
  3. Когда пользователь нажимает Enter или Shift+Enter при редактировании контрола, функция MyWordBreakProc будет вызвана вместо оригинальной процедуры.
  4. В событии FormDestroy, оригинальная процедура разбиения слов восстанавливается, установив OriginalWordBreakProc в его исходное значение.

Функции MakeProcInstance и FreeProcInstance используются на не-Windows платформах (MacOS) для управления памятью custom-процедуры. На Windows эти функции не нужны, потому что компилятор может напрямую вызывать custom-процедуру.

Вот альтернативное решение, позволяющее вам указать custom-поведение разбиения слов:

  1. Создайте новую функцию, которая принимает два параметра: LPTSTR (указатель на null-terminated строку) и integer (текущее положение в тексте). Функция должна возвращать целочисленное значение, указывающее, может ли слово быть разбито в указанном месте.
  2. В событии OnCreate, вызовите сообщение EM_ GETWORDBREAKPROC, чтобы получить оригинальную процедуру разбиения слов для контрола.
  3. Храните оригинальную процедуру в переменной (например, OriginalWordBreakProc).
  4. Установите custom-процедуру как новую процедуру разбиения слов с помощью сообщения EM_ SETWORDBREAKPROC.
  5. В событии OnDestroy, восстановите оригинальную процедуру разбиения слов.

Вот пример, как можно реализовать это:

type
  TMyWordBreakProc = function(LPTSTR: pchar; ichCurrent: integer; cch: integer): integer; stdcall;

var
  OriginalWordBreakProc: TMyWordBreakProc;
  CustomWordBreakProc: TMyWordBreakProc;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalWordBreakProc := GetProcedureAddress(Edit1, 'WordBreakProc');
  CustomWordBreakProc := @MyCustomWordBreakProc;
  SendMessage(Edit1.Handle, EM_SETWORDBREAKPROC, 0, LongInt(CustomWordBreakProc));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SendMessage(Edit1.Handle, EM_ SETWORDBREAKPROC, 0, LongInt(OriginalWordBreakProc));
end;

function MyCustomWordBreakProc(LPTSTR: pchar; ichCurrent: integer; cch: integer): integer;
begin
  // Custom word breaking logic here
  if (ichCurrent mod 2) = 0 then
    Result := 1
  else
    Result := 0;
end;

В этом примере функция MyCustomWordBreakProc принимает три параметра и возвращает целочисленное значение, указывающее, может ли слово быть разбито в указанном месте. Функция проверяет, является ли текущее положение четным (mod 2), и если да, то позволяет слову быть разбиты.

Помните, что вам нужно заменить контрол Edit1 на ваш реальный TEdit или TMemo контрол.

В статье описывается, как создать нестандартную процедуру переноса слов для компонентов TEdit и TMemo в Delphi, позволяя пользователю определять правила разбиения текста при переносах.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TEdit ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:47:29/0.005389928817749/1