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

Тема в разделе "Delphi - СОМ", создана пользователем V88, 11 июн 2010.

  1. V88

    V88 Well-Known Member

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    "Штатными" средствами StringGrida никак. :)
    Проблема в следующем. StringGrid и встроенный в него InplaceEditor существуют как бы каждый сам по себе.
    Можно было бы попытаться пререхватывать сообщение вставки из буфера WM_PASTE
    Код (Text):
    procedure WMPaste(var Message: TMessage); message WM_PASTE;
    но... этот гад - InplaceEditor рождается (как объект) только в момент первой попытки (инициации) редактирования ячейки...
    Вот "внештатными" средствами, а именно через 2 хака (TInplaceEdit и собственно TStringGrid) и подмену встроенного InplaceEditor на собственный, это можно...
    Код не привожу, потому как не считаю что данная заморочка стоит того чтоб ей заморачиваться... :rolleyes:
    Хотя если уж оооочень нужно... пишите, концепцию так сказать изложу.
    А вот это можно... Причем никакие OnKeyPress обрабатывать и буфер обмена "щупать" не нужно... B)
    Воспользуйтесь маской ввода. Для того чтобы редактор ячейки принимал только цифры, достаточно в обработчике события OnGetEditMask прописать маску:
    Код (Delphi):
    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;
    Собственно вы можете построить нужную маску любой сложности. Например, вот маска для ввода телефонного номера
    Код (Text):
    (000)_000-0000;0;*
    Подробнее читайте в хелпе Delphi в разделе "TEditMask type" или по этим же словам запрос в Google...
    А вообще (мое личное мнение) StringGrid в качестве редактора - полное г... Лучше использовать более продвинутые контролы. Например "ListView". И выглядит поприличнее чем StringGrid и управление им... я бы сказал - гибче... B)
     
  3. V88

    V88 Well-Known Member

    Регистрация:
    22 окт 2008
    Сообщения:
    51
    Симпатии:
    0
    Спасибо большое! То что надо!!! )))
    И хрен с ним с буфером :rolleyes: Все работает как мне и надо.

    Кому надо, тему можете продолжать, а я достиг поставленной задачи.
     
Загрузка...
Похожие Темы - События Буфера обмена
  1. Kizarek86
    Ответов:
    5
    Просмотров:
    719
  2. anna
    Ответов:
    49
    Просмотров:
    3.017
  3. alexstudent
    Ответов:
    0
    Просмотров:
    2.504
  4. Anatoly
    Ответов:
    7
    Просмотров:
    2.819
  5. pbnoob
    Ответов:
    6
    Просмотров:
    2.877

Поделиться этой страницей