diff options
Diffstat (limited to 'fhunit.pas')
-rw-r--r-- | fhunit.pas | 145 |
1 files changed, 124 insertions, 21 deletions
@@ -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); |