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.
TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeugen
-
- Beiträge: 8
- Registriert: So 25. Jan 2015, 18:11
Re: TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeu
Seltsam, da ist der Typ des OnAfterDraw Events im Kontext von TChart deklariert. Versteht jemand, was das soll?
Als Übergangslösung nimm TDrawEvent aus der Deklaration von TChart raus und weise den Event-Handler manuell zur Laufzeit zu:
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.
Code: Alles auswählen
TChart = class(TCustomChart, ICoordTransformer)
public
type
TDrawEvent = procedure (ASender: TChart; ADrawer: IChartDrawer) of object;
strict private // Property fields
FAllowZoom: Boolean;
...
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.
-
- Beiträge: 8
- Registriert: So 25. Jan 2015, 18:11
Re: TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeu
Vielen Dank für den Tipp, das hilft erstmal weiter bis dieser Bug, falls es denn einer ist, behoben wird!
Re: TChart aus TAGraph: OnAfterdraw kann Methode nicht erzeu
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.