Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо