AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [gelöst] eigenes SaveToStream für Metafiles realisieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von kalmi01 · begonnen am 3. Jan 2007 · letzter Beitrag vom 3. Jan 2007
Antwort Antwort
kalmi01
(Gast)

n/a Beiträge
 
#1

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

  Alt 3. Jan 2007, 11:09
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:WMFStream := TStream.Create; worden.

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

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

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

  Alt 3. Jan 2007, 11:53
Zitat von kalmi01:
Der übergebene Stream ist so initialisiert: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
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#3

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

  Alt 3. Jan 2007, 12:53
@ Der_Unwissende: vielen Danke für die (ausführliche) Erklärung

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

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

Soviel gabs Silvester doch garnicht.
  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 10:54 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