From a83b351ed71b1b1ce1aaa2c5685241c9e5cde214 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Wed, 18 Nov 2015 14:53:22 +0100 Subject: fhunit.pas speichert nun binär statt in Ascii MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++ fhunit.pas | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++--------- unit1.lfm | 4 +- wetter.konf | 2 +- wetter.lpi | 6 ++- wetter.lpr | 2 +- wetter.lps | 147 +++++++++++++++++++++++++++++++----------------------------- 7 files changed, 213 insertions(+), 97 deletions(-) diff --git a/.gitignore b/.gitignore index 18c24c9..bd7ecb9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,7 @@ socket *.txt.save *.txt.gz *.txt.gz.save +*.dat +*.dat.save +*.dat.gz +*.dat.gz.save 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('',uppercase(s))); delete(s,1,pos('
',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); diff --git a/unit1.lfm b/unit1.lfm index 5262e06..b155d6a 100644 --- a/unit1.lfm +++ b/unit1.lfm @@ -1,7 +1,7 @@ object Form1: TForm1 - Left = 649 + Left = 725 Height = 204 - Top = 256 + Top = 826 Width = 713 BorderStyle = bsNone Caption = 'Form1' diff --git a/wetter.konf b/wetter.konf index 36c71f9..dd0e27a 100644 --- a/wetter.konf +++ b/wetter.konf @@ -1,4 +1,4 @@ pidDatei: /tmp/wetter.pid -wetterDatei: letztes_Wetter.txt.gz +wetterDatei: letztes_Wetter.dat.gz pegelDatei: letzte_Pegel.txt.gz datenZeitRaum: 7*4 diff --git a/wetter.lpi b/wetter.lpi index 5eebeb5..94e0207 100644 --- a/wetter.lpi +++ b/wetter.lpi @@ -32,7 +32,7 @@ - + @@ -53,6 +53,10 @@ + + + + diff --git a/wetter.lpr b/wetter.lpr index e83a0c9..7cd3f23 100644 --- a/wetter.lpr +++ b/wetter.lpr @@ -5,7 +5,7 @@ program wetter; uses cthreads, Interfaces, // this includes the LCL widgetset - Forms, Unit1, pegelunit, fhunit; + Forms, Unit1, pegelunit, fhunit, fileunit; {$R *.res} diff --git a/wetter.lps b/wetter.lps index a710c84..7a0d7ad 100644 --- a/wetter.lps +++ b/wetter.lps @@ -3,13 +3,13 @@ - + - + @@ -18,10 +18,9 @@ - - - - + + + @@ -29,15 +28,15 @@ - + - - - + + + @@ -45,14 +44,15 @@ - + + - - - + + + @@ -60,13 +60,13 @@ - + - - + + @@ -75,7 +75,7 @@ - + @@ -83,152 +83,157 @@ - + - - - + + + - - - - + + + - + + + + + + + + - - + + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + -- cgit v1.2.3-54-g00ecf