summaryrefslogtreecommitdiff
path: root/pegelunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-11-18 14:56:44 +0100
committerErich Eckner <git@eckner.net>2015-11-19 11:46:44 +0100
commitc42d9c90f212cf3a23844421b07a77154f604e7f (patch)
tree207bb8196040ba0abf876d6ae79560d91f33f6c9 /pegelunit.pas
parenta83b351ed71b1b1ce1aaa2c5685241c9e5cde214 (diff)
downloadFH-Wetter-c42d9c90f212cf3a23844421b07a77154f604e7f.tar.xz
pegelunit.pas schreibt jetzt auch binär
Diffstat (limited to 'pegelunit.pas')
-rw-r--r--pegelunit.pas212
1 files changed, 168 insertions, 44 deletions
diff --git a/pegelunit.pas b/pegelunit.pas
index e63a799..d5fd5a5 100644
--- a/pegelunit.pas
+++ b/pegelunit.pas
@@ -31,6 +31,9 @@ type
procedure lade(s: string);
property zeit: extended read _uzeit;
property hoehe: longint read _hoehe;
+ procedure dump(p: pointer);
+ procedure pmud(p: pointer);
+ function size: longint;
end;
tPegelListe = class
@@ -47,6 +50,9 @@ type
property items[i: longint]: tPegelStand
read rItem; default;
function minMaxY(startZeit,stopZeit: extended): tPoint;
+ procedure dump(p: pointer);
+ procedure pmud(p: pointer; version,len: longint);
+ function size: longint;
end;
tPegelUpdateThread = class(tThread)
@@ -83,7 +89,7 @@ type
implementation
-uses math, unit1, myStringListUnit;
+uses math, unit1, myStringListUnit, fileUnit;
const
pegelStationsNamen: array[tPegelstation] of array[0..1] of string =
@@ -172,6 +178,24 @@ begin
end;
end;
+procedure tPegelStand.dump(p: pointer);
+begin
+ pExtended(p)^:=_uZeit;
+ pLongint(p+sizeof(extended))^:=_hoehe;
+end;
+
+procedure tPegelStand.pmud(p: pointer);
+begin
+ _uZeit:=pExtended(p)^;
+ _hoehe:=pLongint(p+sizeof(extended))^;
+ setzeZeit;
+end;
+
+function tPegelStand.size: longint;
+begin
+ result:=sizeof(extended)+sizeof(longint);
+end;
+
// tPegelListe *****************************************************************
constructor tPegelListe.create;
@@ -252,6 +276,60 @@ begin
end;
end;
+procedure tPegelListe.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 tPegelListe.pmud(p: pointer; version,len: longint);
+var
+ i,siz: longint;
+ np: tPegelStand;
+begin
+ case version of
+ 0: begin
+ inhalt.clear;
+
+ np:=tPegelStand.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:=tPegelStand.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 tPegelListe.size: longint;
+begin
+ result:=count;
+ if result>0 then
+ result:=result*items[0].size;
+end;
+
// tPegelUpdateThread **********************************************************
constructor tPegelUpdateThread.create(besitzer: tPegelStaende);
@@ -434,72 +512,118 @@ end;
procedure tPegelStaende.laden(von: string);
var
- f: tMyStringList;
+ sl: tMyStringList;
s: string;
ps: tPegelstation;
psda,gefunden: boolean;
- i: longint;
+ i,len: longint;
+ pt: pointer;
begin
if not fileexists(von) then begin
writeln('Pegeldatei '''+von+''' existiert nicht!');
raise exception.create('Pegeldatei '''+von+''' existiert nicht!');
exit;
end;
- f:=tMyStringList.create;
+
if rightStr(von,3)='.gz' then
- f.loadFromGz(von)
+ loadFromGz(von,pt,len)
else
- f.loadFromFile(von);
- psda:=false;
- ps:=low(TPegelstation);
- while f.readln(s) do begin
- if pos('Station: ',s)=1 then begin
- delete(s,1,pos(' ',s));
- ps:=low(TPegelstation);
- gefunden:=false;
- while ps<=high(TPegelstation) do begin
- for i:=0 to length(Pegelstationsnamen[psBlankenstein])-1 do
- gefunden:=gefunden or ((Pegelstationsnamen[ps,i]<>'') and (Pegelstationsnamen[ps,i]=s));
- if gefunden then break;
- inc(ps);
+ 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;
+
+ psda:=false;
+ ps:=low(TPegelstation);
+ while sl.readln(s) do begin
+ if pos('Station: ',s)=1 then begin
+ delete(s,1,pos(' ',s));
+ ps:=low(TPegelstation);
+ gefunden:=false;
+ while ps<=high(TPegelstation) do begin
+ for i:=0 to length(Pegelstationsnamen[psBlankenstein])-1 do
+ gefunden:=gefunden or ((Pegelstationsnamen[ps,i]<>'') and (Pegelstationsnamen[ps,i]=s));
+ if gefunden then break;
+ inc(ps);
+ end;
+ if not gefunden then begin
+ sl.free;
+ writeln('Pegelstation '''+s+''' nicht gefunden '''+Pegelstationsnamen[psSaalfeld,0]+'''!');
+ raise exception.create('Pegelstation '''+s+''' nicht gefunden '''+Pegelstationsnamen[psSaalfeld,0]+'''!');
+ end;
+ psda:=true;
+ continue;
end;
- if not gefunden then begin
- f.free;
- writeln('Pegelstation '''+s+''' nicht gefunden '''+Pegelstationsnamen[psSaalfeld,0]+'''!');
- raise exception.create('Pegelstation '''+s+''' nicht gefunden '''+Pegelstationsnamen[psSaalfeld,0]+'''!');
+ if not psda then begin
+ sl.free;
+ writeln('Es wurde noch keine Pegelstation erwähnt!');
+ raise exception.create('Es wurde noch keine Pegelstation erwähnt!');
end;
- psda:=true;
- continue;
- end;
- if not psda then begin
- f.free;
- writeln('Es wurde noch keine Pegelstation erwähnt!');
- raise exception.create('Es wurde noch keine Pegelstation erwähnt!');
+ werte[ps].add(s);
end;
- werte[ps].add(s);
+ sl.free;
+ end
+ else begin
+ case (pLongint(pt)+1)^ of
+ 0: begin
+ i:=2*sizeof(longint);
+ for ps:=low(tPegelStation) to high(tPegelStation) do begin
+ werte[ps].pmud(pt+i+sizeof(longint),(pLongint(pt)+1)^,pLongint(pt+i)^);
+ i:=i+werte[ps].size+sizeof(longint);
+ end;
+ end;
+ else begin
+ writeln('Zu neue Dateiversion: Ich verstehe nur bis Version 0, es liegt aber Version '+inttostr((pLongint(pt)+1)^)+' vor!');
+ raise exception.create('Zu neue Dateiversion: Ich verstehe nur bis Version 0, es liegt aber Version '+inttostr((pLongint(pt)+1)^)+' vor!');
+ end;
+ end{of case};
end;
- f.free;
+ freemem(pt);
+
if not assigned(put) then
put:=tPegelUpdateThread.create(self);
end;
procedure tPegelStaende.speichern(nach: string);
var
- f: tMyStringList;
- ps: tPegelStation;
- i: longint;
+ sl: tMyStringList;
+ ps: tPegelStation;
+ pt: pointer;
+ i,len: longint;
begin
- f:=tMyStringList.create;
- for ps:=low(tPegelStation) to high(tPegelStation) do begin
- f.add('Station: '+Pegelstationsnamen[ps,0]);
- for i:=0 to werte[ps].Count-1 do
- f.add(werte[ps][i].schreibe);
+ if rightStr(nach,4)='.txt' then begin // Rückfallebene: Text
+ sl:=tMyStringList.create;
+ for ps:=low(tPegelStation) to high(tPegelStation) do begin
+ sl.add('Station: '+Pegelstationsnamen[ps,0]);
+ for i:=0 to werte[ps].Count-1 do
+ sl.add(werte[ps][i].schreibe);
+ end;
+ sl.saveToFile(nach);
+ sl.free;
+ end
+ else begin
+ len:=2*sizeof(longint);
+ for ps:=low(tPegelStation) to high(tPegelStation) do
+ len:=len+werte[ps].size+sizeof(longint);
+ getmem(pt,len);
+ pLongint(pt)^:=314159265; // magische Zahl
+ (pLongint(pt)+1)^:=0; // Version
+ i:=2*sizeof(longint);
+ for ps:=low(tPegelStation) to high(tPegelStation) do begin
+ pLongint(pt+i)^:=werte[ps].size;
+ i:=i+sizeof(longint);
+ werte[ps].dump(pt+i);
+ i:=i+werte[ps].size;
+ end;
+ if rightStr(nach,3)='.gz' then
+ saveToGz(nach,pt,len)
+ else
+ saveToFile(nach,pt,len);
+ freemem(pt);
end;
- if rightStr(nach,3)='.gz' then
- f.saveToGz(nach)
- else
- f.saveToFile(nach);
- f.free;
end;
procedure tPegelStaende.achsenZeichnen(zuZeichnen: tPegelStationsSet; startZeit,stopZeit: extended);