Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 85 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2022, 22:53   #11
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,381
По умолчанию

Скорее всего вы просто не понимаете смысла обработчика OnEditing. Если в него передается переменная CanEdit, тогда значит ввод данных еще не выполнен. Т.е. оно вызывается до ввода информации от пользователя в компонент, но после попытки пользователем изменить значение в компоненте. Хотя эти изменения уже где-то вам доступны (скорее всего поле text уже содержит пользовательский ввод), но при возврате CanEdit := False оно восстанавливается в значение до внесения изменений.

Подобное поведение компонента и события позволит в обработчике OnEditing проверить корректность ввода и дать ответ в виде значения в CanEdit.
macomics на форуме Ответить с цитированием
Старый 01.10.2022, 20:17   #12
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

2 macomics, мне приснилась эта ветка форума и вы мне в ней что-то расписали ещё подробнее.

Не понимаю что делает
Код:
copy(t, Low(t), s)
и
Код:
copy(t, s + l)
Когда задача начинает сниться - это что-то уже из разряда того, что надо от неё отдохнуть по-моему.
hexor_boo вне форума Ответить с цитированием
Старый 01.10.2022, 20:45   #13
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,381
По умолчанию

Цитата:
Сообщение от hexor_boo Посмотреть сообщение
Код:
copy(t, Low(t), s)
Копирует подстроку из строки t начиная с начала строки и длиной s символов. Возможно я опять не учел начало индексации с 1 и она должна выглядеть вот так.
Код:
copy(t, Low(t), s - Low(t))

x = Low(t)
abracadabra<pattern>testtesttest<pattern>abracadabra2
^++++++++++^
x          s

copy('abracadabra<pattern>testtesttest<pattern>abracadabra2', x, s) = 'abracadabra'

Цитата:
Сообщение от hexor_boo Посмотреть сообщение
Код:
copy(t, s + l)
Копирует подстроку из строки t начиная с индекса s + l и до конца строки. Учитывая то, что с индекса s начинается подстрока шаблон, а длина шаблона l, тогда это скопирует подстроку из строки t сразу за шаблоном.
Код:
abracadabra<pattern>testtesttest<pattern>abracadabra2
           ^++++++++^
           s        l

copy('abracadabra<pattern>testtesttest<pattern>abracadabra2', s + l) = 'testtesttest<pattern>abracadabra2'

Последний раз редактировалось macomics; 01.10.2022 в 20:50.
macomics на форуме Ответить с цитированием
Старый 05.10.2022, 20:57   #14
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

2 macomics, написал вам в личку по поводу этой задачи.
hexor_boo вне форума Ответить с цитированием
Старый 06.10.2022, 14:53   #15
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

2 macomics, я не понял все равно (в целом) вашу тестовую функцию srplc. Но похоже понял, в чем причина без тестов: на нажатие Ctrl+V сначала проскакивает сообщение WM_PASTE, которое вставляет текст из буфера как есть (с CRLF), а потом проходит "менее аппаратная" процедура вставки с помощью Clipboard, в которой все уже обработано как надо и вместо CRLF идет выбранный разделитель.

Так вот вопрос: Как поймать и обнулить дейтвие WM_PASTE и сразу в функции, обнуляющей его действие сделать вставку с использованием Clipboard?

Последний раз редактировалось hexor_boo; 06.10.2022 в 14:58. Причина: Исправление опечаток
hexor_boo вне форума Ответить с цитированием
Старый 06.10.2022, 15:03   #16
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,381
По умолчанию

Перехват сообщения WM_PASTE у конкретного окна.
Код:
var
   PrevMsgProc: function (hWnd: THandle; uMsg: Integer; wPar: TWPARAM; lPar: TLPARAM):TLRESULT; stdcall;

function FilterWMPASTE(hWnd: THandle; uMsg: Integer; wPar: TWPARAM; lPar: TLPARAM):TLRESULT; stdcall;
begin
  Result := 0;
  if Msg <> WM_PASTE then Result := PrevMsgProc(hWnd, uMsg, wPar, lPar);
end;

procedure InterceptWMPASTE(hWnd: THandle);
begin
  PrevMsgProc := Pointer(SetWindowLong(hWnd, GWL_WNDPROC, Cardinal(@FilterWMPASTE)));
end;
Набирал в браузере. За опечатки не серчайте.
macomics на форуме Ответить с цитированием
Старый 06.10.2022, 15:30   #17
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

Выяснил. Тестом. В этот компонент при Ctrl+V похоже не передается WM_PASTE

Последний раз редактировалось hexor_boo; 06.10.2022 в 15:34.
hexor_boo вне форума Ответить с цитированием
Старый 06.10.2022, 15:36   #18
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Перехват сообщения WM_PASTE у конкретного окна.
Код:
var
   PrevMsgProc: function (hWnd: THandle; uMsg: Integer; wPar: TWPARAM; lPar: TLPARAM):TLRESULT; stdcall;

function FilterWMPASTE(hWnd: THandle; uMsg: Integer; wPar: TWPARAM; lPar: TLPARAM):TLRESULT; stdcall;
begin
  Result := 0;
  if Msg <> WM_PASTE then Result := PrevMsgProc(hWnd, uMsg, wPar, lPar);
end;

procedure InterceptWMPASTE(hWnd: THandle);
begin
  PrevMsgProc := Pointer(SetWindowLong(hWnd, GWL_WNDPROC, Cardinal(@FilterWMPASTE)));
end;
Набирал в браузере. За опечатки не серчайте.
Благодарю!

Не понимаю:
1) Как связать этот код с конкретным окном (точнее какую из фунцкций связать с отдельным окном, через передачу его hWnd в неё)
2) В каком месте кода можно переопределить действие сообщения (или попросту обнулить действие сообщения и написать свои действия)

Последний раз редактировалось hexor_boo; 06.10.2022 в 15:48. Причина: Уточнение вопроса
hexor_boo вне форума Ответить с цитированием
Старый 06.10.2022, 15:49   #19
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

Пришло понимание как применять код
hexor_boo вне форума Ответить с цитированием
Старый 06.10.2022, 16:12   #20
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

Написал так:

Код:
procedure TForm_Debug.FormCreate(Sender: TObject);
begin
 InterceptWMPASTE(edText.Handle);
end;

function FilterWMPASTE(
 hWnd: THandle; uMsg: Integer; wPar: WPARAM; lPar: LPARAM
):LRESULT; stdcall;
begin
  Result:=0;
  if (uMsg <> WM_PASTE) Then
   Begin
    Result:=PrevMsgProc(hWnd, uMsg, wPar, lPar);
   End
  Else
   Begin
    ShowMessage('WM_PASTE!');
   End;
end;

procedure InterceptWMPASTE(hWnd: THandle);
begin
 PrevMsgProc:=
  Pointer(SetWindowLong(hWnd, GWL_WNDPROC, Cardinal(@FilterWMPASTE)));
end;
Ни при вставке мышкой, ни при Ctrl+V не появляется сообщение 'WM_PASTE!', которое должно появляться, как я понимаю, если Msg=WM_PASTE - не появляется

Последний раз редактировалось hexor_boo; 06.10.2022 в 16:13. Причина: Дополнил ответ
hexor_boo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 85 тыс рублей в месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Гиперссылка в буфере обмена Maksim_V Microsoft Office Excel 3 07.07.2017 15:54
Автозамена в буфере обмена Егор Александрович Microsoft Office Word 1 27.02.2016 03:36
Кодировка в буфере обмена dacorp Общие вопросы Delphi 3 14.05.2011 16:46
Выловить в буфере обмена даные с значением http -=Virus=- Помощь студентам 13 20.02.2010 23:14
Что у тебя в буфере обмена? Hollander Свободное общение 26 18.02.2010 16:55