![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ctrl + Enter и Memo [D2005, 2000]
azl © (2007-01-17 18:41:00)Здравствуйте, глубокоуважаемые мастера!
Подскажите, пожалуйста, следующее. Пытаюсь сделать, чтобы при нажатии клавиш Ctrl + Enter, когда курсор находится в Memo, выполнялась процедура Button1Click (подобно ICQ).
Пишу вот так:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key = VK_Return) then
Button1.OnClick(Self);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Memo1.Text);
end;
Все хорошо, только смущает то, что курсор смещается вниз, как если бы просто была нажата клавиша Enter. А мне нужно, чтобы курсор оставался на месте.
Пример:
___________________________
Этот текст надо отправить<|>
___________________________
После нажатия Ctrl + Enter
___________________________
Этот текст надо отправить
<|>
___________________________
Почему так происходит? Как это исправить?
Германн (2007-01-18 00:11:00) [1]
> Зачем еще событие он KeyPress обрабатывать надо? Просто
> интересно знать, на будущее.
Если событие есть, должен же кто-то его обрабатывать :)
azl (2007-01-18 00:07:00) [2]УрррААААААА!!! Заработало. Всем спасибо.
Johnmen, варивант [6] мне понравился.
А почему так происходит?
Зачем еще событие он KeyPress обрабатывать надо? Просто интересно знать, на будущее.
Johnmen (2007-01-17 23:38:00) [3]Достаточно
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key = VK_Return) then Button1.Click;
end;
и
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#10 then Key:=#0;
end;
TRUNK (2007-01-17 23:20:00) [4]Привожу код, который я использовал в одной из своих программ:
в дизайнере: MainForm.KeyPreview := true;
в коде:
var
FCtrl: Boolean;
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = 17) then
FCtrl := true;
if (Key = 13)and FCtrl then
Button1.OnClick(Self);
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = 17) then
FCtrl := false;
end;
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
if FCtrl and((Key = #10)or(Key = #13)) then
Key := #0;
end;
azl (2007-01-17 23:06:00) [5]Calibr, к сожалению опять не все слава богу. Вот что получается после нажатия Ctrl + Enter.
__________
Test
\x7F
__________
Мало того, что курсор переходит на следующую строку, так еще и квадратик добавляется.
Calibr (2007-01-17 20:25:00) [6]
> azl © (17.01.07 18:41)
>
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key = VK_Return) then
begin
Button1.OnClick(Self);
Memo1.SetFocus;
keybd_event(8, 0, 0, 0);
keybd_event(8, 0, KEYEVENTF_KEYUP, 0);
end;
end;
azl (2007-01-17 19:04:00) [7]Плохиш, тот же эффект. (((
Плохиш (2007-01-17 18:45:00) [8]
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key = VK_Return) then
begin
Button1.OnClick(Self);
Key := 0;
end;
end;