TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeugen

Rund um die LCL und andere Komponenten
Antworten
Weatherman
Beiträge: 8
Registriert: So 25. Jan 2015, 18:11

TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeugen

Beitrag von Weatherman »

Hallo,

ich möchte auf einer Tchartkomponente mit TCanvas zusätzliche Linien und Symbole zeichnen. Das lässt sich mit dem Ereignis OnAfterDraw eigentlich bewältigen.
Beim Aufruf im Objektinspektor gibt Lazarus allerdings die Fehlermeldung aus: "Kann neue Methode nicht erzeugen...". Im Nachrichtenfenster erscheint: "..\TAGraph.pas(18,6) Error:
Bezeichner nicht gefunden: TDrawEvent". Dieser Bezeichner ist aber meines Erachtens in TAGraph.pas deklariert.
Alle andere Ereignisse erzeugen die entsprechenden Methoden, nur OnAfterDraw nicht. Gibt es dafür eine Erklärung?
Vielen Dank für einen Tipp, was ich da übersehen habe.

wp_xyz
Beiträge: 5156
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeu

Beitrag von wp_xyz »

Seltsam, da ist der Typ des OnAfterDraw Events im Kontext von TChart deklariert. Versteht jemand, was das soll?

Code: Alles auswählen

 
  TChart = class(TCustomChart, ICoordTransformer)
  public
  type
    TDrawEvent = procedure (ASender: TChart; ADrawer: IChartDrawer) of object;
  strict private // Property fields
    FAllowZoom: Boolean;
  ...
 
Als Übergangslösung nimm TDrawEvent aus der Deklaration von TChart raus und weise den Event-Handler manuell zur Laufzeit zu:

Code: Alles auswählen

 
// in TAGraph:
  type
    TDrawEvent = procedure (ASender: TChart; ADrawer: IChartDrawer) of object;
 
  TChart = class(TCustomChart, ICoordTransformer)
  strict private // Property fields
    FAllowZoom: Boolean;
  ...
 
//------------------------------------------------
// Beispiel
 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, TAGraph, Forms, Controls, Graphics, Dialogs, TADrawUtils;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Chart1: TChart;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    procedure Chart1AfterDraw(ASender: TChart; ADrawer: IChartDrawer);
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1.OnAfterDraw := @Chart1AfterDraw;
end;
 
procedure TForm1.Chart1AfterDraw(ASender: TChart; ADrawer: IChartDrawer);
begin
  ADrawer.Line(0, 0, 100, 100);
end;
 
end.
 
Achte beim Schreiben der AfterDraw-Methode darauf, den zuständigen Drawer zu verwenden, also nicht den Canvas des TChart. Andernfalls funktioniert die Ausgabe auf Datei, Drucker etc. nicht.

Weatherman
Beiträge: 8
Registriert: So 25. Jan 2015, 18:11

Re: TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeu

Beitrag von Weatherman »

Vielen Dank für den Tipp, das hilft erstmal weiter bis dieser Bug, falls es denn einer ist, behoben wird!

wp_xyz
Beiträge: 5156
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeu

Beitrag von wp_xyz »

Ja, der Autor hat mir bestätigt, dass es ein Bug ist. Der Fehler ist in r47521 behoben, und die Änderung ist für Lazarus 1.4RC1 angemeldet.

Antworten