Chart für Druck

Rund um die LCL und andere Komponenten
ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Chart für Druck

Beitrag von ErnstVolker »

Wenn ich die Form speichere

Code: Alles auswählen

  Frm_WZ.Image1.Picture.Jpeg.Width  := Frm_WZ.Width;
  Frm_WZ.Image1.Picture.Jpeg.Height := Frm_WZ.Height;
  Frm_WZ.PaintTo(Frm_WZ.Image1.Picture.Jpeg.Canvas,-10,-10);
  Frm_WZ.Image1.Picture.SaveToFile(BekommeDateiname('jpg'));


dann sind auch die mit dem DistanceToll erzeugten Linien bei. Nur die TextEdit an den Linienenden der hellgrünen Constant-Linien fehlen.

Muß ich anstelle von TextEdit doch eine PaintBox nehmen?
Dateianhänge
bildfastkomplett.jpg

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

Re: Chart für Druck

Beitrag von wp_xyz »

TextEdit? Meinst du TEdit? Sollte aber egal sein, Form.PaintTo gibt ja den gesamten Formularinhalt aus, nicht nur den Chart. Könnte es sein, dass das Feld ausgeblendet wird, wenn die Maustaste nach dem Verschieben losgelassen wird?

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Chart für Druck

Beitrag von ErnstVolker »

Entschuldigung. Ich meine natürlich TEdit.

Ausgeblendet werden die TEdit nur zusammen mit den Linien, wenn in einer TChartListBox das Häkchen rausgenommen wird. Nach dem Verschieben bleiben die TEdit stehen. Der Betrachter des Diagramms soll ja gerade durch die somit hervorgehobene Position (Weg oder Zeit) der Linie die Info bekommen wo sie steht. Es sind sozusagen Hilfslinien für Konstruktionen.

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

Re: Chart für Druck

Beitrag von wp_xyz »

In einem Bild weiter oben befinden sich die Edits ziemlich weit innerhalb. Schiebe sie mal heraus, dass sie nicht mehr mit dem Chart überlappen. Evt werden die Controls beim Schreiben auf dem Bitmap-Canvas in anderer Reihenfolge gezeichnet, so dass der Chart die Edits übermalt. Wenn das so ist und die Edits unbedingt innerhalb der Chartfläche liegen müssen, dann bleibt wahrscheinlich nichts anderes übrig, als nach dem Loslassen der Maus die Edits unsichtbar zu schalten und die Werte im OnAfterDraw-Event and dieselbe Position direkt auf den Chart zu malen.

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Chart für Druck

Beitrag von ErnstVolker »

Ja dem ist so. Ich habe das Chart mal etwas kleiner gemacht, sodass ein TEdit auf der Form, nicht auf dem Chart zum liegen kommt, da wird das TEdit gespeichert. Auch ein TEdit auf der Statusbar wird zwar zur Laufzeit angezeigt, aber nicht gespeichert.

Eine Paintbox auf dem Chart bekomme ich schon zur Laufzeit (auch wenn ich "Visible:=True", "Enabled:=True", "BringToFront" etc. verwende) bzw. beim Design im Objecinspector nicht zu sehen.
Auf der Form hingegen ist die Paintbox sichtbar.

Zur Not verzichte ich auf die Speichern Routine und mach es mit Bildschirmkopien.

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

Re: Chart für Druck

Beitrag von wp_xyz »

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

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Chart für Druck

Beitrag von ErnstVolker »

Vielen vielen Dank für die Hilfe.

Mal eine Frage am Rande zum Thema Speichern. Gibt wahrscheinlich ein neues Thema.

Kann man den Inhalt eines Chart abspeichern, sodass man es wieder laden kann? Sozusagen wie eine Zeichnung oder ein Dokument an dem man nach erneutem Laden weiterarbeitet.

Antworten