Autor Beitrag
TimonWorld
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 397



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 91

Win XP
D6 Pers
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 397



BeitragVerfasst: Sa 26.03.05 13:31 
user profile iconHolgerB 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 397



BeitragVerfasst: 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 user profile iconTino: Code- durch Delphi-Tags ersetzt.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
  Stream := TFileStream.Create(FileName, fmCreate or fmShareExclusive {oder fmShareDenyWrite});					

Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
TimonWorld Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 397



BeitragVerfasst: Sa 26.03.05 21:16 
user profile iconwulfskin 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:
ausblenden Delphi-Quelltext
1:
  Stream := TFileStream.Create(FileName, fmCreate or fmShareExclusive {oder fmShareDenyWrite});					

Gruß Hape!



Delphi-Debugger hat folgendes geschrieben:
Datei kann nicht erstellt werden.


ausblenden 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 user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
GSE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 397



BeitragVerfasst: So 27.03.05 22:09 
user profile iconGSE 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! :lol:

gruß,
timon.
GSE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 397



BeitragVerfasst: Mo 28.03.05 13:04 
user profile iconGSE 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Mo 28.03.05 13:23 
user profile iconTimonWorld 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 28.03.05 13:32 
user profile iconTimonWorld 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:
ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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}

{ TMyComponent }

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;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin

  with TMyComponent.Create(nildo
    try
      MyValue := 'Hello World!';
      SaveToFile('C:\MyComponent.dat');
    finally
      Free;
    end;

  with TMyComponent.Create(nildo
    try
      LoadFromFile('C:\MyComponent.dat');
      ShowMessage(MyValue);
    finally
      Free;
    end;

end;

end.

_________________
Ciao, Sprint.
TimonWorld Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 397



BeitragVerfasst: Sa 02.04.05 21:14 
Hmmm...

Danke für deinen Code!

Mit dem speichern kappt vielleicht :)

Aber mit dem öffnen nicht... :cry:

Gruß,
Timon
Taladan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 88


Delphi 2005 Personal
BeitragVerfasst: Mi 22.06.05 23:38 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TMyComponent.LoadFromFile(const FileName: String);
var
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  try
    Stream.LoadFromFile(FileName);
    Stream.position=0;
    Stream.ReadComponent(Self);
  finally
    Stream.Free;
  end;
end;

Probiere es mal so. Das war häufig mein Streamfehler...

Moderiert von user profile iconGausi: Fett- durch Highlight-Tags ersetzt.
Hinweis: Innerhalb von Code- und Delphi-Tags funktionieren nur die Highlight-Tags. Andere werden nicht geparst.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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)...