• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

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

V88

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

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab