Ошибка External SIGSEGV Lazarus

Есть код, который должен слушать события формы, и при нажатии конкретной клавишы (в моем примере клавиша с буквой 'h') эта клавиша должна выводиться на элемент Memo, расположенный на форме.

Часть кода, отвечающую за это привожу далее:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    var
      stringList : TStringList;
    begin
      if (Key = 'h') then begin                        
           Memo1.Lines.Add(Key);        
     end;     

Однако, здесь вылетает ошибка: 'External SIGSEGV'. При более детальном рассмотрении (с помощью дебаггера), я выяснил, что символ без проблем выводится на элемент Memo, и блок кода, приведенный до этого без проблем завершает свою работу.

Затем он передает управление модулю 'wincontrol.inc' (модуль написан не мной, и вроде как входит в системные функции Lazarus), в данном модуле есть следующий код:

  if not (csNoStdEvents in ControlStyle) then
    with Message do
    begin
      C := Char(CharCode);
      KeyPress(C);
      CharCode := Ord(C);    //Ошибка вылетает здесь
      if Char(CharCode) = #0 then Exit;
    end;

  Result := False;
end;    
    

Собственно в этом куске кода и вылетает ошибка.

З.Ы. Если убрать строчку вывода значения Key в Memo, ошибка пропадает, но как и полагается, символ не выводится на экран.


Ответы (1 шт):

Автор решения: Osiris74

Ответ оказался предельно простым: Необходимо добавить одну единственную строчку Key := Char(0); в конец обработчика нажатия клавишы. Таким образом, финальная версия функции обработчика нажатия клавишы мыши будет выглядеть так:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
  stringList : TStringList;
begin
  if (Key = 'h') then begin                        
       Memo1.Lines.Add(Key);
       Key := Char(0);
 end;  
→ Ссылка