Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2008, 20:27   #1
ZeLiK
 
Регистрация: 24.02.2008
Сообщений: 6
Вопрос Обработка Ctrl+V и Shift+Ins в SpinEdit

День добрый уважаемые!
Прошу сразу не бить, и не посылать в поиск.
Голова уже ходит кругом от возможностей, но всё же прошу помочь собрать всё в кучку ^_^
Имеется "SpinEdit", нужно ограничить ввод. Т.е. вводить можно только цифры. Как программно, через Up/Down кнопульки в объекте, так и через кнопки 0..9 и сочитания клавишь Ctrl+V, Shift+Ins...
К примеру не допустимо отрицательное значение, или "0-5" и т.д.
Я сделал "мощную" проверку однако она не позволяет обработать вставку из буфера. Т.е. разрешить её нужно, но только именно цифры, а не буквы/символы. У меня получается так, что при вставке через буфер (ctrl+v или shift+ins) ругается:
Цитата:
... class EConvertError with, message ''F0' is not valid integer value'.
("0" - Значение ячейки по умолчанию, а "F" - буква которую вставляю через буфер) и указывает на строку кода которую укажу звёздочкой.
Код:
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
*if (SpinEdit1.Text = '') or (pos('-',SpinEdit1.Text)>0) or (SpinEdit1.Value<=0) or (SpinEdit1.Value>=999999990) then SpinEdit1.Text:='0';
end;

procedure TForm1.SpinEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', #8])  then Key := #0;
end;
ZeLiK вне форума Ответить с цитированием
Старый 24.02.2008, 20:32   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Для этого не кнопки нужно обрабатывать, а сообщение WM_PASTE.
B_N вне форума Ответить с цитированием
Старый 24.02.2008, 20:35   #3
ZeLiK
 
Регистрация: 24.02.2008
Сообщений: 6
По умолчанию

Не подскажете как? Пока что сам ищю в поиске...

Последний раз редактировалось ZeLiK; 24.02.2008 в 20:46.
ZeLiK вне форума Ответить с цитированием
Старый 24.02.2008, 20:53   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Могу предложить кусочек обработчика WM_PASTE на C. Если нет у спинедита события OnPaste значит надо заменить на свой его обработчик оконной процедуры WndProc и обрабатывать в WM_PASTE. В любом случае, проверка клавиш ничего не даст - Вашу программу, судя по формулировке проблемы, можно будет в два счёта завалить, отправив "нужный" WM_PASTE. Кстати, по идее, надо еще обрабатывать WM_SETTEXT или как он там в Дельфи, OnSetText, наверное.

Код:
if(OpenClipboard(hWnd)){
	BOOL fProcess = FALSE;
	LPCSTR str;
	HANDLE hClipBoardData = GetClipboardData(CF_TEXT);	
	// можно (или нужно, в зависимости от ситуации) также проверять CF_UNICODETEXT

	if(hClipBoardData != NULL){
		str = (LPCSTR)GlobalLock(hClipBoardData);
		// здесь проверяем полученную через WM_PASTE строку
		// и если она на утраивает устанавливаем fProcess = TRUE;
		GlobalUnlock(hClipBoardData);
	}
	CloseClipboard();
	
	if(fProcess){
		// если строка нам подходит, вызываем стандартный обработчик
		// Для Delphi это, видимо, inherited;
	}
}
B_N вне форума Ответить с цитированием
Старый 24.02.2008, 21:16   #5
ZeLiK
 
Регистрация: 24.02.2008
Сообщений: 6
По умолчанию

Нашёл простой пример, и то не втыкаю как реализовать =(((
Код:
uses Clipbrd;
...
...
var
 s:String;
begin
s:=clipboard.AsText;
{ обрабытываем строку }
 StringGrid1.Cells[1,1]:= s;
end

Последний раз редактировалось ZeLiK; 25.02.2008 в 04:38.
ZeLiK вне форума Ответить с цитированием
Старый 25.02.2008, 00:21   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
{ обрабытываем строку }
Поставьте тут попытку преобразования в интеджер, и если возникает эксепшн, заполняйте спин-эдит каким-нибудь числом по умолчанию...
mihali4 вне форума Ответить с цитированием
Старый 25.02.2008, 02:49   #7
ZeLiK
 
Регистрация: 24.02.2008
Сообщений: 6
По умолчанию

Цитата:
Как перехватить Ctrl-V в компоненте TMemo?
Следующий пример демонстрирует, как перехватить комбинацию Ctrl-V в компоненте TMemo и поместить в него свой текст вместо того, который в буфере обмена.

Пример:

Код:
uses ClipBrd; 

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
  if ((Key = ord('V')) and (ssCtrl in Shift)) then begin 
    if Clipboard.HasFormat(CF_TEXT) then 
      ClipBoard.Clear; 
    Memo1.SelText := 'Delphi is RAD!'; 
    key := 0; 
  end; 
end;
ещё:
Код:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
   if (Key = VK_INSERT) and (Shift = []) then 
end;
ZeLiK вне форума Ответить с цитированием
Старый 25.02.2008, 04:28   #8
ZeLiK
 
Регистрация: 24.02.2008
Сообщений: 6
По умолчанию

Жесть... кое-как кажись придумал =) значит испытуемый "Edit1".
Прошу отписатся, каму как... нравится иль нет, мож есть альтернативы по проще?
Код:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var i: integer;
begin
  if (((Key = ord('V')) and (ssCtrl in Shift)) or ((Shift = []) and (Key = VK_INSERT))) then //обработка сразу и ctrl+v и shift+insert
  begin
   if Clipboard.HasFormat(CF_TEXT) then // проверяем, текст ли в буфере, если да то:
   begin
    str:=clipboard.AsText; // заносим содиржимое буфера в строку, для обработки
    ClipBoard.Clear; // чистим буфер на всякий "авось" )) Мну для того чтоб снова заполнить
    for i:=1 to length(str) do // цикл до конца строки
    begin
     case str[i] of #48..#57: clipboard.AsText:=clipboard.AsText+str[i]; // если есть символ совпадающий с диапозоном кода, то он добавляется к буферу
    end;
    key := 0;
   end;
  end;
end;
Но опятьже, через Shift+Ins вставляет не обработанный буфер, потом нажимаю ctrl+v - данные обработанно вводятся в строку, затем можно сново Shift+Ins и на этот раз Shift+Ins всё-таки вставит обработанные данные... Кажется в условии что-то напутал, не срабатывает "if ... или Shift+Ins"
p.s. help my please

Последний раз редактировалось ZeLiK; 25.02.2008 в 04:38.
ZeLiK вне форума Ответить с цитированием
Старый 25.02.2008, 04:44   #9
ZeLiK
 
Регистрация: 24.02.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Поставьте тут попытку преобразования в интеджер, и если возникает эксепшн, заполняйте спин-эдит каким-нибудь числом по умолчанию...
Код:
begin
s:=strtoint(clipboard.AsText);
StringGrid1.Cells[1,1]:=s;
end
Так?
Как "обработать" возникновение "эксепшн"? И что это такое, "эксепшн"? ^_^
P.S. B_N и mihali4 Спасибо Вам, что вы откликнулись и не отказали в помощи
P.S.S. Есть у кого ещё идеи какие?
ZeLiK вне форума Ответить с цитированием
Старый 26.02.2008, 02:22   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Немножко по-другому... (Советую почитать про "исключения"):
Код:
...
str:=clipboard.AsText;//это вам предложили ранее
...
try
A:=StrToInt(str);// пробуем преобразовать в число (есть еще другие варианты)
StringGrid1.Cells[1,1]:=str;//если получилось, то вставляем в грид
except
StringGrid1.Cells[1,1]:= 'Недопустимые данные';//не получилось - не число!
end;

Последний раз редактировалось mihali4; 26.02.2008 в 02:25.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
alt+ctrl+del ben95 Общие вопросы Delphi 36 03.01.2009 16:28
CTRL+ALT+DELETE terminadoor Помощь студентам 14 21.07.2008 16:22
Ctrl+Enter kisska Win Api 3 22.08.2007 20:55
Отключение CTRL+ALT+DEL ShVad Общие вопросы Delphi 5 27.01.2007 19:09
Свойство Decimal у SpinEdit Ko$tello Компоненты Delphi 3 18.11.2006 17:53