AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CustomControl Vererbung und Paint

Ein Thema von stOrM · begonnen am 13. Sep 2017 · letzter Beitrag vom 13. Sep 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#1

CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 18:40
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:
  TBlubb = class(TCustomControl)
protected
   procedure Paint; override;
.....


   TBlubbA = class(TBlubb)
protected
   procedure Paint ?????
Mit einem nochmaligen override gehts jedenfalls nicht, da wird nur Paint von TBlubb ausgeführt.
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 18:59
Du willst also die vorletzte Hierarchieebene aufrufen?

Ich habe dazu etwas gefunden:
http://www.delphipraxis.net/53075-ve...inherited.html
http://www.delphipraxis.net/14523-me...rspringen.html

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).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 19:34
Wieso sollte ein nochmaliges Überschreiben nicht funkionieren? Das wäre ja gegen alles, was ich von OOP so kenne. Gegenbeispiel:
Delphi-Quellcode:
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;
Da kommen alle Messages schön von "oben" nach "unten" durchgeblubbert, hab ich auch nicht anders erwartet.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 20:07
Wieso sollte ein nochmaliges Überschreiben nicht funkionieren? Das wäre ja gegen alles, was ich von OOP so kenne. Gegenbeispiel:
Delphi-Quellcode:
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;
Da kommen alle Messages schön von "oben" nach "unten" durchgeblubbert, hab ich auch nicht anders erwartet.
Probier das mal mit der Paint Procedure so wie ich und versuche die mal 2x zu überschreiben, genau das ist ja das Problem z.Z.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 20:39
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 20:43
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.
Den hab ich doch oben schon gepostet

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:
 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;
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.
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.

Geändert von stOrM (13. Sep 2017 um 20:56 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 21:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 21:15
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;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 21:26
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;
Ok fast, klappt es. Das Inherited war falsch Irgendeinen Fehler hab ich wohl noch, jetzt wird zwar der Hintergrund geändert durch das Paint in Komponente 2 nur mal ich da noch eine rote Linie oben auf das OffscreenBitmap das zeigt er mir jetzt dafür nicht mehr an Mal gucken wo da jetzt der Fehler ist. Erledigt....

Geändert von stOrM (13. Sep 2017 um 21:32 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: CustomControl Vererbung und Paint

  Alt 13. Sep 2017, 21:40
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:
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;
Bei inherited kommt es also durchaus darauf an, wo man es aufruft und nicht nur, dass man es aufruft oder es eben nicht aufruft.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz