vermutlich habe ich ein Problem mit meiner "Klassenstruktur". Ich habe das Link Objekt hinzugefügt. Dieses ist vom Text Objekt abgeleitet. Leider wird im Link Objekt, die gewählte Hintergrund Farbe nicht übernommen, sondern in einer Standard Farbe gezeichnet, die ich zuweise, beim Installisieren der Brush Klasse.
Tut mir Leid das es so viel Text geworden ist, aber kürzer geht es leider nicht.
Es gibt verschiedene Klassen Strukturen. Ich nehme an, das ich ein Fehler bei den ersten Beiden Strukturen habe. Für jedes Objekt, was angezeigt wird, gibt es eine extra Style Klasse. Die genau für dieses Objekt zu geschnitten ist. Ich fange mal mit der ersten Klassenstruktur, die Style Klassen:
Ich habe eine eigne Klasse erstellt für Font, Brush und Pen. Ich hätte auch von den Standard Klassen ableiten können, aber so gefiel mir das besser.
Es gibt zwei Bases Klassen:
01) TPLTE_Style_Base
Diese Klasse stellt allgemeine Methoden und Eigenschaften zu Verfügung. Wie z.b. zwei Abstracte Virutalle Methoden: ToCanvas und Assigen. Außerdem zwei Property's: StyleName und OnChange.
02) TPLTE_Style_BaseExt
Diese Klasse ist von der ersten Klasse abgeleitet. Sie führt drei weitere Propertys ein: Level, ApartSpace(Außenabstand) und Align. Außerdem überschreibe ich hier ToCanvas und Assign. Wobei Assigen per
"reintroduce" überschrieben wird. Weil sich hier der Datentyp vom Parameter ändert.
03)TPLTE_Style_Pen, TPlTE_Style_Brush, TPLTE_Style_Font
Diese Klassen sollten klar sein, sie sind von "TPLTE_Style_Base" abgeleitet.
04) TPLTE_Style_Border
Diese Klasse stellt Eigenschaften für den Rand zu Verfügung. Später möchte ich jede Seite selbst zeichnen können und einfärben können. Im Moment wird hier nur eine Eigenschaft genutzt:
property B:TPLTE_Style_Pen
Jetzt Fangen die Objekt Bezogen Style Klassen an:
5) TPLTE_Style_ObjectSurface
Die Klasse ist von TPLTE_Style_BaseExt abgeleitet. Diese Klasse, ist für alle Objekte gedacht die einen Oberfläche haben, also einen Hintergrund haben. Das sind in etwa 99% aller Objekte. Legendlich die "Horizontale Linie" hat kein Hintergrund im eigentlichen sinne.
6) TPlTE_Style_ObjectText
Dieses Klasse ist von "TPLTE_Style_ObjectSurface" abgeleitet und fügt nur die Font Eigenschaft hinzu. Da ja jetzt auch die Schrift-Einstellungen geändert werden können.
7) TPLTE_Style_ObjectLink
Ist von TPLTE_Style_BaseExt abgeleitet und genau das ist das Problem. Tests haben ergeben, wenn ich die Klasse direkt von "TPlTE_Style_ObjectText", ableitet wird der Hintergrund gezeichnet.
Sonst wird der Hintergrund nur in der Standard Farbe gezeichnet, die ich beim Brush.Create gebe.
Alle diese 07 Klassen Speichern also nur Optische Eigenschaften. Eine Besonderheit ist und das ist auch für mich neu:
Ich ändere jedes mal den Datentyp von Assign darum verwende ich auch die Eigenschaft "reintroduce" um die Vorherige Methode zu verdecken. So habe ich es verstanden. Euch mag diese Struktur jetzt umständlich vorkommen, ist sie vielleicht auch, aber dafür sind alle Eigenschaften meiner Meinung nach richtig geordnet.
Diese Klassen währen jetzt ohne weitere Klassen wertlos. Jetzt folgt der zweite Teil, die Objekte, die etwas anzeigen, etwas dastellen, etwas zeichnen.
Die Wichtiges Objekte währen "TPLTE_ObjectSTD_Text" und "TPLTE_ObjectSTD_TextLink". Sowie die Container, aber die lasse ich erst einmal weg, weil sie vermutlich nichts mit dem Problem zu tun haben. Denke ich. Hier gibt es folgende Klassen:
Es gibt zwei Bases Klassen:
01) TPLTE_ObjectBase
Diese Klasse stellt die meisten Grund Eigenschaften die jedes Objekt hat zu Verfügung. Wie z.b. Left, Top, Width, height, Name, Visible, Parent, einige Events wie MouseMove, MouseEnter, ..... und Style. Das ist im Moment die Eigenschaft um die es hier geht:
In dieser Klasse hat sie den Datentyp: "TPLTE_Style_BaseExt".
02) TPLTE_ObjectBaseSurface
Dieses Objekt Zeichnet den Hintergrund und ändert die Style Eigenschaft: "Style:TPLTE_Style_ObjectSurface". Ich verwendet jetzt die Getter und Setter Methoden und zwar so:
function GetStyle: TPLTE_Style_ObjectSurface; reintroduce; in der Methode: result:=TPLTE_Style_ObjectSurface(fStyle);
procedure SetStyle(const AValue: TPLTE_Style_ObjectSurface); reintroduce; in der Methode: fStyle:=AValue;
Wie ihr seht ändere ich hier die Parameter. Jetzt kommt der Fehler den ich nicht verstehe:
Wenn ich hier in der Paint Methode eine Ausgabe in die Console mit Writeln mache und mir nach dem Style.ToCanvas(...) die Canvas.Brush.Color Eigenschaft ausgeben lasse, stehen hier die Richtigen Werte drin. Gezeichnet wird jedoch in einer ganz anderen Farbe. Warum ?
Die Style Eigenschaft ändern je nach Klassen den Datentyp. Was ja auch der Sinn der Sache ist.
03) TPLTE_ObjectSTD_Text
Ist abgeleitet von "TPLTE_ObjectBaseSurface", da es einen Hintergrund besitzt.
04) TPLTE_ObjectSTD_TextLink
Ist abgeleitet von "TPLTE_ObjectSTD_Text", da ein Link eigentlich auch nur ein normaler Text ist mit besonderen Eigenschaften und Fähigkeiten.
Genau hier liegt das Problem. Die Style sind anders. Bei jedem Create der Klassen, z.b. beim Text Objekt, oder beim Surface Objekt erstelle ich zu erst die
fStyle:=TPLTE_Style_ObjectLink.Create;
Die fstyle Klasse stammt vom Ur Klasse ab: "01) TPLTE_ObjectBase".
Im Gesammten Vorgang wird das berücksichtigt:
Code: Alles auswählen
if not Assigned(Style) then begin
fStyle:=TPlTE_Style_ObjectText.Create;
end;
inherited Create(aCanvas);
.....
Und nun die Preisfrage: Warum ist das so ? Wo ist mein Fehler ? Was mache ich Falsch ? Kennt jemand die Lösung bzw. die Antwort auf diese Frage ?
Sollten die Informationen nicht ausreichen, hänge ich die beiden Unit's um die es geht noch an den beitrag ran.