Zdarzenie OnException - wrong number of parameters

1

Witam

Próbuję w swoim projekcie w Lazarusie uruchomić obsługę wyjątków.
Korzystając z kompendium wiedzy 4p (Wyjątki).
Wstawiłem do programu coś takiego :

procedure MyAppException(Sender: TObject; E : Exception);
begin
  Application.ShowException(E);
  showmessage('WYSTĄPIŁ NIEZNANY BŁĄD');
end;      
procedure TForm1.FormCreate(Sender: TObject);
begin
   Application.OnException := MyAppException;
end;    

Przy próbie uruchomienia otrzymuję błąd:

unit1.pas(798,30) Error: Wrong number of parameters specified for call to "MyAppException"
 

Coś nie tak jest w tym poradniku czy ja przy kopiowaniu coś nie tak zrobiłem?

0

MyAppException musi być elementem klasy TForm1. Zresztą przyjrzałem się na szybko tekstowi artykułu, do którego podałeś link. Z treści przykładowego kodu wynika to jednoznacznie. Ech, ludziki, ludziki. Nie dośc, że leniwe i nie kombinują często samodzielnie zanim napiszą na forum. To jeszcze mają co niektórzy problemy ze zrozumieniem czytanego tekstu (nie będącego prawniczym żargonem) w ojczystym języku :/

1

W deklaracji klasy TForm mam:

TForm1 = class(TForm)
   
[...]

  private
    procedure MyAppException(Sender: TObject; E : Exception);
  public
    { public declarations }
  end;    
 

Czy nie o to chodziło ?

0

Przeczytaj uważnie ten artykuł i zobacz jak tam wygląda kod oraz opis, to będziesz wiedział. Nauczanie jęzka od podstaw pomimo istnienia choćby komepndium na stronie 4p, uważam za bezcelowe.

2

Definicja metody MyAppException powinna wyglądać tak:

procedure TForm1.MyAppException(Sender: TObject; E: Exception);
begin
  //code here
end;

Nie wiem czy pisałeś z głowy czy nie, jednak w takiej postaci w jakiej podałeś - nie skompiluje się; Całość powinna wyglądać mniej więcej tak:

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure MyAppException(Sender: TObject; E: Exception);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyAppException(Sender: TObject; E: Exception);
begin
  //code here
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := MyAppException;
end;
1

Do czystego projektu praktycznie skopiowałem to co jest w kompendium (zmieniając jedynie komunikat o błędzie i usuwając przycisk generujący błąd) :

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type

  { TMainForm }

  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure MyAppException(Sender: TObject; E : Exception);
  public
    { Public declarations }
  end;

  ELowError = class(Exception);
  EMediumError = class(Exception);
  EHighError = class(Exception);

var
  MainForm: TMainForm;

implementation

{$R *.lfm}

procedure TMainForm.MyAppException(Sender: TObject; E: Exception);
begin
{ wyświetlenie komunikatów wyjątków }
Application.ShowException(E);

If E is EHighError then // jeżeli wyjątek to EHighError...
  begin
    Showmessage('BŁĄD');
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
   Application.OnException := MyAppException;
end;

end.

 

Nadal otrzymuję ten sam błąd.

2

Cholera - nie zauważyłem, że chodzi o Lazarusa... Problemem jest ta linijka:

Application.OnException := MyAppException;

Niestety Lazarus wyrzuca błąd przez takie przypisanie (czego nie ma w Delphi 7); Rozwiązaniem jest przypisanie adresu nowej metody przez operator @:

Application.OnException := @MyAppException;

Dzięki temu program się skompiluje i będzie działał poprawnie.

0

@Furious Programming dziękuje serdecznie po dodaniu @ przy przypisaniu program kompiluje się poprawnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1