Autor |
Beitrag |
P@u1
      
Beiträge: 117
|
Verfasst: Do 09.09.10 17:05
Hallo,
ich habe eine Nachfolgerklasse von TBitMap mit ein paar Erweiterungen erstellt und will jetzt eine Instanz dieser Klasse (möglichst als ganzes) in eine einzige Datei speichern.
Dazu habe ich jetzt folgende Möglichkeiten gefunden:
-verwenden Einer typisierten Datei (myFile : File of BitMapEx)
-verwenden von FileStreams
-verwenden von TRakBinaryStreamData
Erstmal hab ich das mit der typisierten Datei versucht, heraus kam eine 4 Byte große Datei...
Ist dieser Weg grundsätzlich für dieses Vorhaben nicht möglich, oder habe ich dabei irgendetwas falsch gemacht?
Dann zu den Filestreams:
Soweit ich weiß, muss man einzelne Attribute usw in den FileStream schreiben, nur das Bild selbst ist kein Attribut sondern irgendwo in der TBitMap-Basisklasse drin, deswegen bin ich mir unsicher, ob und wie das geht
Zu TRakBinaryStreamData:
Hab gelesen, dass ich damit ganze Objekte speichern kann, also genau das, was ich will, aber hab mir das noch nicht so genau angeguckt, weil ich wenn Möglich eine der anderen Möglichkeiten nehmen wollte, da das evtl. einfacher ist und man nicht die zusätzlichen Units braucht.
Ich würde mich freuen, wenn ihr mir ein wenig zu den verschiedenen Methoden sagen könnt, also erstmal, welche überhaupt gehen, was man (/ich) beachten muss und was am sinnvollsten ist usw.
Vielen Dank schonmal.
P.S.: Natürlich will ich die Datei später auch wieder einlesen können, so dass ein Objekt mit genau den selben Werten wie beim Abspeichern entsteht.
|
|
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: Do 09.09.10 17:52
Hi,
na dann will ich mal erste hinweise geben:
P@u1 hat folgendes geschrieben : | Erstmal hab ich das mit der typisierten Datei versucht, heraus kam eine 4 Byte große Datei...
Ist dieser Weg grundsätzlich für dieses Vorhaben nicht möglich, oder habe ich dabei irgendetwas falsch gemacht? |
jepp und wie immer hat dein Programm genau das gemacht, was du gesagt (wenn auch nicht gemeint) hast. Es die Variable gespeichert, über die du dein Objekt ansprichst. Da diese Variable ein Zeiger ist, und du ein 32Bit Programm geschrieben hast, ist eben die 32Bittige Adresse, auf der Platte gelandet welche angibt, wo das Objekt zur zeit des Speichern im Speicher lag. Das hilft dir nur nicht.
P@u1 hat folgendes geschrieben : | Dann zu den Filestreams:
Soweit ich weiß, muss man einzelne Attribute usw in den FileStream schreiben, nur das Bild selbst ist kein Attribut sondern irgendwo in der TBitMap-Basisklasse drin, deswegen bin ich mir unsicher, ob und wie das geht |
Das müsste genau so gut oder schlecht wie (un)Typisierte Dateien funktionieren.
P@u1 hat folgendes geschrieben : | Zu TRakBinaryStreamData: |
Das kenne ich leider nicht.
Generell musst aber dein Konzept überdenken. Du hast da eine Klasse also Programmcode (deine Methoden) und Daten (die Attribute). Speichern willst du aber Wahrscheinlich nur die Daten. Auch da ist oft Fraglich ob alle benötigt werden (interessieren irgendwelche kleinen Hilfsvariablen und Flags, die du in deinem Objekt hast wirklich?). Ich würde deinem Objekt eine "SaveToFile" Methode spendieren, welche die wirklich Relevanten Daten sammelt und diese dann in einem von dir zu erdenkenden Format speichert.
critter
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
P@u1 
      
Beiträge: 117
|
Verfasst: Do 09.09.10 18:05
danke für deinen post.
Also beim speichern ist dann das Problem, dass man da in den Filestream normalerweise verschiedene Attribute reintut soweit ich weiß, aber wie tu ich das Bild selbst rein?
Wie gesagt, ist es ein Nachfolger von TBitMap und das Bild selbst wird vermutlich ein privates Feld der Basisklasse sein.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 09.09.10 19:35
TBitmap hat doch die Methode SaveToStream, oder irre ich mich da? Die schreibt die Bilddaten im "BMP-Format" in den Stream - das müsste sich doch verwenden lassen. 
_________________ We are, we were and will not be.
|
|
P@u1 
      
Beiträge: 117
|
Verfasst: Do 09.09.10 21:14
gute Idee, ich kriegs aber nicht hin.
Warum klappt das hier z.B. nicht (wird nichts gemalt) ?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var bmp,bmp2 : TBitMap; stream: TMemoryStream; begin bmp := TBitMap.Create; bmp.LoadFromFile('F:\Users\Paul\Desktop\test.bmp'); Stream := TMemoryStream.Create; bmp.SaveToStream(Stream); bmp2 := TBitMap.Create; bmp2.LoadFromStream(Stream); Form1.Canvas.Draw(0,0,bmp2); end; |
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 09.09.10 21:18
Weil LoadFromStream von der aktuellen Position aus liest. Und direkt nach dem schreiben liegt die ganz am Ende
Also: vor dem Lesen noch Stream.Position:= 0, um die Position wieder zurückzusetzen.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
P@u1 
      
Beiträge: 117
|
Verfasst: Do 09.09.10 21:22
danke für den tipp, funktioniert jetzt!
Jetzt muss ich nur noch rausfinden, wie ich die zusätzlichen Attribute nochn dazu schreiben und wieder auslesen kann.
Edit: habs hinbekommen, details folgen nachher
|
|
P@u1 
      
Beiträge: 117
|
Verfasst: Mo 13.09.10 23:14
So, also ich habs jetzt hinbekommen:
Nen FileStream erzeugt, mit SaveToStream reingeschrieben und mit Write die Attribute angehängt.
Auslesen geht analog.
Nur ich hatte eben ein sehr komisches Problem:
Ich habe einige Dateien gespeichert, was zuerst alles gut ging, dann hörte eine Datei auf mit "Com2.dat" und es gab einen Error, irgendwie war ein backslash vorangestellt wurden.
Das war auch reproduzierbar.
Umbennen der Datei hats sofort behoben.
Habt ihr ne Ahnung, woran das liegen kann?
Ist Com2 etwa irgendeine versteckte Anweisung im String oder so? ^^
Bei Bedarf werd ich vll nochma nähere Details zu der Stelle im Code die das ausgelöst hat ergänzen.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 13.09.10 23:55
COM1 bis COMn sind reservierte Namen unter DOS gewesen, um die COM-Ports anzusprechen und können deswegen nicht als Dateinamen verwendet werden.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 14.09.10 06:06
Der Fehler bedeutet aber vermutlich auch, dass du vergessen hast den Pfad der Datei anzugeben, oder? Und das gibt dann ja ohnehin noch mehr Probleme als du bis jetzt bemerkt hast...
www.delphi-library.d...ewtopic.php?p=499701
Oder passiert das auch mit Pfad?
|
|
|