unit pegelunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics; type tPegelZeitGroesze = (pzgJahr,pzgMonat,pzgTag,pzgStunde,pzgMin15); tPegelZeit = array[tPegelZeitgroesze] of integer; tPegelStation = (psBlankenstein,psKaulsdorf,psSaalfeld,psRudolstadt, psRothenstein,psCamburg,psMoeschlitz,psProbstzella,psKaulsdorfEichicht, psKatzhuette,psSchwarzburg,psFreienorla); tPegel = record zeit: tPegelZeit; hoehe: longint; end; pTPegel = ^tPegel; tPegelStaende = class werte: array[tPegelStation] of tList; constructor create; destructor destroy; override; // procedure einlesen(was: string); procedure laden(von: string); procedure speichern(nach: string); end; implementation uses systemunit; const pegelStationsNamen: array[tPegelstation] of array[0..1] of string = (('Blankenstein','Blankenstein-Ros.'), ('Kaulsdorf',''), ('Saalfeld-Remschütz',''), ('Rudolstadt',''), ('Rothenstein',''), ('Camburg-Stöben',''), ('Möschlitz',''), ('Probstzella',''), ('Kaulsdorf-Eichicht',''), ('Katzhütte',''), ('Schwarzburg',''), ('Freienorla','')); pegelStationsNummern: array[tPegelstation] of extended = (57021,57025,57026,57027,57028,57033,57170,57200,57201,57211,57211.5,57240); pegelGrenzen: array[tPegelstation,0..3] of longint = ((210,230,270,310),(195,210,225,240),(200,230,260,290),(150,180,210,240), (250,290,330,370),(280,330,380,430),(180,200,220,240),(0,0,0,0), (130,170,210,230),(200,230,260,290),(130,150,170,190),(0,0,0,0)); pFarben: array[tPegelstation] of tColor = ($000000,$000000,$000000,$FF0000,$7F0000,$000000,$000000,$000000,$000000,$000000,$000000,$000000); // tPegelStaende *************************************************************** constructor tPegelStaende.create; var ps: tPegelStation; begin inherited create; for ps:=low(tPegelStation) to high(tPegelStation) do werte[ps]:=tList.create; end; destructor tPegelStaende.destroy; var ps: tPegelStation; begin for ps:=low(tPegelStation) to high(tPegelStation) do werte[ps].free; inherited destroy; end; procedure tPegelStaende.laden(von: string); var f: textfile; s: string; ps: tPegelstation; pzg: tPegelzeitgroesze; psda,gefunden: boolean; np: pTPegel; i: longint; begin if not fileexists(von) then exit; assignfile(f,von); reset(f); psda:=false; ps:=low(TPegelstation); while not eof(f) do begin readln(f,s); 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 closefile(f); raise exception.create('Pegelstation '''+s+''' nicht gefunden!'); end; psda:=true; continue; end; if not psda then raise exception.create('Es wurde noch keine Pegelstation erwähnt!'); getmem(np,sizeof(TPegel)); werte[ps].Add(np); for pzg:=low(tPegelZeitGroesze) to high(tPegelZeitGroesze) do begin np^.Zeit[pzg]:=strtoint(copy(s,1,pos(' ',s)-1)); delete(s,1,pos(' ',s)); end; np^.Hoehe:=strtoint(s); end; closefile(f); end; procedure tPegelStaende.speichern(nach: string); var dateischonda: boolean; f: textfile; ps: tPegelStation; pzg: tPegelZeitGroesze; i: longint; s: string; begin dateischonda:=fileexists(nach); if dateischonda then assignfile(f,mkTemp(nach+'.XXXXXX')) else assignfile(f,nach); rewrite(f); for ps:=low(tPegelStation) to high(tPegelStation) do begin writeln(f,'Station: '+Pegelstationsnamen[ps,0]); for i:=0 to werte[ps].Count-1 do begin s:=''; for pzg:=low(tPegelZeitGroesze) to high(tPegelZeitGroesze) do s:=s+inttostr(pTPegel(werte[ps][i])^.zeit[pzg])+' '; writeln(f,s+inttostr(pTPegel(werte[ps][i])^.hoehe)); end; end; closefile(f); if dateischonda then begin deletefile(nach); rename(f,nach); end; end; (* procedure tPegelStaende.einlesen(von: string); var t: string; PS: TPegelstation; psda,wsda,gefunden: boolean; PZ: TPegelZeit; posi: extended; nps: PTPegel; PZG: TPegelZeitGroesze; i: longint; begin s:=s+#10; result:=false; psda:=false; wsda:=false; PS:=low(TPegelstation); while pos(#13,s)>0 do begin t:=copy(s,1,pos(#10,s)-1); delete(s,1,pos(#10,s)); while pos(#13,t)>0 do delete(t,pos(#13,t),1); if length(t)=0 then continue; if pos('Pegelname: ',t)=1 then begin delete(t,1,pos(' ',t)); 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]=t)); if gefunden then break; inc(PS); end; if not gefunden then begin Messagedlg('Unbekannter Pegelname: '''+t+'''!',mterror,[mbOk],0); exit; end; psda:=true; continue; end; if t='Durchfluss [m3/s]' then begin wsda:=false; continue; end; if t='Wasserstand [cm]' then begin wsda:=true; continue; end; if not (wsda and psda) then continue; if pos('Fluss: ',t)=1 then continue; if pos('Flusseinzugsgebiet: ',t)=1 then continue; if pos('Stationsnummer: ',t)=1 then begin delete(t,1,pos(' ',t)); while pos(' ',t)=1 do delete(t,1,1); while pos('.',t)>0 do t[pos('.',t)]:=','; if round(10*strtofloat(t))<>round(10*Pegelstationsnummern[PS]) then begin Messagedlg('erwartete Pegelstationsnummer ('+floattostr(Pegelstationsnummern[PS])+ ') für '+Pegelstationsnamen[PS,0]+' ist verschieden von der angegebenen Nummer ('+t+')!',mtError,[mbOk],0); exit; end; continue; end; if pos('Hinweise: ',t)=1 then continue; if pos('keine Werte',t)>0 then continue; PZ:=strToPegelZeit(t); posi:=findePegelZeit(Pegelstaende[PS],PZ); if odd(round(2*posi)) then begin result:=true; getmem(nps,sizeof(TPegel)); for PZG:=low(TPegelZeitGroesse) to high(TPegelZeitGroesse) do nps^.Zeit[PZG]:=PZ[PZG]; delete(t,1,pos(',',t)+1); nps^.Hoehe:=strtoint(t); Pegelstaende[PS].Insert(round(posi+0.5),nps); end; end; Zeichnen; end; *) end.