![]() |
PL TextEngine: Klassenstruktur Problem.... ?
Hallo,
vor vier Tagen habe ich hier eine Frage gestellt: ![]() Wenn ihr mir Informationen braucht könnt ihr es gerne sagen. Das Projekt möchte ich eigentlich noch nicht Hochladen, aber wenn jemand wirklich bereit ist sich das Projekt anzuschauen würde ich es ihn zukommen lassen. Ich komme aufjedenfall seit Tagen nicht mehr weiter. Die Lösung die ich gefunden habe gefällt mir einfach nicht(steht im Link). Weil sie meine ganze Struktur durcheinander bringen würde. Auf der anderen Seite könnte ich weitere Fehler in meiner Klassenstruktur gemacht haben, die damit zusammen hängen. Danke ! PS: Ich hoffe ihr habt nichts gegen dieser Art von "Crossposting"(hieß das so) ? Bei Sprache gebe ich erst einmal Lazarus an. Auch wenn es sich um "Object Pascal", handelt. |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Dein Text ist einfach zu allgemein formuliert, als das man dir konkret helfen könnte. Dafür müsste man alles selber implementieren, um deine beschriebenen Probleme nachempfinden zu können, um dann Lösungen zu erarbeiten.
Aber ehrlich gesagt, habe ich dafür keine Zeit und Lust. Vermutlich wird es anderen ähnlich gehen, deshalb wird dir auch nicht geholfen, aber vielleicht irre ich mich ja auch... |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Ja ! das habe ich auch schon vermutet. Leider kann ich es nicht an einem Test Projekt nach bilden. Ich könnte höchsten die beiden Unit's um die es hier geht rein stellen.
Ich hatte die Hoffnung das ich Irgendwo einfach nur einen kleinen Fehler gemacht habe. |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Auch um kleine Fehler zu finden, benötigt man irgendwas, worin man diese sucht...
Die Methoden die sich mit dem Canvas und dem Zeichnen beschäftigen, dürften wohl am wichtigsten sein. Deine Beschreibung beinhaltet nicht mal von welcher Klasse jeweils abgeleitet wurde. |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Liste der Anhänge anzeigen (Anzahl: 2)
Die ersten Klassen sind jeweils im Moment von TObject abgeleitet. Direkt. Das Ändere ich später allerdings noch, so dass die Klassen auch im OI angezeigt werden können.
Delphi-Quellcode:
Z.B. hier sollte man doch annehmen, das ALL Rechtecke die gezeichnet werden, blau sind oder ? Sind sie aber nicht. nehme ich das FillRect raus, wird gar kein Rechteck gezeichnet.
procedure TPLTE_ObjectBaseSurface.Paint;
begin if Visible then begin Style.ToCanvas(canvas); Canvas.Brush.Color:=clBlue; Canvas.FillRect(Left, Top, (Left+Width)-ExtraWidht, (Top+Height)-ExtraHeight); end; end; Ich hänge mal beide Units hier dran. Die beiden Units beinhalten allerdings nur einen kleinen Teil. Hinzu kommen noch Container und die eigentliche "TPLTextEngine", die ist direkt von TCusomControl abgeleitet. Container haben ihr eigenen Canvas(eine Variable vom Typ TBitMap). Allerdings sind auch Container Objekte. Zum unterschied: Container haben ihr eigenen Buffer, Objekte zeichnen nun in diesen Buffer rein. Wenn Nötig kann ich die Container Unit auch gerne hochladen. Erst einmal Danke für eure Antworten. Ich dachte ich hätte genügend Informationen geliefert mit meiner "kleinen" Beschreibung. Das Ganze Projekt besteht im Moment aus Vier Units und einem "Fenster" |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Auffallend ist in der Unit uPLTE_Style, daß die Objekte teilweise Objektproperty besitzen, diese Objekte aber nicht selbst erzeugen. Intern werden diese Objektproperty benutzt ohne auf nil zu prüfen. Es gibt auch keine Benachrichtigung wenn solche Objekte freigegeben werden.
Wenn tatsächlich ein und das selbe Objekt verwendet wird, wäre die Verwendung von Interfaces mit Referenzzählung sicherer. Sollen aber nur die Eigensschaften zum Zeitpunkt der Zuweisung übernommen werden, muss die jeweilige Klasse eigene Objekte erzeugen und die Eigenschaften per Assign übernehmen. Die Ursache des jetzigen Darstellungsfehlers ist aber wahrscheinlich nicht in diesen Units zu suchen. |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Zitat:
Zitat:
Zitat:
Könnte die Ursache es auch eine Ursache sein, dass sich irgendwie Objekte überlagern ? So sieht es für mich aus. Allerdings weiß ich nicht was ich dagegen tun kann. Was ich auch nicht verstehe ist, wenn ich kurz bevor ich den Hintergrund Zeichne, die Hintergrund Farbe setzte, müssten eigentlich alle Objekte in dieser Farbe gezeichnet werden. Tut es aber nicht. Das Seltsame ist auch: Mit der Font Eigenschaft geht es. Nur die Brush Eigenschaft stellt sich quer. Wenn nötig, lade ich die zwei anderen Units auch noch hoch. Aber ich werde erst mal deinen Vorschlag ausprobieren sobald mir klar ist, wie du es genau gemeint hast. Zitat:
Erst mal Danke für deine Antworten und für dein Vorschlag. Wie genau meinst das mit Assign ? Beim Zeichnen rufe ich nur ToCanvas auf. Das ist die meist verwendete Methode. Alle Style haben sie. |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Meine Bedenken beziehen sich auf den Schreibzugriff auf Objektproperty, z.B. auf Border in der Klasse TPLTE_Style_ObjectSurface.
Das Objekt fBorder wird von der Klasse erzeugt und freigegeben, andere Objekte sollten deshalb keinen direkten Schreibzugriff erhalten. Das sollte IMO so aussehen:
Delphi-Quellcode:
Wenn du das Projekt hier nicht an deinen Beitrag hängen möchtest, kannst du es mir auch per PN zukommen lassen.
type
TPLTE_Style_ObjectSurface = class(TPLTE_Style_BaseExt) private fBorder: TPLTE_Style_Border; protected procedure SetBorder(aBorder: TPLTE_Style_Border); virtual; published property Border: TPLTE_Style_Border read fBorder write SetBorder; end; procedure TPLTE_Style_ObjectSurface.SetBorder(aBorder: TPLTE_Style_Border); begin fBorder.Assign(aBorder); end; |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Danke für den Tipp. Ich werde es gleich mal Testen.
Das heißt also, jedes Objekt sollte seine eigene Style Klasse erzeugen. Beim Schreibzugriff verwende ich dann einfach Assigen und Caste dann. PS: Ich habe dir eine PM gesendet. Der Soruce-Code ist nicht gerade aufgeräumt du wirst viele "Code Leichen" finden. Es ist halt ein Prototyp. |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe es jetzt so probiert:
Delphi-Quellcode:
leider keine Auswirkung. Ich hänge mal ein Bild dran. Dann weißt du was ich meine.
procedure TPLTE_Style_ObjectSurface.SetBoder(const AValue: TPLTE_Style_Border);
begin fBorder.Assign(AValue); end; // TPLTE_Style_ObjectSurface.SetBoder procedure TPLTE_Style_ObjectSurface.SetBrush(const AValue: TPLTE_Style_Brush); begin fBrush.Assign(AValue); end; // TPLTE_Style_ObjectSurface.SetBrush Eigentlich sollte es keinen Orange Fläche geben, sondern nur Blau. |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Ich habe noch mal etwas nach geforscht und mir ist ein weiterer Fehler aufgefallen:
Delphi-Quellcode:
rate mal was in writeln drin steht. Da steht false drin. Dadurch kommt der Fehler zu Stande, die Frage ist jetzt, warum ist das False. Das dürfte gar nicht. im Übrigen geht die Schrift Farbe nur wenn ich kein FillRect anwende.
procedure TPLTE_ObjectBaseSurface.Paint;
begin if Visible then begin Style.ToCanvas(canvas); if (self is TPLTE_ObjectSTD_TextLink) then begin writeln(assigned(Style.Brush)); end; Canvas.FillRect(Left, Top, (Left+Width)-ExtraWidht, (Top+Height)-ExtraHeight) end; // Canvas.Rectangle(Left, Top, (Left+Width)-ExtraWidht, (Top+Height)-ExtraHeight); end; // TPLTE_ObjectBaseSurface.Paint Edit01: Wenn ich mir noch den Classenamen ausgeben lasse von Style kommt da "TPLTE_Style_ObjectLink" Das darf eigentlich gar nicht sein. Ich denke das ist die Ursache. Eine Lösung habe ich damit leider noch nicht. Edit02: Ich bin mir unsicher im Moment, ich glaube aber das dieses Verhalten richtig ist. Denn ein Link hat nun mal kein Brush im Style. Edit03: Es wird immer Seltsamer:
Delphi-Quellcode:
Active.Brush.Color wird übernommen. So wie es aussieht. Allerdings wird er nicht intern verwendet !
{ TPLTE_Style_ObjectLink }
constructor TPLTE_Style_ObjectLink.Create; begin inherited Create; Link:=TPlTE_Style_ObjectText.Create; Link.brush.Color:=clLime; Link.Font.Color:=clRed; Active:=TPlTE_Style_ObjectText.Create; Active.Brush.Color:=clRed; // Focus:=TPlTE_Style_ObjectText.Create; // Hover:=TPlTE_Style_ObjectText.Create; // Visited:=TPlTE_Style_ObjectText.Create; // Modus:=OLM_Link; end; // TPLTE_Style_ObjectLink.Create Edit04: Wenn ich alles intern auf Active umstelle klappt es. Aber mit dem Style Link geht es nicht.
Delphi-Quellcode:
Wenn ich beim erstellen des Objektes ebenfalls auf Active zurückgreife geht es.
procedure TPLTE_Style_ObjectLink.Assign(const aStyle: TPLTE_Style_ObjectLink);
begin Active.Assign(aStyle.Active); // Hover.Assign(aStyle.Hover); end; // TPLTE_Style_ObjectLink.Assign Der Fehler liegt wahrscheinlich beim TPLTE_Style_ObjectLink würde ich sagen. Edit05: Ich verstehe die Welt nicht mehr:
Delphi-Quellcode:
Auf die Reihenfolgen kommt es an. Jetzt nimmt er die werte von Link. Immer das was ganz oben steht. Wie kann das sein ? Das Verhalten verstehe ich nicht.
TPLTE_Style_ObjectLink = class(TPLTE_Style_BaseExt)
private fCurrentStyle: TPlTE_Style_ObjectText; fModus: TPLTE_Style_ObjectLinkModus; fLink: TPlTE_Style_ObjectText; fActive: TPlTE_Style_ObjectText; fFocus: TPlTE_Style_ObjectText; fHover: TPlTE_Style_ObjectText; fVisited: TPlTE_Style_ObjectText; protected |
Re: PL TextEngine: Klassenstruktur Problem.... ? [Gelöst]
Problem endlich gelöst. Vielen Dank an Blup.
Die Lösung war ganz einfach(wie ich es mir gedacht hatte, nur ich habe sie übersehen bzw. nicht dran gedacht): Zitat:
|
Re: PL TextEngine: Klassenstruktur Problem.... ?
Wie schon gesagt wurde in GetSize auf Style.Font zugegriffen.
In einem TPLTE_ObjectSTD_TextLink ist Style aber eine Klasse, die kein Font property besitzt. Entsprechend wurde irgend ein Wert aus dem Speicher der Klasse gelesen. Dies muss, abhängig von der Reihenfolge der Deklaration, eine der TPlTE_Style_ObjectText variablen gewesen sein. TPLTE_Style_Font und TPlTE_Style_ObjectText sind beide von TPLTE_Style_Base abgeleitet. TPLTE_Style_Base deklariert virtuell bereits ToCanvas, so konnte tatsächlich ein Funktionsaufruf erfolgen. |
Re: PL TextEngine: Klassenstruktur Problem.... ?
Zitat:
Aber das währe eine Erklärung. Nun ja, ich konnte gestern endlich weiter machen. Das ist die Hauptsache. Ich finde die Klassenstruktur gar nicht so schlecht, oder ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20: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