• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

События Буфера обмена

  • Автор темы V88
  • Дата начала
V

V88

Здравствуйте!
Сразу к делу. Как отследить команду вставить через контекстное меню у ячейки StringGrida?
Я бы хотел чтобы в stringgrig можно было вводить только цифры. Сделал через событие OnKeyPress - работает отлично, НО если вставлять через БО, то Неотлично получается. Буф Обмена вставляет и символы и буквы и цыфры и все-все. Если какой-то способ это исправить?
Комбинации клавиш Ctrl+V и Shift+Ins перехватить легко, а вот контекстное меню как?
 
S

sinkopa

Здравствуйте!
Сразу к делу. Как отследить команду вставить через контекстное меню у ячейки StringGrida?
"Штатными" средствами StringGrida никак. :)
Проблема в следующем. StringGrid и встроенный в него InplaceEditor существуют как бы каждый сам по себе.
Можно было бы попытаться пререхватывать сообщение вставки из буфера WM_PASTE
Код:
procedure WMPaste(var Message: TMessage); message WM_PASTE;
но... этот гад - InplaceEditor рождается (как объект) только в момент первой попытки (инициации) редактирования ячейки...
Вот "внештатными" средствами, а именно через 2 хака (TInplaceEdit и собственно TStringGrid) и подмену встроенного InplaceEditor на собственный, это можно...
Код не привожу, потому как не считаю что данная заморочка стоит того чтоб ей заморачиваться... :rolleyes:
Хотя если уж оооочень нужно... пишите, концепцию так сказать изложу.
Я бы хотел чтобы в stringgrig можно было вводить только цифры.
А вот это можно... Причем никакие OnKeyPress обрабатывать и буфер обмена "щупать" не нужно... B)
Воспользуйтесь маской ввода. Для того чтобы редактор ячейки принимал только цифры, достаточно в обработчике события OnGetEditMask прописать маску:
Код:
procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol,
ARow: Integer; var Value: String);
begin
if (ACol = 2) and (ARow = 2) then
Value := '0000' // В ячейке [2,2] можно ввести не больше 4-х цифр (любые другие символы игнорируются)
else if (ACol = 3) and (ARow = 3) then
Value := '00000'; // В ячейке [3,3] можно ввести не больше 5-и цифр (любые другие символы игнорируются)
end;
Собственно вы можете построить нужную маску любой сложности. Например, вот маска для ввода телефонного номера
Код:
(000)_000-0000;0;*
Подробнее читайте в хелпе Delphi в разделе "TEditMask type" или по этим же словам запрос в Google...
А вообще (мое личное мнение) StringGrid в качестве редактора - полное г... Лучше использовать более продвинутые контролы. Например "ListView". И выглядит поприличнее чем StringGrid и управление им... я бы сказал - гибче... B)
 
V

V88

Воспользуйтесь маской ввода. Для того чтобы редактор ячейки принимал только цифры, достаточно в обработчике события OnGetEditMask прописать маску:
Код:
procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol,
ARow: Integer; var Value: String);
begin
if (ACol = 2) and (ARow = 2) then
Value := '0000' // В ячейке [2,2] можно ввести не больше 4-х цифр (любые другие символы игнорируются)
else if (ACol = 3) and (ARow = 3) then
Value := '00000'; // В ячейке [3,3] можно ввести не больше 5-и цифр (любые другие символы игнорируются)
end;

Спасибо большое! То что надо!!! )))
И хрен с ним с буфером :rolleyes: Все работает как мне и надо.

Кому надо, тему можете продолжать, а я достиг поставленной задачи.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!