AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Thema durchsuchen
Ansicht
Themen-Optionen

RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

Ein Thema von Redeemer · begonnen am 23. Aug 2017 · letzter Beitrag vom 30. Okt 2018
Antwort Antwort
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.118 Beiträge
 
Delphi 2009 Professional
 
#1

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Sep 2017, 14:00
Habe die neue Version 0.2b-alpha um die Lösung mit dem alternativen UTF-8-Encoding ergänzt. Der Download enthält jetzt das Projekt für die Demoanwendung.

In dem Projekt, in dem ich das nutze, habe ich leider ein Problem:
Delphi-Quellcode:
type TSVGImage = class(TPNGImage)
  ...
end;

...

procedure DoSomething();
var
  GraphicClass: TGraphicClass;
  Graphic: TGraphic;
begin
  GraphicClass := TSVGImage;
  Graphic := GraphicClass.Create(); // Ruft TPNGImage.Create() auf. (schlecht)
  // ...aber...
  Graphic := TSVGImage.Create(); // Ruft TSVGImage.Create() auf. (gut)
end
Das liegt wohl daran, dass ich bei Create reintroduce verwende statt override, denn die CreateBlank-Methode des zugrundeliegenden PNG-Bilds benötigt die Create-Methode des PNG-Bilds, weshalb ich Create nicht überschreiben kann. Habt ihr da Ideen?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Sep 2017, 14:21
]Das liegt wohl daran, dass ich bei Create reintroduce verwende statt override, denn die CreateBlank-Methode des zugrundeliegenden PNG-Bilds benötigt die Create-Methode des PNG-Bilds, weshalb ich Create nicht überschreiben kann. Habt ihr da Ideen?
Hä, wieso nicht override?
Du rufst doch den TPNGImage.CreateBlank innerhalb deines TSVGImage.Create auf. Muss doch gehen ohne reintroduce.

Delphi-Quellcode:
...
  public
    constructor Create(); override;
    procedure LoadFromStream(Stream: TStream); override;
end;

constructor TSVGImage.Create;
begin
  inherited CreateBlank(COLOR_RGBALPHA, 8, 1, 1); // 0 führt beim Setzen einer neuen Größe zum Fehler
end;
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.118 Beiträge
 
Delphi 2009 Professional
 
#3

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Sep 2017, 16:56
inherited CreateBlank ruft Create auf. Wenn ich Create überschreibe, gibt's also 'ne endlose Rekursion und damit einen Stack Overflow.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 4. Sep 2017, 08:14
inherited CreateBlank ruft Create auf. Wenn ich Create überschreibe, gibt's also 'ne endlose Rekursion und damit einen Stack Overflow.
Ja richtig, da habe ich nicht mitgedacht bzw. nicht ausprobiert.

Du musst letztendlich gar nichts hinschreiben und es sollte dann so gehen wie gewünscht:

Delphi-Quellcode:

type
  TMyPngImage = class(TPngImage)
  public
    constructor Create;
  end;

...

{ TMyPngImage }

constructor TMyPngImage.Create;
begin
  inherited CreateBlank(COLOR_RGBALPHA, 8, 1, 1);
end;
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.961 Beiträge
 
Delphi 12 Athens
 
#5

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 4. Sep 2017, 08:52
Das ist einer der Gründe weshalb Konstruktoren möglichst schlank sein sollten. In diesem Fall reicht es doch CreateBlank nicht als Konstruktor zu implementieren (was ohnehin nicht schön ist), sondern als simple Methode. Der überschriebene Konstruktor ruft dann CreateBlank und nur inherited auf, das war es.
Sebastian Jänicke
AppCentral
  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 21:10 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