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

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

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2015, 17:32   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Работа с контекстными меню

Доброго времени суток.
У меня есть маленькая проблема с контекстными меню, которую я раздул для себя из-за личного интереса к проблеме.
Собственно, у меня есть компонент ввода (какой нибудь TEdit), и в событии OnKeyPress выполняется код "динамической" фильтрации ввода.

--- Это должен быть спойлер ---
Динамическая, потому что в зависимости от состояния зависимых входных данных разрешается вводить разные наборы символов.
--- Спойлер закончился ---

Собственно, данная фильтрация не происходит при событиях вставки текста, которые доступны по Ctrl+V и в контекстном меню.
И если я могу заблокировать комбинацию клавиш, то с контекстным меню немного сложнее.
В принципе я могу не фильтровать ввод в процессе самого ввода (а просто отсеивать левые символы, или выдавать ошибку при парсинге строки), но тогда я теряю личный интерес к решению задачи.
Так же я могу создать костыль - прикрепить своё пустое контекстное меню, но это тоже не интересно.

У меня есть несколько способов, которые я не знаю, как реализовать, или знаю, но частично:
1) отключить контекстное меню в принципе, посредством блокировки нажатия ПКМ; но есть не отсеиваемая клавиша на клавиатуре (у меня между правыми Alt и Ctrl, на ноутбуке), которую, как я вычитал, нужно блокировать с помощью hook'ов (WinAPI), или DLL, что для моей задачки уже сложно, и поэтому тоже не интересно;
2) блокировать вставку текста, что по сути и сложности для меня примерно тоже, что и первый способ;
3) фильтровать вставляемый текст; в принципе, это идеальный для меня вариант, но я не знаю, как и где получать вставляемую строку (которую пропарсить не сложно); если это то же сложный способ (из ряда WinAPI) - то я всё равно хочу его реализовать, потому что мне интересен именно этот способ.

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

Ну и да, кому не всё равно - поздравляю с днём программиста.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 13.09.2015 в 17:40.
OmegaBerkut вне форума Ответить с цитированием
Старый 13.09.2015, 17:37   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А не пользоваться OnKeyPress. А пользоваться OnChange. Накроет и клавиатурный ввод и копипасту.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.09.2015, 17:42   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А не пользоваться OnKeyPress. А пользоваться OnChange. Накроет и клавиатурный ввод и копипасту.
Это слишком просто для меня, да и принципы не позволяют фильтровать наращиваемую строку, ибо тогда время работы алгоритма линейно растёт зависимо от длинны строки.
Я понимаю, что для процессора это ничто, но тем не менее - это банальнейший принцип.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.09.2015, 17:44   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ога. Только пользователю на это начхать и обложит еще как, когда не сможет копипастой воспользоваться
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.09.2015, 17:56   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ога. Только пользователю на это начхать и обложит еще как, когда не сможет копипастой воспользоваться
Я же описал, что хочу реализовать фильтрацию копипасты, то есть - ничего не блокировать
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.09.2015, 18:06   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

WM_PASTE в твой эдит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.09.2015, 22:25   #7
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Возможно такой вариант подойдёт:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  StdCtrls, Clipbrd;

type
  TEdit = class(StdCtrls.TEdit)
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TEdit }

procedure TEdit.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_PASTE then
    if ClipBoard.HasFormat(CF_Text) then ClipBoard.AsText := StringReplace(ClipBoard.AsText, '0', '1', [rfReplaceAll, rfIgnoreCase]);
  inherited;
end;

end.
Либо:
Код:
procedure TEdit.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_PASTE then
    if ClipBoard.HasFormat(CF_Text) then
      if ClipBoard.AsText = 'чемуто' then // какие-то действия
      else
        begin
          ShowMessage('чотонетак');
          Message.Msg := 0;
        end;
  inherited;
end;
ДралсяСошибками вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с меню xxx797 C# (си шарп) 2 05.12.2013 21:39
Работа с меню. fobos-159 Паскаль, Turbo Pascal, PascalABC.NET 1 23.11.2013 17:15
работа в меню kloffelin Помощь студентам 5 21.02.2010 17:08
Работа с меню и рисунками Mag992 Помощь студентам 6 17.02.2010 08:57