AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende

Ein Thema von DieDolly · begonnen am 3. Okt 2019 · letzter Beitrag vom 4. Okt 2019
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende

  Alt 4. Okt 2019, 08:56
Hallo,
Zitat:
initialisiert?
CustomSeries := TCustomSeriesClass(TAreaSeries.Create(FormMain.Chart1));

Oha, jetzt sehe ich da ja den harten Type Cast.
Das geht glaube ich so nicht ...

Müsste es nicht so heißen?

CustomSeries := TCustomSeriesClass.Create(FormMain.Chart1);
Heiko
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende

  Alt 4. Okt 2019, 12:26
Hallo,
Zitat:
initialisiert?
CustomSeries := TCustomSeriesClass(TAreaSeries.Create(FormMain.Chart1));

Oha, jetzt sehe ich da ja den harten Type Cast.
Das geht glaube ich so nicht ...

Müsste es nicht so heißen?

CustomSeries := TCustomSeriesClass.Create(FormMain.Chart1);
Wenn man nur TCustomSeriesClass.Create nimmt stzatt TAreaSeries, dann bekommt man nicht den Chart den man erstellen möchte.

Ich selbst habe damit noch nicht gearbeitet, aber wäre das nicht ein Fall für eine Helferklasse bzw. class helper, anstatt eine neue Klasse abzuleiten?

Wenn ich das Konzept der class helper richtig verstanden habe, ist das genau für das da, was du anscheinend erreichen willst ...
Die Series haben viele Properties. Aber eine fehlt mir und genau die möchte ich hinzufügen.

So?
Delphi-Quellcode:
 TCustomSeriesClass = class helper for TCustomSeries
 public
  class var SeriesGroup: TSeriesGroup;
 end;
Und überall dann nur noch die Chart-eigene Klasse TCustomSeries verwenden?

Geändert von DieDolly ( 4. Okt 2019 um 12:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
916 Beiträge
 
Delphi 12 Athens
 
#3

AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende

  Alt 4. Okt 2019, 12:58
Class var ist da vermutlich falsch, eher so
Delphi-Quellcode:
TCustomSeriesClass = class helper for TCustomSeries
 public
   SeriesGroup: TSeriesGroup;
 end;
Und ja, falls ich das Konzept richtig verstanden habe, dann erhalten dadurch überall in deinem Projekt alle Objekte vom Typ TCustomSeries die Eigenschaft SeriesGroup.
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#4

AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende

  Alt 4. Okt 2019, 13:04
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ß)
ShowMessage(Ord(TCustomSeries(Chart1.Series[0]).SeriesGroup).ToString); Egal ob Series 0, 1 oder 2. Ord(SeriesGroup) ist immer 3, obwohl ich jeder Series ein anderes Enum zuweise.

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.SeriesGroup := SeriesGroup;
.....
Hier habe ich es mal mit einer ziemlich bösen Lösung versucht. Ausnutzung des Tag-Properties
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);

Geändert von DieDolly ( 4. Okt 2019 um 13:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
916 Beiträge
 
Delphi 12 Athens
 
#5

AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende

  Alt 4. Okt 2019, 13:37
Ok, habe grade gelernt, dass Class helper keine neuen Felder hinzufügen können, sondern nur Methoden ... dann fällt das natürlich raus. https://www.delphipraxis.net/172414-class-helper.html

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 ...
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende

  Alt 4. Okt 2019, 13:39
Ein property sollte man eigentlich nicht missbrauchen. Aber in diesem Fall werde ich es sonst eh nicht nutzen.

Funktioniert jetzt
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Komponente zur Laufzeit um Eigenschaft erweitern, Fehler bei Programmende

  Alt 4. Okt 2019, 13:41
Ich versteh nicht was das Problem ist einfach eine Ableitung von TAreaSeries zu machen?
Das ist sowohl die einfachste als auch sauberste Lösung.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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