Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехватить Ctrl+V/Shift+Ins: сделать свою вставку 
V
    Опции темы
Alexeyt
Дата 4.5.2012, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

Репутация: нет
Всего: 2



Пробую перехватить Ctrl+V и сделать свою(кастомную) вставку из буфера в TEdit:

Keypreview=true
Form.OnKeyDown или Edit.OnKeyDown обработка

Код

  if (key=ord('V')) and (shift=[ssCtrl]) then
   if Edit1.Focused then
  begin
    edit1.SelText:= '*T*';
    key:=0;
    exit
  end;


не получается ОК - т.к. вставка после моего кода все равно проходит.
Есть способ перехвата?
PM WWW   Вверх
Ne1tr1n0
Дата 4.5.2012, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



А если вместо Exit добавить Clipboard.Clear?
Разумеется подключив Clipbrd в uses...

Добавлено через 11 минут и 17 секунд
И это... если KeyPreview у формы True, то обрабатывать Edit.OnKeyDown необязательно, так как событие обрабатывается формой.
Кроме того вставка может происходить и с помощью Shift-Insert, не говоря уже о контекстном меню.
Контекстное меню можно отключить если добавить пустое PopupMenu на форму, и указать его в свойстве PopupMenu у Edit'a.
Хотя на мой взгляд было бы правильней обрабатывать WM_PASTE у Edit'a - лишнее условие можно выкинуть и все способы вставки учитываются.
PM MAIL   Вверх
Alexeyt
Дата 4.5.2012, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

Репутация: нет
Всего: 2




1. делать очистку Clipbd нехорошо. Понятно почему
2.>>Хотя на мой взгляд было бы правильней обрабатывать WM_PASTE у Edit'a

Да, точно- а как? Дай пример  smile 
PM WWW   Вверх
Ne1tr1n0
Дата 4.5.2012, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Код

  private
    FOldEditProc : procedure (var Msg:TMessage) of object;
    procedure NewEditProc(var Msg: TMessage);
...
procedure TForm1.NewEditProc(var Msg: TMessage);
begin
  case Msg.Msg of
  WM_PASTE:
    Edit1.SelText:='*T*';
  else
    FOldEditProc(Msg);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldEditProc:=Edit1.WindowProc;
  Edit1.WindowProc:=NewEditProc;
end;

Как-то так...
PM MAIL   Вверх
Alexeyt
Дата 4.5.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

Репутация: нет
Всего: 2



Решено
PM WWW   Вверх
Alexeyt
Дата 5.5.2012, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

Репутация: нет
Всего: 2



Немного уложнилась задача.. у меня не Edit а Combobox. Соотв-но замена windowproc у комбика не решает перехват вставки. Как поправить код  smile 
PM WWW   Вверх
XperT
Дата 6.5.2012, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Если я не ошибаюсь, то Combobox это смесь Edit и Button, а значит сообщения вставки нужно перехватывать именно для окна Edit
PM MAIL   Вверх
Alexeyt
Дата 6.5.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

Репутация: нет
Всего: 2



Это и так ясно, нужен пример..
PM WWW   Вверх
Ne1tr1n0
Дата 6.5.2012, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Код

  private
    EditHandle: Integer;
    FOldEditProc: Pointer;
    FNewEditProc: Pointer;
    procedure NewEditProc(var Msg: TMessage);
...
procedure TForm1.NewEditProc(var Msg: TMessage);
begin
  case Msg.Msg of
  WM_PASTE:
    ComboBox1.SelText:='*T*';
   else
     Msg.Result := CallWindowProc(FOldEditProc, EditHandle, Msg.Msg, Msg.wParam, Msg.lParam);
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  EditHandle:=FindWindowEx(ComboBox1.Handle, 0, 'EDIT', nil);
  FOldEditProc:=Pointer(GetWindowLong(EditHandle, GWL_WNDPROC));
  FNewEditProc:=MakeObjectInstance(NewEditProc);
  SetWindowLong(EditHandle, GWL_WNDPROC, LongInt(FNewEditProc));
end;

PM MAIL   Вверх
Alexeyt
Дата 6.5.2012, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

Репутация: нет
Всего: 2



 Вроде ОК smile

Это сообщение отредактировал(а) Alexeyt - 6.5.2012, 14:16
PM WWW   Вверх
Alexeyt
Дата 6.5.2012, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

Репутация: нет
Всего: 2



Еще
Код

unit Unit1;

interface 

uses 
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
   Dialogs, StdCtrls; 

type 
   TCombobox = class( stdctrls.tcombobox)
   protected 
     procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
       ComboProc: Pointer); override;
   end;

..

procedure TCombobox.ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
   ComboProc: Pointer); 
 begin
   case message.Msg of
     WM_PASTE:
     begin
       SelText:= 'A';
       message.Result:= 1;
     end;
     else
       inherited;
   end;
 end;


Это сообщение отредактировал(а) Alexeyt - 6.5.2012, 19:07
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.