Я тестирую компонент, унаследованный от TDBMemo
, который может отображать звездочки вместо фактических данных (замена DataField
на поле internalCalc
со звездочками в «скрытом режиме»).
Редактирование элемента управления «в скрытом режиме» не очень полезно, поэтому у меня есть OnKeyPress
, который «съедает» все нажатия клавиш, кроме комбинаций, вставляющих текст (Ctrlv и ShiftIns).
Затем A procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
проверяет, что обновлено «исходное» поле набора данных, а не поле «звездочки».
Это обработчик OnKeyPress:
procedure TPasteCatchDBMemo.PasteCatchDBMemoKeyPress(Sender: TObject; var Key: Char);
var
lCtrl,
lShift,
lPaste: Boolean;
begin
if not FPasswordMode then Exit; // Everything allowed
lCtrl := (GetKeyState(VK_CONTROL) < 0); // High bit set
lShift := (GetKeyState(VK_SHIFT) < 0);
lPaste := lCtrl and ((Key = 'V') or (Key = 'v') or (Key = #$16))
or
lShift and (GetKeyState(VK_INSERT) < 0);
if not lPaste then
Key := #0;
end;
Вопрос: Если я нажму Ctrlv, значение Key
не будет «V» (десятичное 86) или «v» (десятичное 118). Это #$16 (десятичное число 22), которое мне пришлось добавить, чтобы все заработало.
Откуда взялись эти #16 долларов?
Это тестовое приложение Delphi 12, Win32 или Win64.
V — 22-я буква алфавита. Итак, ^V = #22
.
Лично я часто пользуюсь этим фактом:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
^A:
ShowMessage('User wants to select all.');
^Z:
ShowMessage('User wants to undo.');
^Y:
ShowMessage('User wants to redo.');
^X:
ShowMessage('User wants to cut.');
^C:
ShowMessage('User wants to copy.');
^V:
ShowMessage('User wants to paste.');
end;
end;
Исторические и технические подробности этого синтаксиса (синтаксис курсора) и дизайна (эти «символы», отправляемые обработчику OnKeyPress
) можно найти в нескольких других вопросах и ответах на StackOverflow:
Я должен был это узнать: 22-й символ ;-) Спасибо за ссылки.
Возможно, вы сможете избавиться от поля InternalCalc, подключив событие OnGetText исходного поля. docwiki.embarcadero.com/Libraries/Athens/en/…