Die aktuelle Version von TAChart in Laz-trunk zeigt auch beim SaveToFile die Ausgabe der ChartTools an. Wird allerdings nochmals überarbeitet. Das TEdit, das nicht zum Chart gehört, wird natürlich nicht ins gespeicherte Bild übernommen.
Der folgende Event-Handler für TChart.OnAfterDraw zeichnet an der Position der ConstantLine den entsprechenden Text direkt in den Chart, also ohne TPaintbox oder TEdit, so dass dieser auch im gespeicherten Bild erscheint.
Code: Alles auswählen
procedure TForm1.Chart1AfterDraw(ASender: TChart; ADrawer: IChartDrawer);
const
LabelAtTop = false;
var
R: TRect;
s: String;
P: TPoint;
begin
ADrawer.Font := Chart1.BottomAxis.Marks.LabelFont;
s := Format('%.3f', [Chart1ConstantLine1.Position]);
R.TopLeft := Point(0, 0);
R.BottomRight := ADrawer.TextExtent(s);
InflateRect(R, 2, 2);
P.X := Chart1.XGraphToImage(Chart1ConstantLine1.Position);
if LabelAtTop then
P.Y := Chart1.ClipRect.Top
else
P.Y := Chart1.ClipRect.Bottom;
OffsetRect(R, P.X - (R.Right - R.Left) div 2, P.Y - (R.Bottom - R.Top) div 2);
if R.Left < Chart1.ClipRect.Left then begin
R.Right := Chart1.ClipRect.Left + (R.Right - R.Left);
R.Left := Chart1.ClipRect.Left;
end;
if R.Right > Chart1.ClipRect.Right then begin
R.Left := Chart1.ClipRect.Right - (R.Right - R.Left);
R.Right := Chart1.ClipRect.Right;
end;
if R.Top < 0 then begin
R.Bottom := R.Bottom - R.Top;
R.Top := 0;
end;
ADrawer.SetBrushParams(bsSolid, clYellow);
ADrawer.SetPenParams(psSolid, clGray);
ADrawer.Rectangle(R);
OffsetRect(R, 2, 2);
ADrawer.TextOut.Pos(R.TopLeft).Alignment(taCenter).Text(s).Done;
end;