Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [gelöst] eigenes SaveToStream für Metafiles realisieren (https://www.delphipraxis.net/83468-%5Bgeloest%5D-eigenes-savetostream-fuer-metafiles-realisieren.html)

kalmi01 3. Jan 2007 11:09


[gelöst] eigenes SaveToStream für Metafiles realisieren
 
Moin moin,

ich versuche gerade erfolglos einer von TObject abgeleiteten Klasse ein SaveToStream beizubringen.
Ein bischen was zum Hintergrund:
Ich habe eine Klasse, die (absichtlich) von TObject abgeleitet ist.
In dieser Klasse gibt es viele Dinge, die man so ähnlich auch in anderen Klassen findet, unter anderem auch ein paar Grafik-Funktionen, die mit Metafiles hantieren.
Anfangs hatte ich (um zu sehen ob es funktioniert reichts ja) nur Metafile.SaveToFile implementiert, was auch problemlos funktionierte :
Delphi-Quellcode:
      procedure TdwsDraw.SaveToFile(Name : string);
      begin
        if (Zeichnung <> nil)
        then FreeAndNil(Zeichnung);

        WMF.Metafile.SaveToFile(Name);
      end;
Nun wollte ich analog hierzu auch das SaveToStream implementieren:
Delphi-Quellcode:
      procedure TdwsDraw.SaveToStream(Stream : TStream);
      begin
        if (Zeichnung <> nil)
        then FreeAndNil(Zeichnung);

        WMF.Metafile.SaveToStream(Stream);
      end;
Allerdings stürzt mir die procedure mit EAbstractError bei "WMF.Metafile.SaveToStream(Stream);" ab.
Der Debugger stoppt bei "Metafile.SaveToStream(Stream);" ohne in die Graphics zu springen.

Der übergebene Stream ist so initialisiert:
Delphi-Quellcode:
WMFStream := TStream.Create;
worden.

Habe bereits umfangreich gesucht, aber nichts passendes gefunden, daher wäre ich für jede Anregung dankbar.

Der_Unwissende 3. Jan 2007 11:53

Re: Wie SaveToStream für Metafiles in eigener Klasse realisi
 
Zitat:

Zitat von kalmi01
Der übergebene Stream ist so initialisiert:
Delphi-Quellcode:
WMFStream := TStream.Create;
worden.

Hi,
du bekommst einen Abstrakten Fehler, da du hier mit einer abstrakten Klasse arbeitest. Abstrakt ist eine Klasse immer dann, wenn mind. eine ihrer Funktionen abstrakt ist (virtual; abstract; markiert).
Solche abstrakten Methoden werden nur als Signatur in der Klasse angegeben, nicht jedoch implementiert. Die Frage nach dem Sinn davon lässt sich auch leicht an diesem Beispiel erklären, du verwendest abstrakte Klassen einfach als Basisklassen. Hier in diesem Fall ist TStream die Basis für ganz unterschiedliche Klassen, z.B. TMemoryStream und TFileStream. Während ein TMemoryStream zum schreiben Arbeitsspeicher reservieren wird und die Daten dort ablegt, wird ein TFileStream die Daten natürlich in eine Datei schreiben. Intern werden also je nach Art des Stream völlig unterschiedliche Prozesse statt finden, trotzdem bieten sie nach außen die gleichen Methoden (z.B. write) an.
Speicherst du also Daten in (deines Metafiles) in einem Stream, dann kann es dir völlig egal sein, ob der Stream die Daten in eine Datei, den Hauptspeicher oder über ein Netzwerk an einen anderen Rechner schreibt. Für dich ist nur wichtig zu wissen, dass es eine Funktion write gibt und wie du die Daten an diese Methode übergibst.

Nochmal zusammengefasst, Abstrakte Klasse enthält nur deklaration einer Methode, ohne ihre Implementierung und garantiert so, dass alle Nachfahren diese Methode besitzen müssen. Nachfahren überschreiben die Methode und können überall dort verwendet werden, wo eine Instanz von ihrer Klasse oder dem abstrakten Vorfahren benötigt wird.

Gruß Der Unwissende

kalmi01 3. Jan 2007 12:53

Re: Wie SaveToStream für Metafiles in eigener Klasse realisi
 
@ Der_Unwissende: vielen Danke für die (ausführliche) Erklärung :thumb:

1x pro Jahr fall ich darauf rein :wall:
gut das ich es für dieses Jahr so früh hinter mir habe :zwinker:

Hab's mit TMemoryStream gelöst
(natürlich mit dem "1x pro Jahr"-Deppen-Fehler, "position := 0" vergessen).

Soviel :cheers: gabs Silvester doch garnicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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