Ошибка 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 шт):
Ответ оказался предельно простым:
Необходимо добавить одну единственную строчку
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;