![]() |
CustomControl Vererbung und Paint
Moin,
bräuchte mal kurz eine Erklärung wie man folgendes macht: Ich erstelle eine neue Komponente TBlubb von TCustomControl, welche Paint überschreibt, soweit noch alles gut. Wenn ich jetzt eine weitere Komponente TBlubbA erstelle diesmal von TBlubb abgeleitet wie überschreibt man jetzt das Paint von TBlubb? Sieht dann so aus zur Zeit:
Delphi-Quellcode:
Mit einem nochmaligen override gehts jedenfalls nicht, da wird nur Paint von TBlubb ausgeführt.
TBlubb = class(TCustomControl)
protected procedure Paint; override; ..... TBlubbA = class(TBlubb) protected procedure Paint ????? Sinn dahinter ist, sehr viele Eigenschaften der Hauptkomponente können so bleiben, es kommen bei den anderen Komponenten Eigenschaften hinzu je nachdem welche Komponente benötige ich dann im Paint andere Sachen die ich zeichnen muss. Deshalb wollte ich es mir einfach machen und nicht jedes Mal wieder alles deklarieren, was in der Basis schon da ist. |
AW: CustomControl Vererbung und Paint
Du willst also die vorletzte Hierarchieebene aufrufen?
Ich habe dazu etwas gefunden: ![]() ![]() Vielleicht hilft Dir das weiter. Ganz genau habe ich das jetzt nicht nachvollzogen. Evtl. ist es sauberer, eine gemeinsame Basisklasse zu schaffen und/oder ein Flag UseOriginalPaintMethode. Wenn das gesetzt ist (was man in Constructor machen kann wird inherited Paint aufgerufen und sonst MyNewPaint (welches selbst auch überschrieben werden kann). |
AW: CustomControl Vererbung und Paint
Wieso sollte ein nochmaliges Überschreiben nicht funkionieren? Das wäre ja gegen alles, was ich von OOP so kenne. Gegenbeispiel:
Delphi-Quellcode:
Da kommen alle Messages schön von "oben" nach "unten" durchgeblubbert, hab ich auch nicht anders erwartet.
type
TClassA = class protected procedure Blubb; virtual; end; TClassB = class(TClassA) protected procedure Blubb; override; end; TClassC = class(TClassB) protected procedure Blubb; override; end; TClassD = class(TClassC) public procedure Blubb; override; end; { TClassA } procedure TClassA.Blubb; begin ShowMessage('Bubb aus Class A'); end; { TClassB } procedure TClassB.Blubb; begin inherited; ShowMessage('Blubb aus Class B'); end; { TClassC } procedure TClassC.Blubb; begin inherited; ShowMessage('Blubb aus Class C'); end; { TClassD } procedure TClassD.Blubb; begin inherited; ShowMessage('Blubb aus Class D'); end; procedure TForm5.FormCreate(Sender: TObject); var Dingens: TClassD; begin Dingens := TClassD.Create; try Dingens.Blubb; finally Dingens.Free; end; end; |
AW: CustomControl Vererbung und Paint
Zitat:
|
AW: CustomControl Vererbung und Paint
Entweder eine Methode ist virtuell und kann somit überschrieben werden, oder sie ist es nicht. Ob die nun Paint heißt oder PinkelNichtInDieEcke, welche Rolle sollte das spielen? Zeig doch mal Deinen Code, irgendwo machst Du sicherlich etwas falsch.
|
AW: CustomControl Vererbung und Paint
Zitat:
Vielleicht erkläre ich das mal anders, die Hauptkomponente wird von TCustomControl abgeleitet, Paint wird mittels override überschrieben, in der Paint Procedure male ich ein bisschen rum. Jetzt erstelle ich eine neue Komponente aber diesmal nicht von TCustomControl sondern von meiner ersten Komponente abgeleitet. Diese sollte wieder eine Paint Procedure besitzen, aber die muss natürlich die Paint Procedure meiner ersten Kompoente überschreiben und genau das geht eben nicht, da diese ja CustomControl Paint überschreibt. Das auf Virtual zu setzen geht nicht bzw. geht nicht ist nicht richtig kann man machen hat nur das Ergebnis das z.B. der Hintergrund der Hauptkomponente der vorher Rot war nun weiß gemalt wird das wohl dem Default von CustomControl entspricht. Soweit ich weiß ist ja TCustomControl.Paint virtual kann ja auch einmalig überschrieben werden was ich ja mit Komponente1 auch mache nur Komponente2 kann Paint von Komponente1 nicht überschreiben. Ich hoffe es ist so deutlicher. Mail ein Beispiel so wie ich denke das es sein
Delphi-Quellcode:
Sagen wir mal bei TBlubb wird der Hintergrund der Kompoente mit Rot gefüllt. Wenn ich Jetzt die Ableitung in Komponente2 von TBlubb mache und dort den Hintergrund auf grün setze, bleibt dieser Rot.
TBlubb = class(TCustomControl)
protected procedure Paint; virtual; ---- procedure TBlubb.Paint; begin // bisschen rumpinseln... inherited; end; // Komponente2 type TBlubb2 = class(TBlubb) protected procedure Paint; override; // hier sollte TBlubb.Paint überschrieben werden und nicht TCustomControl.Paint.... ... procedure TBlubb2.Paint; begin // den Bereich zeichen der nicht in TBlubb enthalten ist inherited; end; Da anscheinend eben Paint aus TBlubb nicht durch Paint aus TBlubb2 überschrieben wird. Das einzige was ich machen kann Paint in TBlubb nicht zu implementieren und nur in TBlubb2 zu implementieren, was nicht wirklich die Lösung ist, da ich beides benötige. |
AW: CustomControl Vererbung und Paint
Soll denn in TBlubb2.Paint das Gleiche gemacht werdenn, wie in TBlubb.Paint?
Jedenfalls machst Du (ausgehend von Deinem Beispiel) zuerst etwas und dann lässt Du per inherited auch noch das machen, was im Paint des Vorgängers geschieht. Wenn Du also im Paint von TBlubb2 etwas rot machst und dann das Paint von TBlubb aufrufst, ist es klar, dass die Farbe vom Paint des TBlubb übrig bleibt, also das Grünmachen nach Deinem Rotmachen erfolgt. Wenn das Paint von TBlubb aufgerufen werden muss, dann zuerst das inherited aufrufen und dann die eigene Ergänzung machen. Soll aber das Paint vom Vorgänger nicht aufgerufen werden, dann das inherited weglassen. |
AW: CustomControl Vererbung und Paint
Du machst wohl nur einen Denkfehler.
Du kannst Paint in jedem Derivat überschreiben:
Delphi-Quellcode:
procedure TBlubb2.Paint;
begin // wenn Du hier etwas zeichnest, wird das durch inherited Paint (falls Du es aufrufst) wieder übermalt inherited; // Zeichnet das von TBlubb - aber Du kannst inherited auch weg lassen und alles neu zeichnen // hier weiteres hinzumalen end; |
AW: CustomControl Vererbung und Paint
Zitat:
|
AW: CustomControl Vererbung und Paint
Wenn Du mal den ganzen Quelltext posten würdest, könnte man Dir sogar gezielt helfen und müsste nicht permanent raten, wo denn da jetzt ein Problem liegen könnte, dass es per Definition garnicht geben kann.
inherited wird dann aufgerufen, wenn die Methode des Vorgängers aufgerufen werden soll und zwar genau an der Stelle, an der die Methode des Vorgängers aufgerufen werden soll. Möglich wäre also sowas:
Delphi-Quellcode:
Bei inherited kommt es also durchaus darauf an, wo man es aufruft und nicht nur, dass man es aufruft oder es eben nicht aufruft.
procedure TBlubb2.Paint;
begin inherited; // Mache nur das, was auch der Vorgänger macht. end; procedure TBlubb2.Paint; begin // Mache was eigenes ... inherited; // und dann das, was auch der Vorgänger macht. end; procedure TBlubb2.Paint; begin inherited; // Mache das, was auch der Vorgänger macht. // und dann was eigenes ... end; procedure TBlubb2.Paint; begin // Mache was eigenes, inherited; // dann das, was auch der Vorgänger macht ... // und dann noch was eigenes ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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