Autor |
Beitrag |
TimonWorld
      
Beiträge: 397
|
Verfasst: Sa 26.03.05 01:00
Hallo!
Hab zwar schon in der Suche rumgestöbert, aber nix gefunden:
Wie speichere ich einen TStream als Datei (z.B. mystream.stream)?
Ich habe in mein Stream eine Komponente (mit Bild) und will diese wieder speichern und laden können.
Gruß,
Timon.
|
|
HolgerB
      
Beiträge: 91
Win XP
D6 Pers
|
Verfasst: Sa 26.03.05 03:14
Hallo,
TStream ist eine ein globaler Typ und ist somit Kompatibel zu TMemoryStream oder halt auch zu TFileStream.
Bei TFilestream.create musst du den Dateinamen gleich mit angeben. Viele Komponenten haben die Methode SavetoStream. Damit kannst du das gleich abspeichern.
Vergiss nicht den Filestream mit Free freizugeben (was meines Wissens nach auch die Datei schließt), wenn du Ihn nicht mehr brauchst.
Gruß
Holger
|
|
TimonWorld 
      
Beiträge: 397
|
Verfasst: Sa 26.03.05 13:31
HolgerB hat folgendes geschrieben: | Bei TFilestream.create musst du den Dateinamen gleich mit angeben. Viele Komponenten haben die Methode SavetoStream. Damit kannst du das gleich abspeichern. |
Hallo!
Nee... Die Komponente besitzt kein SaveToStream, weil ich diese Komponente selber programmiert habe und sie ist nur von TComponent abgeleitet.
Aber wie meinst du, dass man bei .create den Dateinamen angeben kann. Wie geht das?
Gruß,
Timon
|
|
GSE
      
Beiträge: 740
Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
|
Verfasst: Sa 26.03.05 13:50
schau doch in der Hilfe zu TFileStream nach (F1).
da ich aber kein Unmensch bin: wenn du einen TFileStream mit Create erzeugst
musst du als Parameter den Dateiname und den "Öffnungsmodus" (also read-Only, Write-Only, etc.) mit angeben.
wenn du den Stream schließt (Free) wird der Inhalt dann in die Datei geschrieben (bzw. wie schon gesagt die Datei geschlosen)
Tipp: schau dir mal zum einfacheren Arbeiten mit Streams TReader und TWriter an
mfg
GSE
_________________ Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
|
|
TimonWorld 
      
Beiträge: 397
|
Verfasst: Sa 26.03.05 16:40
Danke!
Ich weiß noch nicht ob's funktioniert mit dem Laden, denn ich muss ja erstmal speichern. Wie speichere ich das denn?
Mit Stream := TFileStream.Create(FileName, fmOpenWrite); geht's nicht...
Gruß,
Timon.
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Sa 26.03.05 16:46
Hallo,
warum schaust du dir die Parameter nicht einfach in der HIlfe an?
Dann hättest du festgestellt, dass es erstens noch einen weiteren Parameter gibt, denn man mit or verknüpfen kann und zweites fmOpenWrite fehlschlägt, wenn die Zieldatei nicht existiert.
So gehts:
Delphi-Quelltext 1:
| Stream := TFileStream.Create(FileName, fmCreate or fmShareExclusive ); |
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
TimonWorld 
      
Beiträge: 397
|
Verfasst: Sa 26.03.05 21:16
wulfskin hat folgendes geschrieben: | Hallo,
warum schaust du dir die Parameter nicht einfach in der HIlfe an?
Dann hättest du festgestellt, dass es erstens noch einen weiteren Parameter gibt, denn man mit or verknüpfen kann und zweites fmOpenWrite fehlschlägt, wenn die Zieldatei nicht existiert.
So gehts:
Delphi-Quelltext 1:
| Stream := TFileStream.Create(FileName, fmCreate or fmShareExclusive ); |
Gruß Hape! |
Delphi-Debugger hat folgendes geschrieben: | Datei kann nicht erstellt werden. |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TCompo.SaveToFile(const FileName: string); begin Stream := TFileStream.Create(FileName, fmCreate or fmShareExclusive); Stream.ReadComponent(MyParentCompo); Stream.Free; end; |
Geht trotzdem nicht...
Vielleicht sollte ich erst die Compo einlesen und dann speichern... Aber die Kompo muss ja noch erzeugt werden... ich kann ja nicht zwei creates einbauen.
gruß,
timon.
Moderiert von AXMD: Code- durch Delphi-Tags ersetzt.
|
|
GSE
      
Beiträge: 740
Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
|
Verfasst: Sa 26.03.05 21:29
wie willst du aus eine rneu erzeugten Datei (fmCreate) etwas einlesen (-> fmOpenRead)?
sicher dass du alle Rechte hast?
das fmShareExclusive kannst du dir beim Erzeugen sparen, da die Datei ja vorher nicht geöffnet sein kann.
mfg
GSE
_________________ Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
|
|
TimonWorld 
      
Beiträge: 397
|
Verfasst: So 27.03.05 22:09
GSE hat folgendes geschrieben: | wie willst du aus eine rneu erzeugten Datei (fmCreate) etwas einlesen (-> fmOpenRead)? |
Ich will die Datei ja erstmal speichern...
Ich hab alle Rechte... ._. - ist schließlich mein pc!
gruß,
timon.
|
|
GSE
      
Beiträge: 740
Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
|
Verfasst: So 27.03.05 23:28
schreiben heißt bei mir aber Write und nicht Read (-> WriteComponent)
oder steh ich jetzt auf'm Schlauch?
mfg
GSE
_________________ Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
|
|
TimonWorld 
      
Beiträge: 397
|
Verfasst: Mo 28.03.05 13:04
GSE hat folgendes geschrieben: | schreiben heißt bei mir aber Write und nicht Read (-> WriteComponent)
oder steh ich jetzt auf'm Schlauch? |
Hallo!
Aber muss die Komponente nicht erstmal in den leeren Stream geladen werden, bevor man sonst einen leeren Stream speichert???
Gruß,
Timon.
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Mo 28.03.05 13:23
TimonWorld hat folgendes geschrieben: | Aber muss die Komponente nicht erstmal in den leeren Stream geladen werden, bevor man sonst einen leeren Stream speichert???  |
Keine Ahnung was du meinst.
Jedenfalls musst du zum Speicher WriteComponent benutzen: Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TCompo.SaveToFile(const FileName: string); begin Stream := TFileStream.Create(FileName, fmCreate or fmShareExclusive); Stream.WriteComponent(MyParentCompo); Stream.Free; end; | Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Mo 28.03.05 13:32
TimonWorld hat folgendes geschrieben: | Aber muss die Komponente nicht erstmal in den leeren Stream geladen werden, bevor man sonst einen leeren Stream speichert? |
Ich weiß nicht so recht was du vorhast? Also wenn du die Werte deiner Eigenschaften aus deiner Komponente speichern möchtest, dann kannst du es so machen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
TMyComponent = class(TComponent) private FMyValue: String; public procedure SaveToFile(const FileName: String); procedure LoadFromFile(const FileName: String); published property MyValue: String read FMyValue write FMyValue; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TMyComponent.LoadFromFile(const FileName: String); var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try Stream.LoadFromFile(FileName); Stream.ReadComponent(Self); finally Stream.Free; end; end;
procedure TMyComponent.SaveToFile(const FileName: String); var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try Stream.WriteComponent(Self); Stream.SaveToFile(FileName); finally Stream.Free; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin
with TMyComponent.Create(nil) do try MyValue := 'Hello World!'; SaveToFile('C:\MyComponent.dat'); finally Free; end;
with TMyComponent.Create(nil) do try LoadFromFile('C:\MyComponent.dat'); ShowMessage(MyValue); finally Free; end;
end;
end. |
_________________ Ciao, Sprint.
|
|
TimonWorld 
      
Beiträge: 397
|
Verfasst: Sa 02.04.05 21:14
Hmmm...
Danke für deinen Code!
Mit dem speichern kappt vielleicht
Aber mit dem öffnen nicht...
Gruß,
Timon
|
|
Taladan
      
Beiträge: 88
Delphi 2005 Personal
|
Verfasst: Mi 22.06.05 23:38
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 23.06.05 08:37
Normalerweise benutzt man TFileStream mit fmOpenRead und liest dann das Zeugs mit Read..... wieder rein. Da muss man eigentlich keinen umweg über ein TMemoryStream machen. Wäre die Datei 3GB gross, würde diese ganzen 3GB erstmal in das MemoryStream geladen werden....
TFileStream ist eigentlich nur ein Wrapper für die Windows-API Funktionen zum lesen/beschreiben einer Datei. Das geht fix und kost nix (jedenfalls Speichertechnesch)...
|
|