![]() |
AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Ohne class var funktioniert es nicht.
Aber das ist alles irgendwie noch komisch. Ich erzeuge 3 Series mit 3 unterschiedlichenj SeriesGroup-Typen. Wenn ich den ordinalen Wert von SeriesGroup der Series abfrage, kommt immer 3 raus (das Enum ist 3 groß)
Delphi-Quellcode:
Egal ob Series 0, 1 oder 2. Ord(SeriesGroup) ist immer 3, obwohl ich jeder Series ein anderes Enum zuweise.
ShowMessage(Ord(TCustomSeries(Chart1.Series[0]).SeriesGroup).ToString);
Delphi-Quellcode:
Hier habe ich es mal mit einer ziemlich bösen Lösung versucht. Ausnutzung des Tag-Properties
procedure CreateSeries(const SeriesType: TCustomSeries; const SeriesGroup: TSeriesGroup; const Name: string; const Color: Integer);
var CustomSeries: TCustomSeries; begin if Assigned(FormMain.Chart1.FindComponent(Name)) then Exit; if SeriesType = TCustomSeries(TAreaSeries) then CustomSeries := TCustomSeries(TAreaSeries.Create(FormMain.Chart1)) else if SeriesType = TCustomSeries(TLineSeries) then CustomSeries := TCustomSeries(TLineSeries.Create(FormMain.Chart1)) else if SeriesType = TCustomSeries(TBarSeries) then CustomSeries := TCustomSeries(TBarSeries.Create(FormMain.Chart1)) else CustomSeries := nil; if CustomSeries = nil then Exit; CustomSeries.Name := Name; CustomSeries.SeriesGroup := SeriesGroup; .....
Delphi-Quellcode:
TCustomSeriesClass = class helper for TCustomSeries
public function GetSeriesGroup: TSeriesGroup; procedure SetSeriesGroup(const SeriesGroup: TSeriesGroup); end; implementation {TCustomSeriesClass} function TCustomSeriesClass.GetSeriesGroup: TSeriesGroup; begin Result := TSeriesGroup(Self.Tag); end; procedure TCustomSeriesClass.SetSeriesGroup(const SeriesGroup: TSeriesGroup); begin Self.Tag := Ord(SeriesGroup); end; // Setzen CustomSeries.SetSeriesGroup(SeriesGroup); // Holen SeriesGroup := TCustomSeries(Chart1.Series[0]).GetSeriesGroup); |
AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Ok, habe grade gelernt, dass Class helper keine neuen Felder hinzufügen können, sondern nur Methoden ... dann fällt das natürlich raus.
![]() class var ist ja im Grunde nur eine globale Variable, die aber nur innerhalb der Klasse sichtbar ist. Wenn du mehrere Instanzen hast, und dieser Class Var etwas zuweist, dann gilt diese Zuweisung auch für alle anderen Instanzen dieser Klasse. Dann fällt mir nur noch ein, eine Ableitung von TChart zu erstellen, wodrin du das dann verwenden kannst. Oder halt mit Tag rumwerkeln ... |
AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Ein property sollte man eigentlich nicht missbrauchen. Aber in diesem Fall werde ich es sonst eh nicht nutzen.
Funktioniert jetzt :thumb: |
AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Ich versteh nicht was das Problem ist einfach eine Ableitung von TAreaSeries zu machen? :gruebel:
Das ist sowohl die einfachste als auch sauberste Lösung. |
AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Bin für Vorschläge immer offen. Wenn du weißt wie man das hier einbaut, immer her damit
Delphi-Quellcode:
procedure CreateSeries(const SeriesType: TCustomSeries; const SeriesGroup: TSeriesGroup; const Name: string; const Color: Integer);
var CustomSeries: TCustomSeries; begin if Assigned(FormMain.Chart1.FindComponent(Name)) then Exit; if SeriesType = TCustomSeries(TAreaSeries) then CustomSeries := TCustomSeries(TAreaSeries.Create(FormMain.Chart1)) else if SeriesType = TCustomSeries(TLineSeries) then CustomSeries := TCustomSeries(TLineSeries.Create(FormMain.Chart1)) else if SeriesType = TCustomSeries(TBarSeries) then CustomSeries := TCustomSeries(TBarSeries.Create(FormMain.Chart1)) else CustomSeries := nil; if CustomSeries = nil then Exit; CustomSeries.Name := Name; CustomSeries.SetSeriesGroup(SeriesGroup); CustomSeries.ParentChart := FormMain.Chart1; CustomSeries...... end; |
AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Ich hab mal was zusammengebaut:
Delphi-Quellcode:
TDollyAreaSeries = class(TAreaSeries)
private FSeriesGroup: TSeriesGroup; public property SeriesGroup: TSeriesGroup read FSeriesGroup write FSeriesGroup; constructor Create(AOwner: TComponent; ASeriesGroup: TSeriesGroup); reintroduce; end; TDollyLineSeries = class(TLineSeries) private FSeriesGroup: TSeriesGroup; public property SeriesGroup: TSeriesGroup read FSeriesGroup write FSeriesGroup; constructor Create(AOwner: TComponent; ASeriesGroup: TSeriesGroup); reintroduce; end; // etc. für jede Series Art die du brauchst... constructor TDollyAreaSeries.Create(AOwner: TComponent; ASeriesGroup: TSeriesGroup); begin inherited Create(AOwner); FSeriesGroup := ASeriesGroup; end; // Genauso für die anderen Ableitungen... ... // Der Übergabeparameter SeriesType von CreateSeries ist irgendwie komisch.. // Du übergibst eine Instanz um dann zu gucken was die Instanz für eine Klasse hat und dann noch eine Instanz zu erstellen? // Und der Vergleich ist auch seltsam - klappt das so überhaupt? // Ich würde eher sowas vorschlagen: type TDollySeriesType = (stArea, stLine, stBar); procedure CreateSeries(const SeriesType: TDollySeriesType; const SeriesGroup: TSeriesGroup; const Name: string; const Color: Integer); var CustomSeries: TCustomSeries; begin if Assigned(FormMain.Chart1.FindComponent(Name)) then Exit; CustomSeries := nil; case SeriesType of stArea: CustomSeries := TDollyAreaSeries.Create(FormMain.Chart1, SeriesGroup); stLine: CustomSeries := TDollyLineSeries.Create(FormMain.Chart1, SeriesGroup); stBar: CustomSeries := TDollyBarSeries.Create(FormMain.Chart1, SeriesGroup); end; if CustomSeries = nil then Exit; CustomSeries.Name := Name; CustomSeries.ParentChart := FormMain.Chart1; CustomSeries.Dark3D := True; CustomSeries.Color := Color; CustomSeries.ColorEachLine := True; CustomSeries.ClickableLine := False; CustomSeries.ClickTolerance := 5; CustomSeries.DrawStyle := dsCurve; CustomSeries.LinePen.Width := 2; if SeriesType <> stBar then begin CustomSeries.Pointer.Visible := True; CustomSeries.Pointer.Style := psCircle; CustomSeries.Pointer.Size := 5; CustomSeries.Pointer.InflateMargins := True; CustomSeries.Pointer.Frame.Visible := True; CustomSeries.Pointer.Shadow.Visible := False; CustomSeries.Marks.Visible := True; CustomSeries.Marks.Arrow.Style := psSolid; CustomSeries.Marks.UseSeriesTransparency := False; CustomSeries.AreaLinesPen.Visible := False; end; CustomSeries.Transparency := 60; CustomSeries.OnGetMarkText := FormMain.GetMarkText; CustomSeries.OnClickPointer := FormMain.ClickPointer; end; |
AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Was mit der Lösung dann aber nicht mehr funktioniert ist
Delphi-Quellcode:
. Oder überhaupt an SeriesGroup ran zu kommen ohne den Typ des Series zu wissen.
TCustomSeries(Series).GetSeriesGroup;
|
AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Dann mach ein Interface mit der SeriesGroup Property, implementier es in deinen Ableitungen und benutz das Interface um auf die Property zuzugreifen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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 by Thomas Breitkreuz