summaryrefslogtreecommitdiff
path: root/fhunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-11-18 14:53:22 +0100
committerErich Eckner <git@eckner.net>2015-11-19 09:24:48 +0100
commita83b351ed71b1b1ce1aaa2c5685241c9e5cde214 (patch)
tree037b69bf59f3aec8fca7a1b0473f8e7387b320f7 /fhunit.pas
parentc84a57a879a389ee3d1c3d736463eacece7f6dc5 (diff)
downloadFH-Wetter-a83b351ed71b1b1ce1aaa2c5685241c9e5cde214.tar.xz
fhunit.pas speichert nun binär statt in Ascii
Diffstat (limited to 'fhunit.pas')
-rw-r--r--fhunit.pas145
1 files changed, 124 insertions, 21 deletions
diff --git a/fhunit.pas b/fhunit.pas
index 8b3f1b0..51edb6a 100644
--- a/fhunit.pas
+++ b/fhunit.pas
@@ -35,6 +35,9 @@ type
read _uZeit;
property mW[mG: tMessGroesze]: extended
read rMW;
+ procedure dump(p: pExtended); inline;
+ procedure pmud(p: pExtended); inline;
+ function size: longint; inline;
end;
tMessPunkteListe = class
@@ -52,6 +55,9 @@ type
property items[i: longint]: tMessPunkt
read rItem; default;
function minMaxY(startZeit,stopZeit: extended): tMessWerteExtPoints;
+ procedure dump(p: pointer); inline;
+ procedure pmud(p: pointer; version,len: longint); inline;
+ function size: longint; inline;
end;
tMessPunkteUpdateThread = class(tThread)
@@ -111,7 +117,7 @@ const
implementation
-uses unit1, math, myStringListUnit;
+uses unit1, math, myStringListUnit, fileUnit;
// tMessPunkt ******************************************************************
@@ -182,7 +188,6 @@ begin
setzeUZeit;
end
else begin // Format wie im Netz
-
delete(s,1,pos('<BODY',uppercase(s))-1);
s:=copy(s,1,pos('</BODY>',uppercase(s)));
delete(s,1,pos('<CENTER>',uppercase(s)));
@@ -225,6 +230,24 @@ begin
result:=trim(result);
end;
+procedure tMessPunkt.dump(p: pExtended);
+begin
+ move(_uZeit,p^,sizeof(extended));
+ move(_mW[low(tMessGroesze)],(p+1)^,length(_mW)*sizeof(_mW[low(tMessGroesze)]));
+end;
+
+procedure tMessPunkt.pmud(p: pExtended);
+begin
+ move(p^,_uZeit,sizeof(_uZeit));
+ move((p+1)^,_mW[low(tMessGroesze)],length(_mW)*sizeof(_mW[low(tMessGroesze)]));
+ setzeZeit;
+end;
+
+function tMessPunkt.size: longint;
+begin
+ result:=(1+length(_mW))*sizeof(extended);
+end;
+
// tMessPunkteListe ************************************************************
constructor tMessPunkteListe.create;
@@ -241,6 +264,8 @@ end;
function tMessPunkteListe.rItem(i: longint): tMessPunkt;
begin
+ if i>=count then
+ raise exception.create('i zu groß! ('+inttostr(i)+' von '+inttostr(count)+')');
result:=tMessPunkt(inhalt[i]);
end;
@@ -436,6 +461,60 @@ begin
beendet:=true;
end;
+procedure tMessPunkteListe.dump(p: pointer);
+var
+ i,siz: longint;
+begin
+ if count=0 then exit;
+ siz:=items[0].size;
+ for i:=0 to count-1 do begin
+ items[i].dump(p);
+ p:=p+siz;
+ end;
+end;
+
+procedure tMessPunkteListe.pmud(p: pointer; version,len: longint);
+var
+ i,siz: longint;
+ np: tMessPunkt;
+begin
+ case version of
+ 0: begin
+ inhalt.clear;
+
+ np:=tMessPunkt.create;
+ siz:=np.size;
+
+ if len mod siz <> 0 then begin
+ writeln('Datenlänge ('+inttostr(len)+' Byte) ist kein Vielfaches der Länge eines Datums ('+inttostr(siz)+' Byte)!');
+ raise exception.create('Datenlänge ('+inttostr(len)+' Byte) ist kein Vielfaches der Länge eines Datums ('+inttostr(siz)+' Byte)!');
+ end;
+
+ np.pmud(p);
+ p:=p+siz;
+ inhalt.add(np);
+
+ for i:=1 to (len div siz)-1 do begin
+ np:=tMessPunkt.create;
+ np.pmud(p);
+ p:=p+siz;
+ inhalt.add(np);
+ end;
+ end;
+ else begin
+ writeln('Zu neue Dateiversion: Ich verstehe nur bis Version 0, es liegt aber Version '+inttostr(version)+' vor!');
+ raise exception.create('Zu neue Dateiversion: Ich verstehe nur bis Version 0, es liegt aber Version '+inttostr(version)+' vor!');
+ end;
+ end{of case}
+end;
+
+function tMessPunkteListe.size: longint;
+begin
+ result:=count;
+ if result>0 then
+ result:=result*items[0].size;
+end;
+
// tMessPunkte *****************************************************************
constructor tMessPunkte.create(zeichenFlaeche: tImage);
@@ -465,23 +544,35 @@ end;
procedure tMessPunkte.laden(von: string);
var
- f: tMyStringList;
- s: string;
- i: longint;
+ sl: tMyStringList;
+ pt: pointer;
+ len: longint;
+ s: string;
+ i: longint;
begin
if not fileexists(von) then begin
writeln('Messwertedatei '''+von+''' existiert nicht!');
raise exception.create('Messwertedatei '''+von+''' existiert nicht!');
exit;
end;
- f:=tMyStringList.create;
+
if rightStr(von,3)='.gz' then
- f.loadFromGz(von)
+ loadFromGz(von,pt,len)
+ else
+ loadFromFile(von,pt,len);
+
+ if pLongint(pt)^ <> 314159265 then begin // magische Zahl nicht gefunden -> Rückfallebene: Text!
+ sl:=tMyStringList.create;
+ setlength(s,len);
+ move(pt^,s[1],length(s));
+ sl.text:=s;
+ while sl.readln(s) do
+ werte.append(s);
+ sl.free;
+ end
else
- f.loadFromFile(von);
- while f.readln(s) do
- werte.append(s);
- f.free;
+ werte.pmud(pt+2*sizeof(longint),(pLongint(pt)+1)^,len-2*sizeof(longint));
+ freemem(pt);
if length(muts)=0 then begin
setlength(muts,20);
@@ -492,17 +583,29 @@ end;
procedure tMessPunkte.speichern(nach: string);
var
- f: tMyStringList;
- i: longint;
+ sl: tMyStringList;
+ pt: pointer;
+ i: longint;
begin
- f:=tMyStringList.create;
- for i:=0 to werte.count-1 do
- f.add(werte[i].schreibe);
- if rightStr(nach,3)='.gz' then
- f.saveToGz(nach)
- else
- f.saveToFile(nach);
- f.free;
+ if rightstr(nach,4)='.txt' then begin // Rückfallebene: Text
+ sl:=tMyStringList.create;
+ for i:=0 to werte.count-1 do
+ sl.add(werte[i].schreibe);
+ sl.saveToFile(nach);
+ sl.free;
+ end
+ else begin
+ i:=werte.size;
+ getmem(pt,i+2*sizeof(longint));
+ pLongint(pt)^:=314159265; // magische Zahl
+ (pLongint(pt)+1)^:=0; // Version
+ werte.dump(pt+2*sizeof(longint));
+ if rightStr(nach,3)='.gz' then
+ saveToGz(nach,pt,i+2*sizeof(longint))
+ else
+ saveToFile(nach,pt,i+2*sizeof(longint));
+ freemem(pt);
+ end;
end;
procedure tMessPunkte.achsenZeichnen(zuZeichnen: tMessGroeszenSet; startZeit,stopZeit: extended);