Здравствуйте!
Сразу к делу. Как отследить команду вставить через контекстное меню у ячейки StringGrida?
"Штатными" средствами StringGrida никак.
Проблема в следующем. StringGrid и встроенный в него InplaceEditor существуют как бы каждый сам по себе.
Можно было бы попытаться пререхватывать сообщение вставки из буфера WM_PASTE
Код:
procedure WMPaste(var Message: TMessage); message WM_PASTE;
но... этот гад - InplaceEditor рождается (как объект) только в момент первой попытки (инициации) редактирования ячейки...
Вот "внештатными" средствами, а именно через 2 хака (TInplaceEdit и собственно TStringGrid) и подмену встроенного InplaceEditor на собственный, это можно...
Код не привожу, потому как не считаю что данная заморочка стоит того чтоб ей заморачиваться...
Хотя если уж оооочень нужно... пишите, концепцию так сказать изложу.
Я бы хотел чтобы в 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;
Собственно вы можете построить нужную маску любой сложности. Например, вот маска для ввода телефонного номера
Подробнее читайте в хелпе Delphi в разделе "TEditMask type" или по этим же словам запрос в Google...
А вообще (мое личное мнение) StringGrid в качестве редактора - полное г... Лучше использовать более продвинутые контролы. Например "ListView". И выглядит поприличнее чем StringGrid и управление им... я бы сказал - гибче... B)