AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

record speichern

Ein Thema von theomega · begonnen am 16. Apr 2003 · letzter Beitrag vom 16. Apr 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#1

record speichern

  Alt 16. Apr 2003, 09:22
Hallo Leute
ich habe ein Paar types deklariert:
Delphi-Quellcode:
type TModActionWhat=(mawinsertafter,mawinsertbefore,mawreplace,mawmessage,mawnewfile);

type TModAction=record
      action: TModActionWhat;
      cstr1:string;
      cstr2:string;
      insreturn:boolean;
      datei:string;
end;

type TMod=record
modname:string;
moddesc:string;
modbemerkungen:string;
modversion:string[200];
modforversion:string;
author:string[200];
authormail:string;
authorpage:string;

actions:array of TModAction;
end;
Jetzt würde ich gerne genau ein TMod in eine Datei speichern und herausladen. Das Problem dabei ist, dass dynamische Array. Leider weiß ich nicht, wie groß es ist. Deshalb streikt Delphi auch bei
Code:
var datei: file ot TMod
Wie kann ich das Problem lösen?

Danke
TO
  Mit Zitat antworten Zitat
rossmann

Registriert seit: 10. Apr 2003
Ort: Bergkamen
9 Beiträge
 
#2
  Alt 16. Apr 2003, 09:46
type
TMod = record
modname : string;
moddesc : string;
modbemerkungen : string;
modversion : string[200];
modforversion : string;
author : string[200];
authormail : string;
authorpage : string;
end;

TModAction = record
cstr1 : string;
cstr2 : string;
insreturn : boolean;
datei : string;
end;



TForm1 = class(TForm)
Button1 : TButton;
procedure Button1Click(Sender : TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
Hi Theomega

vieleicht so !


var
Form1 : TForm1;
actions : array of TModAction;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender : TObject);
var s : TMemoryStream;
x : integer;
begin
x := Length(actions);
s := TMemoryStream.Create;
s.WriteBuffer(Actions, x);
s.SaveToFile('c:\action.rec');
end;
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#3
  Alt 16. Apr 2003, 09:56
a) actions beschränken auf feste Größe
Aber dann ist das Array nicht mehr dynamisch, und außerdem verschenkst Du bei wenigen actions viel Speicherplatz

b) 2 Dateien, eine für die TMod's, eine für die actions, mit Referenz aus der ersten Datei in die zweite.
Aber das ist eine Fummelei, und fehleranfällig

c) Abspeichern in eine DB

d) Abspeichern im INI-File-Format. Dann kannst Du einfach eine ganze section einlesen bzw. schreiben mit den actions, die zu einem TMod gehören.

Gruß
Roderich
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#4
  Alt 16. Apr 2003, 09:56
Und wie lade ich? Die Größe ist mir dann ja nicht bekannt!
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5
  Alt 16. Apr 2003, 10:07
du könntest in einer extra section in der ini die länge abspeichern.
David F.
  Mit Zitat antworten Zitat
rossmann

Registriert seit: 10. Apr 2003
Ort: Bergkamen
9 Beiträge
 
#6
  Alt 16. Apr 2003, 10:19
[B]
Ich denke so wird es gehen lesen und schreiben


[delphi]
type
TMod = record
modname : string;
moddesc : string;
modbemerkungen : string;
modversion : string[200];
modforversion : string;
author : string[200];
authormail : string;
authorpage : string;
end;

TModAction = record
cstr1 : string;
cstr2 : string;
insreturn : boolean;
datei : string;
end;



TForm1 = class(TForm)
Button1 : TButton;
Button2: TButton;
procedure Button1Click(Sender : TObject);
procedure Button2Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1 : TForm1;
actions : array of TModAction;

implementation

{$R *.dfm}
////////////////////
///// SCHREIBEN
////////////////////
procedure TForm1.Button1Click(Sender : TObject);
var s : TFileStream;
x : integer;
begin
x := Sizeof(actions);
s := TFileStream.Create('c:\test.rec',fmCreate);
try
s.WriteBuffer(Actions, x);
finally
s.Free;
end;
end;

////////////////////
///// LESEN
////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var s : TFileStream;
x : integer;
begin
s := TFileStream.Create('c:\test.rec',fmOpenRead);
try
x := s.Size;
s.ReadBuffer(Actions, x);
finally
s.Free;
end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#7
  Alt 16. Apr 2003, 10:22
Das geht leider nicht. Die Datei nacher ist nur 4 Bytes groß und sie enthält keinen der Strings. Das Array enthält auf jeden Fall Werte, daran liegt es also nicht!
  Mit Zitat antworten Zitat
rossmann

Registriert seit: 10. Apr 2003
Ort: Bergkamen
9 Beiträge
 
#8
  Alt 16. Apr 2003, 10:33
Tschuldigung die größe in WriteBuffer ist ein Int64 Type



Delphi-Quellcode:
procedure TForm1.Button1Click(Sender : TObject);
var s : TFileStream;
   x : Int64;
begin
   SetLength(actions, 20);
   actions[0].cstr1 := Edit1.Text;
   x := Sizeof(actions);
   s := TFileStream.Create('c:\test.rec', fmCreate);
   try
      s.WriteBuffer(Actions, x);
   finally
      s.Free;
   end;
end;

procedure TForm1.Button2Click(Sender : TObject);
var s : TFileStream;
   x : Int64;
begin
   s := TFileStream.Create('c:\test.rec', fmOpenRead);
   try
      x := s.Size;
      s.ReadBuffer(Actions, x);
   finally
      s.Free;
   end;
   Edit1.Text := actions[0].cstr1;
end;
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#9
  Alt 16. Apr 2003, 10:43
ich habe diesen code hier genommen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
f: TFileStream;

begin

f := TFileStream.Create('C:\mod.mod',fmCreate);

moder.modname := 'xxx';
moder.moddesc := 'xxx';
moder.modbemerkungen := '-';
moder.modversion := '1';
moder.modforversion := '2.81';
moder.author := 'xxx';
moder.authormail := 'xxx';
moder.authorpage := 'http://www.thewiggle.org/';


moderaction[0].action := mawinsertbefore;
moderaction[0].cstr1 := 'TEXT01';
moderaction[0].cstr2 := 'TEXT02';
moderaction[0].insreturn := true;
moderaction[0].datei := 'templates/default/frame.html';

moderaction[1].action := mawinsertafter;
moderaction[1].cstr1 := 'TEXT12';

showmessage(inttostr(sizeof(moderaction)));

//f.Write(moder,sizeof(TMod));
f.WriteBuffer(moderaction,sizeof(moderaction));


f.Free;

end;
Und hier sieht man schon. Das showmessage gibt 4 aus. Das Array soll also nur 4 bytes groß sein.
  Mit Zitat antworten Zitat
rossmann

Registriert seit: 10. Apr 2003
Ort: Bergkamen
9 Beiträge
 
#10
  Alt 16. Apr 2003, 10:53
Ich habe dir mein Testprogramm in ein Zip angehangen
damit funktioniert es .
Angehängte Dateien
Dateityp: zip testxxx.zip (211,4 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:08 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