Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi GanttSeries-Elemente einfärben (https://www.delphipraxis.net/129705-ganttseries-elemente-einfaerben.html)

luckystar85 24. Feb 2009 08:18


GanttSeries-Elemente einfärben
 
HI,

ich habe in meinem TChart eine TGanttSeries wo ich mehrere Aktion verbunden darstelle. Dazu gibt es daneben aber eine ComboxBox wo alle Aktionen auch noch enthalten sind. Jetzt möchte ich, dass wenn ich in der ComboBox eine Aktion auswähle der entsprechende Balken des GanttSeries farblich eingefärbt wird. Das gleiche habe ich schon im OnClick gemacht wo dann in der ComboBox entsprechenend die Aktion ausgewählt wird.

Delphi-Quellcode:
procedure TActionSchedule.Chart1ClickSeries(Sender: TCustomChart; Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
  If ( Assigned(Series) ) Then
    TGanttSeries(Series).ValueColor[ValueIndex] := ( Not ColorToRGB(TGanttSeries(Series).ValueColor[ValueIndex]) ) And $00FFFFFF;
End;
Das funktoniert sowie auch richtig gut, nur habe ich jetzt das Problem wie kann ich im OnChange der ComboBox auf die einzelnen Elemente der GanttSeries zugreifen? Im OnClick auf das Chart bekomm ich das übergeben, aber von außen? Ich habe gesucht und auch die OH befragt, aber keine Lösung gefunden. Habt ihr eine Idee?

Tyrael Y. 24. Feb 2009 08:25

Re: GanttSeries-Elemente einfärben
 
Du hast doch die Antwort scho selbst mehr oder weniger geliefert. ;)

Hänge an jeden Combobox Eintrag die Referenz zu der dementsprechenden Series.
Wird eins ausgewählt dann ruf deine Methode zum einfärben mit der Referenz der Series als Parameter auf...fettisch.

luckystar85 24. Feb 2009 08:32

Re: GanttSeries-Elemente einfärben
 
Das hatte ich mir auch gedacht mit AddObject das zufüllen, aber leider habe ich keinen Zugriff auf die einzelnen Elemente. Beim Add bekomm ich auch nur den Index zurück, aber ich kann nicht auf die Liste zugreifen (jedenfalls habe keine Möglichkeit gefunden).

guinnes 24. Feb 2009 09:16

Re: GanttSeries-Elemente einfärben
 
Der Index reicht doch für den Zugriff, oder hast du mehrere Gantt-Serien ?

luckystar85 24. Feb 2009 11:39

Re: GanttSeries-Elemente einfärben
 
Nein ich habe nur eine GanttSeries, aber ich habe keinen Zugriff auf die Elemente der GanttSeries (jedenfalls habe ich die entsprechende Property nicht gefunden um darauf zuzugreifen). Wenn es dafür eine Eigenschaft gibt, ist das Problem schnell gelöst. Gibt es denn eine?

messie 24. Feb 2009 12:27

Re: GanttSeries-Elemente einfärben
 
Wenn ich dein Problem richtig verstanden habe, fehlt Dir der Zugriff auf die Series des Chart. Da kommst Du über TChart.Series[x] dran. Dann kannst Du Dir eine lokale Referenz basteln.
Delphi-Quellcode:
var gs : TGanttSeries;
gs := TGanttSeries(Chart1.Series[i]);
Ist jetzt ungetestet, kann auch sein, dass Du mit as TGanttSeries drankommst.

Grüße, Messie

mkinzler 24. Feb 2009 12:33

Re: GanttSeries-Elemente einfärben
 
Oder statt harten eine weichen Cast
Delphi-Quellcode:
gs := (Chart1.Series[i] as TGanttSeries);

guinnes 24. Feb 2009 12:56

Re: GanttSeries-Elemente einfärben
 
Du färbst in deinem Beispiel den Gantt mit ValueColor[ValueIndex] ein, warum machst du das nicht genau so mit dem Index, den du beim Add erhälts ? Also ValueColor[Integer(deine ComboBox.Items[DeineComboBoy.ItemIndex].Objects)] := WasAuchImmer;

luckystar85 24. Feb 2009 13:26

Re: GanttSeries-Elemente einfärben
 
Zitat:

Zitat von mkinzler
Oder statt harten eine weichen Cast
Delphi-Quellcode:
gs := (Chart1.Series[i] as TGanttSeries);

Die TGanttSeries-Referenz habe ich ja, aber dieser sind ja mehrere Gantts zugeordnet. Auf die möchte ich ja zugreifen. Die TGanttSeries habe ich im TChart angelegt und wird auch im OI angezeigt. Mir fehlt eine Eigenschaft um auf die einzelnen Bars zuzugreifen.

Zitat:

Zitat von guinnes
Du färbst in deinem Beispiel den Gantt mit ValueColor[ValueIndex] ein, warum machst du das nicht genau so mit dem Index, den du beim Add erhälts ? Also ValueColor[Integer(deine ComboBox.Items[DeineComboBoy.ItemIndex].Objects)] := WasAuchImmer;

Ich würde das ja gerne so machen, das wäre ja auch nicht das Problem, bloß womit soll ich denn die ComboxBox-Item-Objects füllen. Ich habe die Zeiger auf die Bars nicht. Auf die möchte ich ja gerne zugreifen. Wie kann ich das tun?

luckystar85 24. Feb 2009 13:32

Re: GanttSeries-Elemente einfärben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im angehängtem Bild ist ein Beispiel für ein TChart mit Gantt. Der rote Rahmen ist die GanttSeries und der blaue Rahmen ist der Balken den ich einfärben möchte. Wie kann ich auf diesen von außeen zugreifen. Im OnClick kein Problem, aber sonst ???

Tyrael Y. 24. Feb 2009 13:36

Re: GanttSeries-Elemente einfärben
 
Hm dachte du hast es schon gelöst, oki, mal ein Blick in die Hilfe...


Zitat:

function AddGantt(Const AStart,AEnd,AY: Double; Const AXLabel: String): LongInt;

Beschreibung

Die Funktion AddGantt fügt einen neuen Gantt-Balken zur Reihe hinzu. Jeder Gantt-Balken verfügt über die folgenden Parameter: AStart und AEnd, die Anfangs- und Endkoordinaten des horizontalen Gantt-Balkens. Dabei kann es sich um normale Gleitkommawerte oder Datum-/Uhrzeit-Werte handeln.
AY ist die vertikale Gantt-Balkenkoordinate. Sie können beliebig viele Gantt-Balken mit derselben oder einer anderen vertikalen Koordinate hinzufügen. Die vertikale Koordinate hat normalerweise einen mit Null beginnenden Startwert, doch können Sie einen beliebigen anderen Wert benutzen.

AXLabel entspricht dem zugehörigen Gantt-Balkentext. Dieser wird optional an der vertikalen Achse und an TGanttSeries.Marks als Beschriftung angezeigt.
Sie können Verbindungslinien zwischen Gantt-Balken mit der Eigenschaft TGanttSeries.NextTask zuweisen. Mit dieser Eigenschaft oder durch Aufruf der Methode TChartSeries.ValueColor oder der Methode TGanttBar.AddGanttColor können Sie jedem Gantt-Balken eine spezielle Farbe zuweisen. Diese Funktion liefert den zugehörigen internen Punktindex. Sie können dann über den Index auf diesen Gantt-Balken verweisen. Neu hinzugefügte Punkte werden optional in auf- oder absteigender Reihenfolge nach ihren horizontalen oder vertikalen Koordinaten sortiert. Sie können die Sortierung abschalten, indem Sie die Order-Eigenschaft von XValues und YValues auf den Wert loNone setzen.

guinnes 24. Feb 2009 14:12

Re: GanttSeries-Elemente einfärben
 
Zitat:

Zitat von luckystar85
Beim Add bekomm ich auch nur den Index zurück,....

Was willst du noch mehr ? Das ist der Index, den du benutzen kannst, um auf das Array der ValueColor s zuzugreifen

luckystar85 24. Feb 2009 14:29

Re: GanttSeries-Elemente einfärben
 
Zitat:

Zitat von Tyrael Y.
Hm dachte du hast es schon gelöst, oki, mal ein Blick in die Hilfe...


Zitat:

function AddGantt(Const AStart,AEnd,AY: Double; Const AXLabel: String): LongInt;

Beschreibung

Die Funktion AddGantt fügt einen neuen Gantt-Balken zur Reihe hinzu. Jeder Gantt-Balken verfügt über die folgenden Parameter: AStart und AEnd, die Anfangs- und Endkoordinaten des horizontalen Gantt-Balkens. Dabei kann es sich um normale Gleitkommawerte oder Datum-/Uhrzeit-Werte handeln.
AY ist die vertikale Gantt-Balkenkoordinate. Sie können beliebig viele Gantt-Balken mit derselben oder einer anderen vertikalen Koordinate hinzufügen. Die vertikale Koordinate hat normalerweise einen mit Null beginnenden Startwert, doch können Sie einen beliebigen anderen Wert benutzen.

AXLabel entspricht dem zugehörigen Gantt-Balkentext. Dieser wird optional an der vertikalen Achse und an TGanttSeries.Marks als Beschriftung angezeigt.
Sie können Verbindungslinien zwischen Gantt-Balken mit der Eigenschaft TGanttSeries.NextTask zuweisen. Mit dieser Eigenschaft oder durch Aufruf der Methode TChartSeries.ValueColor oder der Methode TGanttBar.AddGanttColor können Sie jedem Gantt-Balken eine spezielle Farbe zuweisen. Diese Funktion liefert den zugehörigen internen Punktindex. Sie können dann über den Index auf diesen Gantt-Balken verweisen. Neu hinzugefügte Punkte werden optional in auf- oder absteigender Reihenfolge nach ihren horizontalen oder vertikalen Koordinaten sortiert. Sie können die Sortierung abschalten, indem Sie die Order-Eigenschaft von XValues und YValues auf den Wert loNone setzen.

Das klingt ja schon mal richtig gut. Bloß mit Hilfe welcher Methode ist das möglich. Die zurück gegebenen Indizes habe ich ja schon in einer IntegerList gespeichert und der ComboBox zugewiesen. Jetzt ist nur die Frage mit Hilfe welcher Methode kann ich denn auf die Referenzen der Serie zugreifen?

guinnes 24. Feb 2009 14:33

Re: GanttSeries-Elemente einfärben
 
Hab ich das richtig verstanden, du willst mehrere, zusammenhängende Balken gleichzeitig färben ?

Tyrael Y. 24. Feb 2009 14:40

Re: GanttSeries-Elemente einfärben
 
Delphi-Quellcode:
...
  einIndex := myGantSeries.addGantt(....);
...
  meinBalken := myChart.Series[einIndex];
...
//jetzt aber zackig fertig programmieren ;)

luckystar85 24. Feb 2009 14:42

Re: GanttSeries-Elemente einfärben
 
Zitat:

Zitat von Tyrael Y.
Delphi-Quellcode:
...
  einIndex := myGantSeries.addGantt(....);
...
  meinBalken := myChart.Series[einIndex];
...
//jetzt aber zackig fertig programmieren ;)

Das ist ja denn nicht der Balken, sondern der Pointer auf die Serie (Sammelung von Balken). Ich habe immer noch einen Chart1.SeriesCount von 1 wenn ich mit AddGantt einen Balken hinzugefügt habe. Bei Chart1.Series habe ich ja nur die GanttSeries drin. Aber Lösung ist trotzdem in Sicht:
Sorry, jetzt habe ich es. Ich wusste nicht das man auch direkt auf der Serie die Farbe setzen kann. Ich dachte man muss es explizit dem Balken setzen. Damit sollte es gehen. Ich werde es mal testen.

Delphi-Quellcode:
ActionSeries.ValueColor[CurrentAction.CurrentValueIndex] := ( Not ColorToRGB(ActionSeries.ValueColor[CurrentAction.CurrentValueIndex]) ) And $00FFFFFF;

guinnes 24. Feb 2009 14:58

Re: GanttSeries-Elemente einfärben
 
Zitat:

Zitat von luckystar85
Das ist ja denn nicht der Balken, sondern der Pointer auf die Serie (Sammelung von Balken).

Der Index, den du bei add zurückkriegst, ist der einzelne Balken
Zitat:

Ich habe immer noch einen Chart1.SeriesCount von 1 wenn ich mit AddGantt einen Balken hinzugefügt habe.
Du hast ja auch nur eine Serie. ValueColor ist ein Array, in dem die Farbe jedes einzelnen Punktes gespeichert ist. Der Index für dieses Array ist der Wert, den Add zurückgibt. Den nach TObject casten und in die Combobox und gut ist


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz