Virtuelle Prozedur überschreiben - eine Frage der Syntax

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
altmetaller
Beiträge: 22
Registriert: Do 12. Nov 2020, 15:04

Virtuelle Prozedur überschreiben - eine Frage der Syntax

Beitrag von altmetaller »

Moin,

ich habe das x-mailer-Package eingebunden. In der entsprechenden Unit (XMailer) finde ich:

Code: Alles auswählen

TSendMail = class
[...]
procedure Progress(const APosition, AMax: Integer; const AStatus: string); virtual;
Nur? Wie zum Geier lautet die Syntax, um die Prozedur zu überschreiben? Mein aktueller "Versuch" sieht (sinnvoll verkürzt) so aus:

Code: Alles auswählen

program XMailerTest;

uses XMailer;

type MyMail = class (TSendMail)
  public
  procedure Progress(const APosition, AMax: Integer; const AStatus: string); overwrite;
    begin
      ShowMessage (AStatus);
    end;
  end;   

begin
[...]
end.
Das scheint's aber nicht zu sein?!?

Liebe Grüße,
Jörg

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Virtuelle Prozedur überschreiben - eine Frage der Syntax

Beitrag von Sieben »

Reiten, nicht schreiben: :wink:

Code: Alles auswählen

override;

Benutzeravatar
altmetaller
Beiträge: 22
Registriert: Do 12. Nov 2020, 15:04

Re: Virtuelle Prozedur überschreiben - eine Frage der Syntax

Beitrag von altmetaller »

Huhu,

danke, war ein Typo im Beitrag. Er springt auf das begin zwischen dem override; und dem ShowMessage und sagt:

Code: Alles auswählen

Identifier expected but "BEGIN" found
Gruß,
Jörg

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Virtuelle Prozedur überschreiben - eine Frage der Syntax

Beitrag von Sieben »

Ach so, ja. Die Implementation der Prozedur gehört natürlich nicht in den Interface-Teil bzw die Typen-Deklaration.

Benutzeravatar
altmetaller
Beiträge: 22
Registriert: Do 12. Nov 2020, 15:04

Re: Virtuelle Prozedur überschreiben - eine Frage der Syntax

Beitrag von altmetaller »

Hallo,

bitte:

Code: Alles auswählen

unit XMailerTest;

interface

uses XMailer;

type MyMail = class (TSendMail)
  procedure Progress(const APosition, AMax: Integer; const AStatus: string); overwrite;
  end;   

implementation

procedure MyMail.Progress(const APosition, AMax: Integer; const AStatus: string); override;
begin
end; 

begin
[...]
end.
Hier bleibt er vor der Prozedurdeklaration direkt hinter dem implementation stehen:
  • Error: Identifier not found "MyMail"
  • Error: class identifier expected
Ich habe diverse Kontrollstrukturen (für Delphi und für Freepascal) ausprobiert. Momentan hänge ich bei https://wiki.freepascal.org/Programming_Using_Objects

Gruß,
Jörg

Benutzeravatar
altmetaller
Beiträge: 22
Registriert: Do 12. Nov 2020, 15:04

Re: Virtuelle Prozedur überschreiben - eine Frage der Syntax

Beitrag von altmetaller »

Hallo,

die schönsten Fragen sind die, die man sich nach 5 Stunden Suche selber beantworten kann. Die Kontrollstruktur sieht wie folgt aus:

Code: Alles auswählen

program demo;

{$mode objfpc}{$H+}

uses
  XMailer, SysUtils;

type MyMail = class (TSendMail)
  procedure Progress(const APosition, AMax: Integer; const AStatus: string); override;
end;

var
  Mail: MyMail;

procedure MyMail.Progress(const APosition, AMax: Integer; const AStatus: string);
begin
  WriteLn (APosition,'   ',AMax,'   ',AStatus);
end;

begin
  Mail := MyMail.Create;
  try
    try
      [...]
      Mail.Send;
      WriteLn('E-mail sent successfully!');
    except
      on E: Exception do
        WriteLn(E.Message);
    end;
  finally
    Mail.Free;
  end;
end.
Gruß,
Jörg

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Virtuelle Prozedur überschreiben - eine Frage der Syntax

Beitrag von af0815 »

Gundlegend sollte man sich beim überschreiben überlegen, ob man nicht zuerst die vererbte Routine per inherited aufruft und anschließend seine Änderungen anbringt.

Warum, du willst ja das vererbte Verhalten ja erweitern, also zuerst mal die 'alte' Routine aufrufen, dann deine 'Erweiterungen' hinten anfügen.

Beim Zerstören genau umgekehrt, zuerst deine Objekte abräumen, dann den Rest durch die vererbten Routinen abräumen lassen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten