Как исправить исключение при работе модифицированного компонента TSpinEdit в Delphi 12.1: анализ и решение проблемы с OnUpClick и OnDownClick событиями.
Решение проблемы с модифицированным TSpinEdit в Delphi 12.1
Введение
В данной статье рассмотрим проблему, с которой столкнулся разработчик при использовании модифицированного компонента TSpinEditEx в Delphi 12.1. Хотя код компилируется, при вызове возникает исключение. Разберём возможные причины и предложим решения.
Анализ проблемы
Исходный код компонента TSpinEditEx выглядит следующим образом:
unit SpinEditEx;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin;
type
TSpinEditEx = class(TSpinEdit)
private
FOnUpClick: TNotifyEvent;
FOnDownClick: TNotifyEvent;
protected
procedure UpClick(Sender: TObject); override;
procedure DownClick(Sender: TObject); override;
public
{ Public declarations }
published
property OnDownClick: TNotifyEvent read FOnDownClick write FOnDownClick;
property OnUpClick: TNotifyEvent read FOnUpClick write FOnUpClick;
end;
procedure Register;
implementation
procedure TSpinEditEx.UpClick(Sender: TObject);
begin
Inherited;
if Assigned(FOnUpClick) then FOnUpClick(Self);
end;
procedure TSpinEditEx.DownClick(Sender: TObject);
begin
Inherited;
if Assigned(FOnDownClick) then FOnDownClick(Self);
end;
procedure Register;
begin
RegisterComponents('Samples', [TSpinEditEx]);
end;
end.
Возможные причины исключения
Изменения в VCL в Delphi 12.1
В новых версиях Delphi могли измениться внутренние механизмы работы TSpinEdit, что приводит к ошибке при вызове inherited.
Неправильная обработка событий
Возможно, обработчики FOnUpClick и FOnDownClick вызываются некорректно.
Проблемы с DCU/DCP/BPL
Несовместимость скомпилированных модулей (.dcu, .dcp, .bpl) может вызывать исключения.
Решение 1: Проверка и отладка
Прежде всего, необходимо определить точное место возникновения исключения. Для этого:
Запустите приложение в режиме отладки (F9).
Включите остановку на всех исключениях (Ctrl+Alt+E → установите галочку для всех исключений).
Определите, где именно возникает ошибка (в UpClick, DownClick или другом месте).
Если исключение возникает при вызове inherited, возможно, стоит проверить, не изменилась ли сигнатура методов в родительском классе.
Решение 2: Альтернативная реализация
Если проблема связана с изменениями в VCL, можно использовать другой подход — перехват сообщений WM_LBUTTONDOWN и WM_LBUTTONUP:
type
TSpinEditEx = class(TSpinEdit)
private
FOnUpClick: TNotifyEvent;
FOnDownClick: TNotifyEvent;
protected
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
published
property OnDownClick: TNotifyEvent read FOnDownClick write FOnDownClick;
property OnUpClick: TNotifyEvent read FOnUpClick write FOnUpClick;
end;
implementation
procedure TSpinEditEx.WMLButtonDown(var Message: TWMLButtonDown);
begin
inherited;
if PtInRect(GetUpButtonRect, Point(Message.XPos, Message.YPos)) then
if Assigned(FOnDownClick) then FOnDownClick(Self);
end;
procedure TSpinEditEx.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if PtInRect(GetDownButtonRect, Point(Message.XPos, Message.YPos)) then
if Assigned(FOnUpClick) then FOnUpClick(Self);
end;
Решение 3: Использование TUpDown
Если TSpinEdit работает некорректно, можно использовать связку TEdit + TUpDown:
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
if Button = btNext then
Edit1.Text := IntToStr(StrToIntDef(Edit1.Text, 0) + 1)
else
Edit1.Text := IntToStr(StrToIntDef(Edit1.Text, 0) - 1);
end;
Заключение
Проблема с TSpinEditEx в Delphi 12.1 может быть связана с изменениями в VCL или некорректной компиляцией модулей. Для диагностики:
- Запустите отладку.
- Проверьте целостность DCU/BPL.
- Рассмотрите альтернативные реализации (TUpDown или перехват сообщений).
Если проблема сохраняется, предоставьте минимальный воспроизводимый пример, чтобы сообщество могло помочь точнее.
Совет: Всегда проверяйте совместимость старых компонентов с новыми версиями Delphi, так как внутренние механизмы VCL могут меняться.
В статье рассматривается решение проблемы с модифицированным компонентом TSpinEditEx в Delphi 12.1, включая анализ возможных причин исключения и предложения по решению, такие как отладка, альтернативная реализация и использование TUpDown.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.