Sign in Join
Wiki copytemporary

TAChart Tutorial: Getting started/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Einführung
22
33![](/wiki-images/2/2f/Tachart_getting_started_step6.png)
44
55Wenn du einen Plot oder Chart in einem Lazarus-Formular benötigst, solltest du einmal einen Blick auf [[TAChart]] werfen. Das ist das von Lazarus standardmäßig dafür zur Verfügung gestellte Package.
66
77In diesem Tutorial werden wir einige elementare mathematische Funktionen mit TAChart zeichnen. Wir werden ein Diagramm mit drei Liniendatenreihen ("Series") erzeugen für die Funktionen
88
99- y=cos(x),
1010- y=sin(x), und
1111- y=cos(x)*sin(x).
1212
1313Vielleicht sollte ich noch die hier immer wieder auftauchenden Begriffe "Series" und "Chart" erläutern: das gesamte Diagramm wird auch als "Chart" bezeichnet (- ist "Chart" im Deutschen ein männliches oder sächliches Substantiv? Ich werde lt. Duden immer von "das Chart" reden). Jede Funktion wird als Kurve dargestellt, und diese wird als "Series", oder eingedeutscht als "Datenreihe" bezeichnet. Die Datenpunkte der Kurve werden durch Linienabschnitte verbunden, deshalb spricht man auch von "Line series" bzw. Liniendatenreihe. Mit TAChart kann man natürlich auch andere Arten von Datenreihen erzeugen, z.b. Balkendatenreihen (Bar series), Flächendatenreihen (Area series) oder aber auch fortgeschrittene Datenreihen für Fit- oder Spline-Kurven.
1414
1515## Was brauchen wir?
1616
1717Diese Anleitung wird sehr elementar gehalten sein. Natürlich benötigst du grundlegende Kenntnisse der Programmiersprache Object Pascal und musst mit der Lazarus-Entwicklungsumgebung umgehen können.
1818
1919TAChart ist in Lazarus enthalten. Daher musst du dieses Package nicht irgendwo im Internet suchen und musst auch nichts separat installieren. Allerdings, achte darauf, dass deine Lazarus-Version nicht zu alt ist, denn TAChart wird aktiv weiterentwickelt und kann sich von Version zu Version ändern.
2020
2121Am besten folgst du diesem Tutorial Schritt für Schritt. Du kannst aber auch den Quellcode des fertigen Projekts am Ende dieses Artikels verwenden.
2222
2323## Ein neues Projekt
2424
2525![](/wiki-images/9/95/TAChart_component_palette.png)
2626
2727Zu Beginn erzeugen wir in Lazarus ein neues Projekt und wählen dann in der Komponentenpalette den Reiter "Chart". Klicke auf das Icon ganz links, die "TChart"-Komponente, und füge diese dem Formular hinzu. Als Ergebnis siehst du ein leeres Diagramm mit standardisierten x- und y-Achsen.
2828
2929![](/wiki-images/6/63/TAChart_GettingStarted_Step1.png)
3030
3131## Datenreihen hinzufügen
3232
3333Nun fügen wir Datenreihen hinzu. Zu diesem Zweck, musst du auf das Chart doppel-klicken (oder rechts-klicken und im Kontext-Menü den obersten Eintrag "Datenreihen bearbeiten" auswählen). Nun erscheint der Datenreihen-Editor von TAChart. Es ist noch alles leer, aber wenn du auf "Hinzuf." klickst, klappt ein Menü auf mit allen Arten von Datenreihen, die TAChart zur Verfügung stellt. Wähle "Linien-Diagramm". Wiederhole dies noch zweimal, um ingesamt drei Datenreihen zu erzeugen, die dem Chart zugeordnet werden. Sie sind im Chart noch nicht sichtbar weil sie ja noch keine Daten enthalten. Keine Daten - keine Anzeige. Aber wir werden uns darum gleich kümmern.
3434
3535![](/wiki-images/6/6f/TAChart_GettingStarted_Step1a.png)
3636
3737Aber vorher solltest du dir den Objektbaum über dem Objekt-Inspektor ansehen. TAChart benutzt eine ziemlich komplexe Architektur von Klassen und Containern, daher ist es ganz wesentlich, dass du den Objektbaum verstehst. Im aktuellen Zustand unseres Projekts sehen wir die TChart-Komponente und ihre untergeordneten "Kind"-Komponenten: die drei Liniendatenreihen sowie die Achsenliste ("AxisList"), die ihrerseits wiederum die x und y-Achsen als Kinder enthält (als "Bottom" und "Left" bezeichnet). Die Namen der Datenreihen werden nach dem Schema `Chartname<Zahl><Datenreihentyp><Zahl>` erzeugt.
3838
3939![](/wiki-images/c/ce/Tachart_getting_started_object_tree.png)
4040
4141Aber warum geben wird den Datenreihen nicht aussagekräftigere Namen, wie `SinSeries`, `CosSeries`, und `SinCosSeries`? Zu diesem Zweck klicken wir auf jede Datenreihe im Objektbaum und ändern ihren Namen im entsprechenden Feld im Objektinspektor darunter.
4242
4343## Daten hinzufügen
4444
4545Nun wird es Zeit, Daten hinzuzufügen. Die einfachste Methode ist, die Daten zusammen mit dem Formular zu erzeugen. Das heißt, wir schreiben einen Handler für das Ereignis `OnCreate` des Formulars und weisen dort, wie gleich gezeigt wird, der Datenreihe die entsprechenden Daten zu. In einem "echten" Projekt wird man natürlich die Daten bei anderen Gelegenheiten den Datenreihen zuweisen, z.B. nach einem Button-Click, der eine Berechnung oder das Einlesen der Daten von Datei bewirkt hat.
4646
4747``` pascal
4848procedure TForm1.FormCreate(Sender: TObject);
4949const
5050 N = 100;
5151 MIN = -10;
5252 MAX = 10;
5353var
5454 i: Integer;
5555 x: Double;
5656begin
5757 for i:=0 to N-1 do begin
5858 x := MIN + (MAX - MIN) * i /(N - 1);
5959 SinSeries.AddXY(x, sin(x));
6060 CosSeries.AddXY(x, cos(x));
6161 SinCosSeries.AddXY(x, sin(x)*cos(x));
6262 end;
6363end;
6464```
6565
6666Diese Prozedur erzeugt für jede Datenreihe `N = 100` Datenpunkte. Die x-Werte werden äquidistant zwischen einem Anfangswert Minimum `MIN = -10` und einem Endwert `MAX = +10` berechnet, und die y-Werte ergeben sich aus der betreffenden mathematischen Funktion. Die wichtigen Zeilen sind die Aufrufe der `AddXY`-Methode jeder Datenreihe. Diese Methode erhält die x- und y-Koordinaten jedes Datenpunktes als Parameter und fügt sie einer internen Liste hinzu. Es gibt auch überladene Versionen, bei denen man zusätzlich für jeden Datenpunkt einen Beschriftungstext sowie eine individuelle Farbe angeben kann. Aber dieses Feature brauchen wir hier nicht.
6767
6868Die erwähnte Liste ist eine sogenannte ChartSource (übersetzt: "Chart-Datenquelle") - das ist eine Klasse, die die zu plottenden Daten zur Verfügung stellt. Man kann - wie oben - die eingebaute Datenquelle verwenden, oder eine separate mit der Datenreihe verbinden. Es gibt in der Komponenten-Palette eine Vielzahl von Chart-Datenquellen, wie
6969
7070- `TListChartSource`, die die Daten in einer Array-ähnlichen Liste speichert (dieser Typ wird von unserer Datenreihe intern verwendet)
7171- `TDBChartSource`, die die Daten aus den Feldern und Records einer Datenbank holt
7272- `TUserDefinedChartSource`, die einen sehr allgemeinen Zugriff auf Daten in allen möglichen Strukturen außerhalb des TAChart-Package ermöglicht, z.B. in einem allgemeinen Array benutzer-definierter Records.
7373- `TCalculatedChartSource`, die die Ergebnisse einer Berechnung der Daten aus einer anderen Chart-Datenquelle zur Verfügung stellt.
7474
7575Aber genug über Chart-Datenquellen - die eingebaute Quelle ist für dieses einführende Projekt völlig ausreichend.
7676
7777![](/wiki-images/b/b8/Tachart_getting_started_step2.png)
7878
7979Ok, kompilieren wir das Programm... Wir sehen die drei Kurven, und die x-Achse erstreckt sich automatisch über den Bereich der x-Werte zwischen -10 und +10. Nicht schlecht für den Anfang, aber noch verbesserungswürdig: Das Diagramm ist sehr verwirrend, wir können nicht zwischen den einzelnen Linien unterscheiden, man kann nicht sagen, welche Datenreihe zu welcher Funktion gehört.
8080
8181## Datenreihen formatieren
8282
8383Warum ändern wir nicht die Farbe jeder einzelnen Datenreihe? Dafür muss man nur im Objekt-Baum jede Datenreihe auswählen und dann im darunterligenden Objekt-Inspektor die Eigenschaft `SeriesColor` ("Datenreihen-Farbe") so ändern, wie wir wollen. `SeriesColor` bezeichnet die Farbe der Verbindungslinien zwischen den einzelnen Datenpunkten.
8484
8585Wenn du jetzt neu kompilierst, siehst du die Datenreihen in Farbe. Aber man kann immer noch nicht unterscheiden, welche Datenreihe sich auf welche Funktion bezieht. Wir brauche eine Legende!
8686
8787## Eine Legende hinzufügen
8888
8989Wähle das Chart an. Scrolle im Objektinspektor nach unten zur Eigenschaft `Legend`, öffne die untergeordneten Eigenschaften. Am Ende der Liste findest du die Eigenschaft `Visible` ("sichtbar"), die standardmäßig auf `false` steht. OK - stelle sie auf `true` und kompiliere neu.
9090
9191![](/wiki-images/2/2e/Tachart_getting_started_step3.png)
9292
9393Es wird besser. Was noch fehlt, ist ein erklärender Text für jede Datenreihe, etwas wie `y = sin(x)`. Kein Problem! Für diesen Zweck hat jede Datenreihe eine Eigenschaft `Title` - das ist der Text, der stellvertretend für die Datenreihe in der Legende erscheint, zusammen mit einem Symbol für das Aussehen der Datenreihe. Also: gehe nochmals alle Datenreihen durch und gib im Objektinspektor jeweils für `Title` die folgenden Texte ein: `y=sin(x)`, `y=cos(x)`, and `y=sin(x)*cos(x)`.
9494
9595![](/wiki-images/5/5f/Tachart_getting_started_step4.png) ![](/wiki-images/2/20/Tachart_getting_started_step4a.png)
9696
9797Wenn du jetzt neu kompiliert, ist das Chart fast perfekt. Fast - weil die Legende relativ groß ist und das Diagramm im verfügbaren Platz zusammenquetscht. Natürlich könnte man das Formular mit dem Diagramm vergrößern. Aber könnte man stattdessen nicht die Legende unterhalb des Charts anordnen? Kein Problem: Gehe zurück zur Chart-Eigenschaft `Legend` und setzte die Eigenschaft `Alignment` ("Ausrichtung") auf `laBottomCenter` ("unten Mitte"). Du solltest auch `ColumnCount` ("Spaltenanzahl") auf 3 setzen, damit die drei Einträge nebeneinander, als 3 Spalten, dargestellt werden.
9898
9999![](/wiki-images/3/37/Tachart_getting_started_step5.png)
100100
101101Ah! -- der dritte Legendeneintrag wird abgeschnitten, weil das Fenster nicht breit genug ist. Setze die Eigenschaft `Align` ("Ausrichten") des Chart auf `alClient` und vergrößere die Fensterbreite ein bisschen.
102102
103103## Feinabstimmung
104104
105105Ein paar wenige Dinge kann man noch verbessern: Die Achsen sollten einen Titel haben, etwa "x-Achse" and "y-Achse", und über dem Chart sollte auch ein Titel stehen.
106106
107107Um den **Titel der x-Achse** festzulegen, wähle im Objekt-Baum den Eintrag `Bottom` of the `AxisList`-Kindkomponente des Chart, oder gehe im Objektinspektor zum Eintrag `Bottom axis`. Klappe die Untereigenschaften auf, wo das Feld `Title` zu finden ist. Diese Eigenschaft hat ihrerseits weitere untergeordnete Eigenschaften. Der Text im Feld `Caption` ("Beschriftung") ist das, was wir suchen - dieser Text wird als Beschriftung an der Achse angezeigt. Vergiss nicht, `Visible` auf `true` zu setzen, damit die Beschriftung auch wirklich angezeigt wird. Natürlich kannst du auch die Schriftart z.b. auf fett umstellen: die zugehörige Eigenschaft findest du etwas weiter oben unter `LabelFont` und `Style`.
108108
109109Wiederhole dieses Vorgehen mit der **Titel der y-Achse** (`Left axis`). Und im wesentlichen dieselbe Prozedur gilt auch für den **Chart-Titel**: Scrolle zur Chart-Eigenschaft `Title` ("Titel"), und tippe den Titel ins Feld `Text` ein (wo auch mehrzeiliger Text möglich ist). Nicht vergessen: `Visible` auf `true` setzen.
110110
111111Und zum Schluss: Wie wär's mit einem weißen **Hintergrund für die durch die Achsen aufgespannte Chart-Fläche**? Dafür ist die Eigenschaft `BackColor` des Chart zuständigt. Und vielleicht sollte das **Gitternetz der Achsen** weniger deutlich hervortreten? Stelle dazu die Eigenschaft `Grid.Color` jeder Achse auf die Farbe `clSilver` um.
112112
113113## Fertig!
114114
115115Zum Schluss sieht unser Chart so aus. Toll, nicht? Und es war eigentlich gar nicht schwierig...
116116
117117Wenn du mehr über TAChart lernen willst, solltest du dir die [[TAChart documentation|offizielle Dokumentation]] ansehen und mit einigen der vielen Demos spielen, die zu TAChart gehören. Du findest sie im Ordner *components\tachart\demo* deiner Lazarus-Installation.
118118
119119![](/wiki-images/2/2f/Tachart_getting_started_step6.png)
120120
121121## Quellcode
122122
123123Der Quellcode dieses Tutorials steht auch im Ordner *tutorials/getting_started* neuerer TAChart-Installationen.
124124
125125### Projekt-Datei (.lpr)
126126
127127``` pascal
128128program project1;
129129
130130{$mode objfpc}{$H+}
131131
132132uses
133133 {$IFDEF UNIX}{$IFDEF UseCThreads}
134134 cthreads,
135135 {$ENDIF}{$ENDIF}
136136 Interfaces, // this includes the LCL widgetset
137137 Forms, Unit1, tachartlazaruspkg
138138 { you can add units after this };
139139
140140{$R *.res}
141141
142142begin
143143 RequireDerivedFormResource := True;
144144 Application.Initialize;
145145 Application.CreateForm(TForm1, Form1);
146146 Application.Run;
147147end.
148148```
149149
150150### Unit1.pas
151151
152152``` pascal
153153unit Unit1;
154154
155155{$mode objfpc}{$H+}
156156
157157interface
158158
159159uses
160160 Classes, SysUtils, FileUtil, TAGraph, TASeries, Forms, Controls, Graphics,
161161 Dialogs;
162162
163163type
164164
165165 { TForm1 }
166166
167167 TForm1 = class(TForm)
168168 Chart1: TChart;
169169 SinSeries: TLineSeries;
170170 CosSeries: TLineSeries;
171171 SinCosSeries: TLineSeries;
172172 procedure FormCreate(Sender: TObject);
173173 private
174174 { private declarations }
175175 public
176176 { public declarations }
177177 end;
178178
179179var
180180 Form1: TForm1;
181181
182182implementation
183183
184184{$R *.lfm}
185185
186186{ TForm1 }
187187
188188procedure TForm1.FormCreate(Sender: TObject);
189189const
190190 N = 100;
191191 MIN = -10;
192192 MAX = 10;
193193var
194194 i: Integer;
195195 x: Double;
196196begin
197197 for i:=0 to N - 1 do begin
198198 x := MIN + (MAX - MIN) * i / (N - 1);
199199 SinSeries.AddXY(x, sin(x));
200200 CosSeries.AddXY(x, cos(x));
201201 SinCosSeries.AddXY(x, sin(x)*cos(x));
202202 end;
203203
204204end;
205205
206206end.
207207```
208208
209209### Unit.lfm
210210
211-``` pascal
211+``` lfm
212212object Form1: TForm1
213213 Left = 14
214214 Height = 244
215215 Top = 137
216216 Width = 347
217217 Caption = 'Form1'
218218 ClientHeight = 244
219219 ClientWidth = 347
220220 OnCreate = FormCreate
221221 LCLVersion = '1.1'
222222 object Chart1: TChart
223223 Left = 0
224224 Height = 244
225225 Top = 0
226226 Width = 347
227227 AxisList = <
228228 item
229229 Grid.Color = clSilver
230230 Minors = <>
231231 Title.LabelFont.Orientation = 900
232232 Title.LabelFont.Style = [fsBold]
233233 Title.Visible = True
234234 Title.Caption = 'y axis'
235235 end
236236 item
237237 Grid.Color = clSilver
238238 Alignment = calBottom
239239 Minors = <>
240240 Title.LabelFont.Style = [fsBold]
241241 Title.Visible = True
242242 Title.Caption = 'x axis'
243243 end>
244244 BackColor = clWhite
245245 Foot.Brush.Color = clBtnFace
246246 Foot.Font.Color = clBlue
247247 Legend.Alignment = laBottomCenter
248248 Legend.ColumnCount = 3
249249 Legend.Visible = True
250250 Title.Brush.Color = clBtnFace
251251 Title.Font.Color = clBlue
252252 Title.Font.Style = [fsBold]
253253 Title.Text.Strings = (
254254 'My first chart'
255255 )
256256 Title.Visible = True
257257 Align = alClient
258258 ParentColor = False
259259 object SinSeries: TLineSeries
260260 Title = 'y=sin(x)'
261261 LinePen.Color = clRed
262262 end
263263 object CosSeries: TLineSeries
264264 Title = 'y=cos(x)'
265265 LinePen.Color = clBlue
266266 end
267267 object SinCosSeries: TLineSeries
268268 Title = 'y=sin(x)*cos(x)'
269269 LinePen.Color = clGreen
270270 end
271271 end
272272end
273273```
274274
275275---
276276*From the Free Pascal wiki, page "TAChart Tutorial: Getting started/de", as it stood on 2020-02-29 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history