Доброго времени суток, господа эксперты Необходимо чтобы по нажатию кнопки Delete на выбранной ячейки Stringgrid появлялось сообщение. Пишу следующее: procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char); begin if key=chr(vk_delete) then showmessage('Delete'); end; запускаю программу, нажимаю Delete, ничего не происходит. Если записать ..if key<>chr(vk_delete).. или ..if key=chr(vk_return).. то все работает как и должно работать. Вопрос: Почему не работает с кнопкой Delete и что нужно сделать чтобы заработало? thnx
Доброе время суток, Fenix! Создаешь HandleMessages как метод формы и затем назначаешь его Application.HandleMessages. procedure TForm1.HandleMessages(var Msg: tMsg; var Handled: Boolean); begin if (Msg.Message = WM_KeyDown) and (Msg.wParam in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_DELETE]) then begin case Msg.wParam of VK_UP: ShowMessage('ВВЕРХ'); VK_DOWN: ShowMessage('ВНИЗ'); VK_LEFT: ShowMessage('ВЛЕВО'); VK_RIGHT: ShowMessage('ВПРАВО'); VK_DELETE: ShowMessage('ДЕЛЕТ'); end; Handled := True; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage := HandleMessages; end; не забуть в тип формы добавить процедуру HandleMessages(var Msg: tMsg; var Handled: Boolean); Ответ отправлен: 31.08.2004, 10:42 Отправитель: Slider Отвечает Харланов Сергей
Здравствуйте, Fenix! Нужно поменять событие: вместо OnKeyPress надо использовать OnKeyUp или OnKeyDown:
procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key=46 then showmessage('Delete') else if key=13 then showmessage('Enter') else if key=27 then showmessage('Esc') else showmessage(Код нажатой клавиши='+IntToStr(Key)) end;
Ответ отправлен: 31.08.2004, 13:09 Отправитель: Харланов Сергей
Вопрос № 1774
Здравствуйте! Скажите, как найти хэндл главного окна (созданного в визуальной среде) и хэндл любого контрола (например Edit1, Label1, Button1 и т.д.) Спасибо.
Приветствую Вас, pv! Edit1.Handle Ответ отправлен: 31.08.2004, 10:44 Отправитель: Slider Отвечает Харланов Сергей
Добрый день, pv! Form1.Handle Edit1.Handle Button1.Handle Компонент Label не является контролом а потому handle не имеет Ответ отправлен: 31.08.2004, 11:55 Отправитель: Харланов Сергей
Вопрос № 1775
Здравствуйте, уважаемые эксперты! Приведите пожалуйста пример создания простейшего окна средствами API на Delphi (без визуальных компонентов).
Доброе время суток, k.o.! потратил на это 40 минут, потомучто когда сам начинал, тоже было очень интересно =)) program WinMin; uses windows, messages; var wc: TWndClassEx; MainWnd: HWND; Mesg: TMsg; function WindowProc(wnd: HWND; Msg: Integer; Wparam: wparam; Lparam: lparam): Lresult; stdcall; begin case msg of wm_destroy: begin postquitmessage(0);exit; result := 0; end; else Result := DefWindowProc(wnd,msg,wparam,lparam); end; End;
Ответ отправлен: 31.08.2004, 11:02 Отправитель: Slider
Вопрос № 1776
Как сделать чтоб при щелчке правой кнопкой мыши по listbox выделялся пункт по которому щёлкнули(как при щелчке левой кнопкой) а потом вылезало попап меню. Причём если щёлкнули не по пункту то выделялся ближайший(нижний_последний)
Доброе время суток, menand! А ты в обработчик нажатия правой кнопки добавь код, который посылает сообщение контролу о нажатии левой кнопки. Ответ отправлен: 01.09.2004, 14:24 Отправитель: CJ Отвечает Харланов Сергей
Доброе время суток, menand! У компонента ListBox есть событие OnMouseDown которому необходимо присвоить следующую процедуру: procedure TfrmAdmin.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var APoint: TPoint; begin APoint.X := X; APoint.Y := Y; ListBox1.ItemIndex:=ListBox1.ItemAtPos(APoint, true); if ListBox1.ItemIndex=-1 then begin ListBox1.ItemIndex:=ListBox1.Count-1; end; end; Далее в свойстве PopupMenu компонента ListBox указываешь нужное тебе PopupMenu. Для того чтобы получить индекс элемента отмеченного в ListBox обращаешься к свойству ListBox.ItemIndex procedure TfrmAdmin.PopupMenuItemClick(Sender: TObject); begin ShowMessage(ListBox1.Items[ListBox1.ItemIndex]) end; Ответ отправлен: 31.08.2004, 11:52 Отправитель: Харланов Сергей Отвечает Slider
Здравствуйте, menand! чуть не удобно, но если поковырять, то оч даже ничего, можно еще клас дочерний создать и там процедуры переписать procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SwapMouseButton(true); Popupmenu1.Popup(mouse.CursorPos.X,mouse.CursorPos.Y); SwapMouseButton(false); end; Ответ отправлен: 31.08.2004, 12:13 Отправитель: Slider
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.