TChart - Gantt Charts erstellen

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6784
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

TChart - Gantt Charts erstellen

Beitrag von af0815 »

Ich suche nach Gantt Charts bei TChart, habe aber nichts gefunden. Bin ich nur Blind oder gibt es die wirklich noch nicht ?

Mit den TOpenHighLowCloseSeries (Modus Candlelight) kann ich meine Daten aber nicht so darstellen wie ich wirklich will.

Was habe ich für Daten. Anfang, Ende (Beide ein Datum/Zeit) und einen Wert dazu. Die lassen sich normalerweise gut als Gantt Chart darstellen. In x habe ich dann die Zeitpunkte aufgetragen und in y den Wert.

Ich muss dazu sagen das ich früher TeeChart (unter Delphi) verwendet habe und jetzt noch einige Umstellungsschwierigkeiten habe, Übung wird schon den Meister machen :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TChart - Gantt Charts erstellen

Beitrag von Christian »

Ich benutz dafür ne recht alte Delphi Komponente, die ich mittlerweile aber stark angepasst hab
https://github.com/cutec-chris/promet-b ... lendar.pas
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: TChart - Gantt Charts erstellen

Beitrag von wp_xyz »

Nein, Gantt gibt es nicht bei TAChart, es hat noch keiner danach gefragt... Kann sich aber jetzt ändern: Wie wären denn deine Vorstellungen?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6784
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TChart - Gantt Charts erstellen

Beitrag von af0815 »

Ev. so wie http://stackoverflow.com/questions/3103 ... antt-chart.

Halt so ähnlich. Eventuell das die Verbindungslinien konfigurierbar sind (an/abschaltbar). Oft hat man auf der x das Datum (Anfang/Ende oder Anfang/Dauer) y ist meistens Text der angezeigt wird. Manchmal aber auch normale Werte.

Danke für die positive Reaktion.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: TChart - Gantt Charts erstellen

Beitrag von wp_xyz »

Also nicht so komplex wie in http://www.gantt.com/ge/ !

Ich fasse mal zusammen:
- jeder Datenpunkt besteht aus 3 Zahlen
- Startdatum, Enddatum (beide auf x), Index (auf y), dazu Labeltext und Farbe für jeden Balken
- Start- und Enddatum werden mit einem waagrechten Balken verbunden
- Endpunkt des einen Balken wird mit dem Startpunkt des nächsten mit einer Stufenlinie verbunden, wobei die Stufe in der Mitte zwischen Balkenende und -Beginn liegt und entfällt, falls die beiden Balken überlappen
- Die Stufenlinie hat einen eigenen Pen, ist also bzg. Farbe, Linentyp, Strichstärke etc. konfigurierbar.

Nochwas?

[EDIT]
Ich habe übersehen, dass die Stufenlinie nicht unbedingt mit dem nächsten, sondern mit irgendeinem folgenden Balken verbinden muss. Das erklärt dann auch, warum einige Balken keine Linie am Anfang haben.

Damit hat jeder Datenpunkt 4 Zahlenwerte:
- Startdatum
- Enddatum
- Index
- Index des verbundenen nächsten Balkens

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6784
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TChart - Gantt Charts erstellen

Beitrag von af0815 »

Es muss nicht zwingend ein Startdatum bzw. Enddatum sein. Nur dann wen die x-Achse als Datum oder Zeit formatiert ist (meistens).
Ist es auch dann möglich nicht nur die Färbung sondern auch das Füllmuster zu beeinflussen.
Wenn ich mehre Werte pro Index angebe werden die auch auf einer Linie gezeichnet und können auch miteinander verbunden werden ? (Ich werde echt unbescheiden)

Das mit der komplexität ist so eine Sache. Es hängt immer davon ab, was man aktuell darstellen will. Wenn ich eine Projektplanung programmieren will, so ist das komplexe Beispiel natürlich sinnvoll. Aber nicht aktuell, besonders wenn es keine 'Kundschaft' gibt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6784
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TChart - Gantt Charts erstellen

Beitrag von af0815 »

Christian hat geschrieben:Ich benutz dafür ne recht alte Delphi Komponente, die ich mittlerweile aber stark angepasst hab
https://github.com/cutec-chris/promet-b ... lendar.pas
Danke für die Info, ich verwende normalerweise keine Programmteile/Komponenten etc., deren Lizenz ich nicht zu 100% verwenden kann bzw. für mich ungeklärt sind. Das Gantt von dir erscheint mir leider als so ein Fall. Es gibt ein altes Copyright darauf, zusätzlich die Änderungen von Dir. Für mich also komplett ungeklärte Sachen. Deshalb werde ich es auch nicht weiterverfolgen, auch wenn das was ich jetzt mache nur für mich privat ist.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: TChart - Gantt Charts erstellen

Beitrag von wp_xyz »

af0815 hat geschrieben:Es muss nicht zwingend ein Startdatum bzw. Enddatum sein. Nur dann wen die x-Achse als Datum oder Zeit formatiert ist (meistens).
Kein Problem, die Koordinaten sind Double, und um die Zeit/Datum-Formatierung muss man sich selbst kümmern (TDateTimeIntervalChartSource).
af0815 hat geschrieben:Ist es auch dann möglich nicht nur die Färbung sondern auch das Füllmuster zu beeinflussen.
Auch kein Problem. TAChart stellt üblicherweise einen kompletten Brush zur Verfügung, und das hätte ich sowieso beibehalten.
af0815 hat geschrieben: Wenn ich mehre Werte pro Index angebe werden die auch auf einer Linie gezeichnet und können auch miteinander verbunden werden ?
Gut zu wissen. Das heißt, dann dass die Balkenindices in ein Array müssen. Ein Funktionsaufruf, um einen Balken aufzunehmen, könnte dann so lauten:

Code: Alles auswählen

var
  startvalue, endvalue: Double;
  balkenindex: Integer;
  verbundenmit : array of integer;
  beschreibung: String;
  farbe: TColor;
 
  GanttSeries.AddGantt(startvalue, endvalue, balkenindex, verbundenmit, beschreibung, farbe); 
wobei die "verbundenmit[..]" Werte größer als "balkenindex" sein müssen. Was wenn nicht? Trotzdem zeichnen? Ignorieren? Exception?

Muss ans Ende der Verbindungslinie ein optionaler Pfeil? Bei Delphi verlaufen die Verbindungslinien aus der Mitte der Schmalseite des Balkenendes in die Mitte der Schmalseite des betreffenden Balkenanfangs. Ist so ok? Oder soll es auch eine Option geben, die Line am Anfang auf der Längsseite aufhören zu lassen, so wie in dem oben von mir erwähnten Chart?

Die interne Datenstruktur der Datenpunkte, TChartDataItem, hat einen X-Wert und beliebig viele Y-Werte. Den Balkenindex werde ich dem X-Wert und die anderen Zahlen den Y-Werten zuordnen; intern wird das ganze dann automatisch gedreht, so dass die Balkenindices auf die y-Achse gelangen. Diese Konvention muss man dann wissen, wenn man den von den Vorfahren geerbten Aufruf "AddXY(x, y, ylist, label, color)" verwenden will.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6784
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TChart - Gantt Charts erstellen

Beitrag von af0815 »

Das Verbinden muss doch mit jeden index möglich sein, der existiert. Daher sowohl nach oben als auch zurück. Ich sehe das momentan abef als Problem an, da ich ja auf einen Index verweisen kann, der erst erzeugt wird. Auch das mit den Pfeilen und der Richtung könnte noch kniffelig werden, den es sind ja keine einfachen Linien.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: TChart - Gantt Charts erstellen

Beitrag von wp_xyz »

Das Verbinden muss doch mit jeden index möglich sein, der existiert. Daher sowohl nach oben als auch zurück.
Aber es bleibt dabei, dass die Balken nur in Richtung des Prozessablaufs verbunden werden? Also, wenn die Prozessschritte von unten nach oben aufgetragen sind (so wie im Anhang), zeigen die Pfeile immer irgendwie nach oben, nie nach unten? Letzteres wäre mir zu kompliziert... Im Anhang ist diese Situation skizziert: Wäre die Verbindung, bei der Schritt 4 auf 2 zurückwirkt, möglich?
Dateianhänge
gantt.png
gantt.png (2.94 KiB) 2830 mal betrachtet

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6784
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TChart - Gantt Charts erstellen

Beitrag von af0815 »

wp_xyz hat geschrieben:
Das Verbinden muss doch mit jeden index möglich sein, der existiert. Daher sowohl nach oben als auch zurück.
Aber es bleibt dabei, dass die Balken nur in Richtung des Prozessablaufs verbunden werden? Also, wenn die Prozessschritte von unten nach oben aufgetragen sind (so wie im Anhang), zeigen die Pfeile immer irgendwie nach oben, nie nach unten? Letzteres wäre mir zu kompliziert... Im Anhang ist diese Situation skizziert: Wäre die Verbindung, bei der Schritt 4 auf 2 zurückwirkt, möglich?
Die Prozessschritte werden normalerweise immer von oben nach unten aufgetragen. Rückbezügliche Verbindungen sind möglich bei Prozessen die eine Loop erfordern, aber nicht häufig.

BTW:
Ich wollte das ganze mit Candlesticks probieren, und habe ganz einfach die Low= Open und Close = High gesetzt, das hätte ja soweit nicht so schlecht ausgesehen, nur die Breite der Candlesticks war für mich nicht vorhersehbar.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: TChart - Gantt Charts erstellen

Beitrag von wp_xyz »

So, hier ist eine Vorabversion der TGanttSeries incl kleinem Demo-Projekt. Die Series ist noch nicht registriert, muss also zur Laufzeit erzeugt werden. Das passiert alles im FormCreate. Außerdem erlaubt das Programm, mit den Properties zur Laufzeit herumzuspielen, daher erscheint es umfangreicher als später nötig.

Was kann das ganze?
- Daten"punkte" (d.h. Gantt Balken) werden durch einen Aufruf der Funktion "AddGantt(AStart, AEnd, ATaskIndex: Double; ATaskName: String; AColor: TColor = clTAColor; ABrushStyle: TBrushStyle = bsSolid): Integer" erzeugt. AStart und AEnd sind Anfang und Ende, ATaskIndex der Index, ATaskName die Beschreibung des Projekt-Schrittes. Optional kann man für diesen Balken die Farbe und das Füllmuster festlegen - wenn nicht, gelten die Werte von BarBrush. Den Rückgabewert der Funktion sollte man sich merken, wenn zu diesem Balken eine Verbindungslinie führen soll.
- Verbindunglinien zieht man mit "AddLink(AFromIndex, AToIndex: Integer; APenColor: TColor = clTAColor; APenStyle: TPenStyle = psSolid; APenWidth: Integer = 1): Integer". AFromIndex ist der von AddGantt zurückgegebene Index des Balkens, von dem eine Linie ausgeht (rechts), AToIndex derjenige, bei dem die Linie endet (links). Die Linie wird mit rechten Winkeln gezeichnet. Einen Router, der die Linien schön zwischen den Balken hindurchführt, wollte ich nicht schreiben, aber die Lage der Klickpunkte kann man mit den Properties von Links[AIndex] beeinflussen, wobei AIndex der von AddLink zurückgegebene Wert ist (siehe rechtes Einstellungspanel im Demo). Linienart, - farbe und -strichstärke können für jede Linie individuell vergeben werden; wenn nicht, gilt LinkPen.
- Der übliche TAChart-Bimborium sollte funktionieren, z.B. Zuschalten von Series-Beschriftungen, Invertieren der Achsenrichtung, DateTimeIntervalSource, etc.
- Die DataPoint-Tools (DataPointClick und DataPointDrag) kommen mit der Series zurecht und reagieren auf einen Klick innerhalb des Balkens. Mit dem DragTool kannst du z.B. einen Balken verschieben (in dem Programm mit SHIFT+Click); Längenveränderung sollte im Prinzip auch möglich sein, ist aber nicht realisiert.

Zwei Nachteile sollen nicht verschwiegen werden:
- Wegen der speziellen Art, wie TAChart die Daten intern speichert, muss das Diagramm zunächst mit senkrechten Balken aufgebaut werden. Erst nachdem die neue Series in dem Chart eingefügt worden ist, kann man das Diagramm drehen - siehe code dazu in FormCreate.
- Die intern in der Series gespeicherten Task-Beschreibungen werden bei gedrehter Achse nicht angezeigt - ich weiß, wo der Fehler liegt, sehe aber momentan keine Möglichkeit ihn zu beheben. Als Abhilfe kann man eine TListChartSource ins Formular klicken, in diese die Beschriftungen zusammen mit den richtigen Koordinaten kopieren (CopySourceForMarks im Demo) und diese für die Achsenbeschriftung verwenden - das wird im Demo so gemacht.

Der Code setzt ein paar kleine Änderungen von TAChart voraus, du solltest daher zum Testen eine aktuelle Lazarus-Trunk-Version verwenden. Bei älteren Versionen gibt es Compiler-Fehler, die bemängelten Code-Stellen kann man aber auskommentieren, so dass das Programm läuft (Beim Verschieben von Balken muss man dann in Kauf nehmen, dass der Balkenanfang bei der ersten Mausbewegung zur Maus springt).

Wiegesagt, das ist eine Vorabversion. In dieser Version wird die TGanttSeries wahrscheinlich nicht in Lazarus landen; ich suche noch eine Möglichkeit, wie man die Link-Information noch besser in die ChartSource-Infrastruktur integrieren kann, und ob es vielleicht doch einen Weg gibt, das Diagramm mit horizontalen Balken aufzubauen. Das kann aber dauern...
Dateianhänge
ganttseries.png
GanttSeries.zip
(12.05 KiB) 147-mal heruntergeladen

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TChart - Gantt Charts erstellen

Beitrag von Michl »

Sehr schön!!!

Mir fällt gleich ein Projekt ein, wo ich diese wohl einbauen werde. Habe leider erst noch ein paar andere Dinge vorher zu tun.

Ist die angehangene Version für Tests freigegeben oder baust du diese in der nächsten Zeit gleich weiter um?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: TChart - Gantt Charts erstellen

Beitrag von wp_xyz »

Natürlich kannst du diese Unit zum Testen verwenden, deshalb habe ich sie ja hier hochgeladen. Die endgültige Version wird sich aber wiegesagt davon unterscheiden. Das Definieren von Balken und Verbindungen wird wahrscheinlich so bleiben, aber die Bezeichner, wie man auf die Verbindungsparameter zugreift, könnten sich ändern.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6784
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TChart - Gantt Charts erstellen

Beitrag von af0815 »

Vielen dank für die Mühe, ich arbeite es mir mal (langsam) durch.

Edit: Schaut gut aus. Da mit dem 90 Grad drehen muss ich noch besser verstehen.
Lazarus muss unbedingt am letzten Trunk Stand sein.
Ich habe nur mit der Formatierung der Achsen so meine Probleme. Wie kann ich die Balken, die oben bzw. unten abgeschnitten werden sauber hinbekommen ?
Abgeschnittene Balken
Abgeschnittene Balken
Edit: Es geht mit den Margins
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten