diff options
-rw-r--r-- | komponenten.pas | 477 | ||||
-rw-r--r-- | tests.konf | 12 | ||||
-rw-r--r-- | unit1.pas | 18 | ||||
-rw-r--r-- | watchdog.lps | 85 |
4 files changed, 145 insertions, 447 deletions
diff --git a/komponenten.pas b/komponenten.pas index 416f3d8..daa6c63 100644 --- a/komponenten.pas +++ b/komponenten.pas @@ -72,7 +72,6 @@ type public werSollIchSein,geraet: string; constructor create(besitzer: tTestAufgabe); - destructor destroy; override; procedure ausfuehren; override; end; @@ -89,7 +88,6 @@ type wen: string; procedure ausfuehren; override; constructor create(besitzer: tTestAufgabe); - destructor destroy; override; end; tTestPing = class(tTestAufgabe) @@ -99,34 +97,23 @@ type constructor create; end; -(* TTestDnsLookup = class (TTestAufgabe) - private - DNS_IP,HTTP_IP, - host,ipVergleich, - klammerAuf,klammerZu, - Puffer: string; - procedure OnTimerProcedure(Sender: TObject); - procedure HTTPdata(Sender: TObject; Buffer: Pointer; Len: Integer); - procedure DnsLookupDone(Sender: TObject; Error: Word); - public - Pingsocket: TPing; - HttpClient: THTTPCli; - function nimmParameter(s: String): boolean; override; - constructor create(AOwner: TComponent); override; - destructor destroy; override; - end; - TFtpFileCompare = class(TTestAufgabe) - private - Vergleich: string; - FTPClient1: TFTPClient; - refreshVergleich: boolean; - procedure OnTimerProcedure(Sender: TObject); - public - function nimmParameter(s: String): boolean; override; - constructor create(AOwner: TComponent); override; - destructor destroy; override; - end; - TFtpDate = class(TTestAufgabe) + tRfcThread = class(tAufgabenThread) + private + public + vergleichAuffrischen: boolean; + quelle,vergleich,cert: string; + procedure ausfuehren; override; + constructor create(besitzer: tTestAufgabe); + end; + + tRemoteFileCompare = class(tTestAufgabe) + private + public + function nimmParameter(s: string): boolean; override; + constructor create; + end; + +(* TFtpDate = class(TTestAufgabe) private dt: longint; FTPClient1: TFTPClient; @@ -160,12 +147,10 @@ type end; *) function loeseLogischenTerm(s: string): tBedingung; -//function unescape(s: string): string; -//function mystrtotime(s: string): TDatetime; implementation -uses lowlevelunit; +uses lowlevelunit, forms; // logischer Term ************************************************************** @@ -228,76 +213,7 @@ begin end; end{of case}; end; -(* -// Hilfskonvertierung ********************************************************** -function unescape(s: string): string; -begin - result:=''; - while pos('#',s)>0 do - begin - result:=result+copy(s,1,pos('#',s)-1); - delete(s,1,pos('#',s)); - try - result:=result+char(strtoint(copy(s,1,pos('*',s)-1))); - delete(s,1,pos('*',s)); - except - result:=result+'#'; - end; - end; - result:=result+s; -end; - -(* -function istMESZ: boolean; -const TIME_ZONE_ID_UNKNOWN = 0; - TIME_ZONE_ID_STANDARD = 1; - TIME_ZONE_ID_DAYLIGHT = 2; -var TZ : TTimeZoneInformation; -begin - case GetTimeZoneInformation(TZ) of - TIME_ZONE_ID_STANDARD: result:=false; - TIME_ZONE_ID_DAYLIGHT: result:=true; - else result:=false; - end; -end; -*) - -function mystrtotime(s: string): TDatetime; -//const monate: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', -// 'Jul','Aug','Sep','Oct','Nov','Dec'); -var //i: integer; - y,mo,t,h,mi: word; -begin - h:=strtoint(copy(s,1,pos(':',s)-1)); - delete(s,1,pos(':',s)); - mi:=strtoint(copy(s,1,pos(' ',s)-1)); - delete(s,1,pos(' ',s)); - t:=strtoint(copy(s,1,pos('.',s)-1)); - delete(s,1,pos('.',s)); - mo:=strtoint(copy(s,1,pos('.',s)-1)); - delete(s,1,pos('.',s)); - y:=strtoint(s); - result:=EncodeDate(y,mo,t) + EncodeTime(h,mi,0,0); -(* decodeDate(now,y,mo,t); - mo:=1; - for i:=1 to 12 do - if copy(s,1,3)=monate[i] then - mo:=i; - delete(s,1,pos(' ',s)); - while s[1]=' ' do delete(s,1,1); - t:=strtoint(copy(s,1,pos(' ',s)-1)); - delete(s,1,pos(' ',s)); - while s[1]=' ' do delete(s,1,1); - h:=strtoint(copy(s,1,pos(':',s)-1)); - delete(s,1,pos(':',s)); - mi:=strtoint(s); - result:= EncodeDate(y,mo,t) + EncodeTime(h,mi,0,0); - if result>Jetzt then - result:= EncodeDate(y-1,mo,t) + EncodeTime(h,mi,0,0); - if istMESZ then result:=result+1/24; *) -end; -*) // tAufgabenThread ************************************************************* constructor tAufgabenThread.create(besitzer: tTestAufgabe); @@ -392,11 +308,9 @@ begin s:=s+' (testIP)'; if self is tTestPing then s:=s+' (testPing)'; -(* if self is tTestDnsLookup then - s:=s+' (testDnsLookup)'; - if self is tFtpFileCompare then - s:=s+' (ftpFileCompare)'; - if self is tFtpDate then + if self is tRemoteFileCompare then + s:=s+' (remoteFileCompare)'; +(* if self is tFtpDate then s:=s+' (ftpDate)'; if self is tHttpCompare then s:=s+' (httpCompare)'; *) @@ -465,13 +379,6 @@ begin setlength(geraet,0); end; -destructor tIpThread.destroy; -begin - setlength(werSollIchSein,0); - setlength(geraet,0); - inherited destroy; -end; - procedure tIpThread.ausfuehren; var ausgabe: string; @@ -504,11 +411,10 @@ end; function tTestIp.nimmParameter(s: string): boolean; var i,j: longint; - ger,ip: string; begin result:=false; - ger:=erstesArgument(s,':'); - ip:=s; + (_thread as tIpThread).geraet:=erstesArgument(s,':'); + (_thread as tIpThread).werSollIchSein:=s; if pos('/',s)=0 then exit; s[pos('/',s)]:='.'; s:=s+'.'; @@ -521,10 +427,6 @@ begin delete(s,1,pos('.',s)); end; result:=length(s)=0; - if result then begin - (_thread as tIpThread).werSollIchSein:=ip; - (_thread as tIpThread).geraet:=ger; - end; end; // tPingThread ***************************************************************** @@ -536,12 +438,6 @@ begin setlength(wen,0); end; -destructor tPingThread.destroy; -begin - wen:=''; - inherited destroy; -end; - procedure tPingThread.ausfuehren; var ausgabe: string; @@ -551,9 +447,7 @@ begin setlength(argumente,2); argumente[0]:='-c1'; argumente[1]:=wen; - status:=byte(runCommand('ping',argumente,ausgabe)); - if status=1 then - status:=byte(pos('1 packets transmitted, 1 received, 0% packet loss, time',ausgabe)<>0); + status:=byte(runCommand('ping',argumente,ausgabe) and (pos('1 packets transmitted, 1 received, 0% packet loss, time',ausgabe)<>0)); setlength(argumente,0); end; @@ -571,283 +465,88 @@ begin result:=true; end; -(* -// TTestDNSLookup ************************************************************** +// tFfcThread ****************************************************************** -constructor TTestDNSLookup.create(AOwner: TComponent); +constructor tRfcThread.create(besitzer: tTestAufgabe); begin - inherited create(AOwner); - Pingsocket:=TPing.Create(AOwner); - HttpClient:=THTTPCli.Create(AOwner); - HttpClient.OnDocData:=HTTPdata; - Pingsocket.OnDnsLookupDone:=DnsLookupDone; - InnerTimerProcedure:=OnTimerProcedure; - Puffer:=''; -end; - -destructor TTestDNSLookup.destroy; -begin - Pingsocket.destroy; - HttpCLient.destroy; - inherited destroy; -end; - -procedure TTestDNSLookup.OnTimerProcedure(Sender: TObject); -begin - try - DNS_IP:=''; - HTTP_IP:=''; - PingSocket.DnsLookup(host); - HttpClient.URL:=ipVergleich; - HttpClient.Get; - except - Log('Ich bin aus dem try-except geflogen!'); - Status:=0; - end; -end; - -procedure TTestDNSLookup.DnsLookupDone(Sender: TObject; Error: Word); -begin - if Error<>0 then - begin - Log('DnsLookupDone liefert Fehler '+inttostr(Error)+'!=0'); - Status:=0; - exit; - end; - DNS_IP:= PingSocket.DnsResult; - if (HTTP_IP<>'') then - Status:=Byte(HTTP_IP=DNS_IP); -end; - -function TTestDNSLookup.nimmParameter(s: String): boolean; -begin - result:=false; - if (length(S)=0) or (S[1]<>'"') then exit; - delete(S,1,1); - if pos('"',S)=0 then exit; - host:=unescape(copy(S,1,pos('"',S)-1)); - delete(S,1,pos('"',S)); - if pos('"',S)=0 then exit; - delete(S,1,pos('"',S)); - if pos('"',S)=0 then exit; - ipVergleich:=unescape(copy(S,1,pos('"',S)-1)); - delete(S,1,pos('"',S)); - if pos('"',S)=0 then exit; - delete(S,1,pos('"',S)); - if pos('"',S)=0 then exit; - klammerAuf:=unescape(uppercase(copy(S,1,pos('"',S)-1))); - delete(S,1,pos('"',S)); - if pos('"',S)=0 then exit; - delete(S,1,pos('"',S)); - if pos('"',S)=0 then exit; - klammerZu:=unescape(uppercase(copy(S,1,pos('"',S)-1))); - delete(S,1,pos('"',S)); - if length(S)>0 then exit; - result:=true; -end; - -procedure TTestDNSLookup.HTTPdata(Sender: TObject; Buffer: Pointer; Len: Integer); -var S: String; - I,J: Integer; -begin - Setlength(S,Len); - Move(Buffer^,S[1],Len); - S:=uppercase(S); - Puffer:=Puffer+S; - if pos(klammerAuf,Puffer)=0 then exit; - while pos(klammerAuf,Puffer)<>0 do - delete(Puffer,1,pos(klammerAuf,Puffer)+length(klammerAuf)-1); - if pos(klammerZu,Puffer)=0 then - begin - Puffer:=klammerAuf+Puffer; - exit; - end; - delete(Puffer,pos(KlammerZu,Puffer),length(Puffer)-pos(KlammerZu,Puffer)+1); - J:=0; - For I:=length(Puffer) downto 1 do - case J of - 0..2,4..6,8..10,12..14: - case Puffer[I] of - '0'..'9': inc(J); - '.': J:=(J div 4 +1) *4; - else J:=-1; - end{of Case}; - 3,7,11: - if Puffer[I] ='.' then inc(J) - else J:=-1; - end{of Case}; - if J in [13..16] then HTTP_IP:=Puffer - else - begin - Log('Ich finde die IP-Adresse nicht im HTML-Dokument!'); - Status:=0; - exit; - end; - Puffer:=''; - if (DNS_IP<>'') then - Status:=Byte(HTTP_IP=DNS_IP); + inherited create(besitzer); + vergleichAuffrischen:=false; + fillchar(quelle,sizeof(quelle),#0); + setlength(quelle,0); + fillchar(vergleich,sizeof(vergleich),#0); + setlength(vergleich,0); + fillchar(cert,sizeof(cert),#0); + setlength(cert,0); end; -// TFtpFileCompare ************************************************************* - -procedure TFtpFileCompare.OnTimerProcedure(Sender: TObject); -var s,User,Pass,Host,HostDir,HostFile: string; - i,j: integer; - f1,f2: file; - a1,a2: array of byte; - AOwner: tComponent; -const Zeichen = '1234567890qwertzuiopasdfghjklyxcvbnm'; -begin - j:=0; - s:=''; - repeat - if s<>'' then sleep(100); - s:=extractfilepath(Paramstr(0)); - s:=s+'download'; - s:=s+floattostr(now); - for i:=1 to 10 do - s:=s + Zeichen[1+random(length(Zeichen))]; - s:=s+'.txt'; - inc(j); - until (not fileexists(s)) or (j>10000); - FTPClient1.LocalFileName:=s; - try - FTPClient1.Receive; - if not fileexists(s) then begin - Log('Datei wurde beim Herunterladen nicht auf der Festplatte erzeugt!'); +procedure tRfcThread.ausfuehren; +var + argumente: array of string; + ausgabe,buf: string; + f: file; +begin + setlength(argumente,3+2*byte(cert<>'')); + argumente[0]:='-o'; + argumente[1]:='-'; + if cert<>'' then begin + argumente[2]:='--cacert'; + argumente[3]:=cert; + end; + argumente[2+2*byte(cert<>'')]:=quelle; + ausgabe:=''; + if not runCommand('curl',argumente,ausgabe) then begin status:=0; - AOwner:=FTPClient1.Owner; - User:=FTPCLient1.Username; - Pass:=FTPCLient1.Password; - Host:=FTPCLient1.HostName; - HostDir:=FTPCLient1.HostDirName; - HostFile:=FTPCLient1.HostFileName; - FTPClient1.Free; - FTPClient1:=tFTPClient.create(AOwner); - FTPCLient1.Username:=User; - FTPCLient1.Password:=Pass; - FTPCLient1.HostName:=Host; - FTPCLient1.HostDirName:=HostDir; - FTPCLient1.HostFileName:=HostFile; + setlength(argumente,0); exit; end; - assignfile(f1,s); - assignfile(f2,vergleich); - reset(f1,1); - reset(f2,1); - setlength(a1,filesize(f1)); - setlength(a2,filesize(f2)); - blockread(f1,a1[0],length(a1)); - blockread(f2,a2[0],length(a2)); - closefile(f1); - closefile(f2); - except - Log('Ich bin aus dem try-except geflogen!'); - deletefile(pchar(s)); - status:=0; - exit; - end; - j:=0; - if length(a1)=length(a2) then - begin - j:=1; - for i:=0 to length(a1)-1 do - if a1[i]<>a2[i] then - j:=0; - end; - if refreshVergleich then - begin - refreshVergleich:=false; - reset(f1,1); - rewrite(f2,1); - setlength(a1,filesize(f1)); - blockread(f1,a1[0],length(a1)); - blockwrite(f2,a1[0],length(a1)); - closefile(f1); - closefile(f2); + setlength(argumente,0); + assignFile(f,vergleich); + if vergleichAuffrischen then begin + rewrite(f,1); + blockwrite(f,ausgabe[1],length(ausgabe)); + close(f); + end; + reset(f,1); + if fileSize(f)<>length(ausgabe) then begin + status:=0; + closeFile(f); + exit; end; - deletefile(pchar(s)); - status:=j; + setlength(buf,length(ausgabe)); + blockRead(f,buf[1],length(buf)); + closeFile(f); + status:=byte(ausgabe=buf); end; -function TFtpFileCompare.nimmParameter(s: String): boolean; -var Vergl,User,Pass,Host,HostDir,HostFile: String; -begin - if (length(s)>0) and (s[1]='*') then - begin - delete(s,1,1); - refreshVergleich:=true; - end; - if pos('/',s)=0 then - begin - result:=false; - exit; - end; - Vergl:=copy(s,1,pos('/',s)-1); - delete(s,1,pos('/',s)); - if pos(':',s)=0 then - begin - result:=false; - exit; - end; - user:=copy(s,1,pos(':',s)-1); - delete(s,1,pos(':',s)); - if pos('@',s)=0 then - begin - result:=false; - exit; - end; - pass:=copy(s,1,pos('@',s)-1); - delete(s,1,pos('@',s)); - if pos('/',s)=0 then - begin - result:=false; - exit; - end; - Host:=copy(s,1,pos('/',s)-1); - delete(s,1,pos('/',s)); - HostDir:='/'; - while pos('/',s)>0 do - begin - HostDir:=HostDir+copy(s,1,pos('/',s)); - delete(s,1,pos('/',s)); - end; - HostFile:=s; - - Vergleich:=Vergl; - FTPCLient1.Username:=User; - FTPCLient1.Password:=Pass; - FTPCLient1.HostName:=Host; - FTPCLient1.HostDirName:=HostDir; - FTPCLient1.HostFileName:=HostFile; - result:=true; -end; +// tRemoteFileCompare ********************************************************** -constructor TFtpFileCompare.create(AOwner: TComponent); -var SR: TSearchRec; - err: integer; +function tRemoteFileCompare.nimmParameter(s: string): boolean; begin - inherited create(AOwner); - err:=Sysutils.Findfirst(extractfilepath(Paramstr(0))+'download*.txt',$00,SR); - while err=0 do - begin -// Form1.Memo2.Lines.add(extractfilepath(Paramstr(0))+SR.Name); - if fileexists(extractfilepath(Paramstr(0))+SR.Name) then - deletefile(PChar(extractfilepath(Paramstr(0))+SR.Name)); - err:=Sysutils.Findnext(SR); + result:=false; + with _thread as tRfcThread do begin + vergleichAuffrischen:=startetMit('*',s); + if pos(';',s)=0 then exit; + vergleich:=erstesArgument(s,';'); + if pos(';',s)=0 then cert:='' + else cert:=erstesArgument(s,';'); + quelle:=s; + if pos('/',vergleich)=0 then + vergleich:=extractFilePath(application.exeName)+vergleich; + if pos('/',cert)=0 then + cert:=extractFilePath(application.exeName)+cert; + result:=fileexists(vergleich); + if (cert<>'') and not fileexists(cert) then + result:=false; end; - Sysutils.Findclose(SR); - FTPCLient1:=TFTPCLient.Create(AOwner); - InnerTimerProcedure:=OnTimerProcedure; - refreshVergleich:=false; end; -destructor TFtpFileCompare.destroy; +constructor tRemoteFileCompare.create; begin - FTPClient1.Free; - inherited destroy; + inherited create; + _thread:=tRfcThread.create(self); end; +(* // TFtpDate ******************************************************************** procedure TFtpDate.OnTimerProcedure(Sender: TObject); @@ -6,12 +6,8 @@ ping 1_s 100 50 .13 (ping) 192.168.0.13 (ping) 1_s 100 50 .18 (ping) 192.168.0.18
ping 0_1_& 600 50 google (ping) www.google.de
ping 0_1_& 600 50 eckner.net (ping) eckner.net
-##ping 0_1_& 600 50 ... (ping) www.wieistmeineip.de
-#ftpcmp 0_3_& 600 50 Festplatte status.txt/erich:erichmitgrossemE@192.168.0.15/tmp/ftpstatus
+remcmp 0_3_& 600 50 Festplatte status.txt;ftp://erich:erichmitgrossemE@192.168.0.15/tmp/ftpstatus
#ftpdate 0_3_&0_7_& 60000 60000 Festplattenjob 90/erich:erichmitgrossemE@192.168.0.15/tmp/ftpstatus.time
-#ping 100 50 .9 (ping) 192.168.0.9
-#httpcmp 0_4_& 600 50 Musik-Crypto musikStatus.txt:http://192.168.0.18/status.php
-#httpcmp 0_2_&0_6_& 600 100 dns dnsStatus.txt:http://eckner.net/iptest.php
-#checkprocess 600 50 rsync rsync.exe
-##dnslookup 0_2_&0_7_& 600 100 dns "home.eckner.net","http://www.wieistmeineip.de/","<div class="title"><strong>","</strong></div>"
-##ping 0_1_& 600 50 cwsurf (ping) overlock.cwsurf.de
+remcmp 0_4_& 600 50 Musik-Crypto musikStatus.txt;http://192.168.0.18/status.php
+remcmp 0_2_&0_6_& 600 100 dns dnsStatus.txt;ca.crt;https://eckner.net/iptest.php
+
@@ -113,9 +113,8 @@ begin t:=copy(t,2,length(t)-2); if t='ip' then pruefListe[length(pruefliste)-1]:=tTestIp.create else if t='ping' then pruefListe[length(pruefListe)-1]:=tTestPing.create -(* else if t='dnslookup' then pruefListe[length(pruefListe)-1]:=TTestDNSLookup.create(Form1) - else if t='ftpcmp' then pruefListe[length(pruefListe)-1]:=TFtpFileCompare.create(Form1) - else if t='ftpdate' then pruefListe[length(pruefListe)-1]:=TFtpDate.create(Form1) + else if t='remcmp' then pruefListe[length(pruefListe)-1]:=TRemoteFileCompare.create +(* else if t='ftpdate' then pruefListe[length(pruefListe)-1]:=TFtpDate.create(Form1) else if t='httpcmp' then pruefListe[length(pruefListe)-1]:=THttpCompare.create(Form1) else if t='checkprocess' then pruefListe[length(pruefListe)-1]:=TCheckProcess.create(Form1) *) else begin @@ -179,11 +178,14 @@ begin j:=4; end; For i:=0 to length(pruefListe)-1 do - if (j mod 4 = pruefListe[i].status) and - (pruefListe[i].bedingungErfuellt(stati)) and - odd(j shr (2+Byte(pruefListe[i].ernst))) then begin - s:=s + ','#$0D#$0A + pruefListe[i].fehlerNachricht; - memo1.lines.add(pruefListe[i].fehlerNachricht); + if pruefListe[i].bedingungErfuellt(stati) then begin + if (j mod 4 = pruefListe[i].status) and + odd(j shr (2+Byte(pruefListe[i].ernst))) then begin + s:=s + ','#$0D#$0A + pruefListe[i].fehlerNachricht; + memo1.lines.add(pruefListe[i].fehlerNachricht); + end + else + memo1.lines.add('nicht: '+pruefListe[i].fehlerNachricht); end; s:=s+'!'#0; delete(s,1,3); diff --git a/watchdog.lps b/watchdog.lps index 973a3e0..a048fb1 100644 --- a/watchdog.lps +++ b/watchdog.lps @@ -9,7 +9,7 @@ <IsPartOfProject Value="True"/> <EditorIndex Value="-1"/> <CursorPos X="12" Y="6"/> - <UsageCount Value="26"/> + <UsageCount Value="27"/> </Unit0> <Unit1> <Filename Value="unit1.pas"/> @@ -18,9 +18,9 @@ <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="Unit1"/> - <TopLine Value="99"/> - <CursorPos Y="200"/> - <UsageCount Value="26"/> + <TopLine Value="98"/> + <CursorPos X="88" Y="116"/> + <UsageCount Value="27"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> </Unit1> @@ -29,10 +29,10 @@ <IsPartOfProject Value="True"/> <IsVisibleTab Value="True"/> <EditorIndex Value="3"/> - <TopLine Value="504"/> - <CursorPos X="21" Y="558"/> - <FoldState Value=" TKjF0w1 T3l00v917 piaoU0O2\"/> - <UsageCount Value="26"/> + <TopLine Value="503"/> + <CursorPos X="21" Y="539"/> + <FoldState Value=" TKjT0V T3kS0v917 pj7nI05331U"/> + <UsageCount Value="27"/> <Loaded Value="True"/> </Unit2> <Unit3> @@ -53,7 +53,7 @@ <Unit5> <Filename Value="tests.konf"/> <EditorIndex Value="1"/> - <CursorPos X="12" Y="8"/> + <CursorPos X="70" Y="12"/> <UsageCount Value="12"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="None"/> @@ -61,123 +61,124 @@ </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> - <Filename Value="komponenten.pas"/> - <Caret Line="35" TopLine="18"/> + <Filename Value="unit1.pas"/> + <Caret Line="69" Column="20" TopLine="47"/> </Position1> <Position2> - <Filename Value="komponenten.pas"/> - <Caret Line="319" TopLine="239"/> + <Filename Value="unit1.pas"/> + <Caret Line="115" Column="67" TopLine="100"/> </Position2> <Position3> - <Filename Value="unit1.pas"/> - <Caret Line="75" Column="85" TopLine="55"/> + <Filename Value="komponenten.pas"/> + <Caret Line="558" Column="21" TopLine="504"/> </Position3> <Position4> <Filename Value="komponenten.pas"/> - <Caret Line="332" Column="21" TopLine="239"/> + <Caret Line="231" TopLine="79"/> </Position4> <Position5> <Filename Value="komponenten.pas"/> - <Caret Line="240" Column="77" TopLine="85"/> + <Caret Line="671" TopLine="628"/> </Position5> <Position6> <Filename Value="komponenten.pas"/> + <Caret Line="154" TopLine="111"/> </Position6> <Position7> <Filename Value="komponenten.pas"/> - <Caret Line="53" Column="23" TopLine="17"/> + <Caret Line="506" Column="14" TopLine="421"/> </Position7> <Position8> <Filename Value="komponenten.pas"/> - <Caret Line="516" Column="50" TopLine="475"/> + <Caret Line="516" Column="26" TopLine="493"/> </Position8> <Position9> <Filename Value="komponenten.pas"/> - <Caret Line="19"/> + <Caret Line="315" Column="23" TopLine="276"/> </Position9> <Position10> <Filename Value="komponenten.pas"/> - <Caret Line="555" Column="53" TopLine="540"/> + <Caret Line="541" TopLine="498"/> </Position10> <Position11> <Filename Value="komponenten.pas"/> - <Caret Line="560" Column="26" TopLine="460"/> + <Caret Line="540" Column="23" TopLine="511"/> </Position11> <Position12> <Filename Value="komponenten.pas"/> - <Caret Line="579" Column="21" TopLine="551"/> + <Caret Line="602" Column="36" TopLine="574"/> </Position12> <Position13> <Filename Value="komponenten.pas"/> - <Caret Line="83" TopLine="64"/> + <Caret Line="549" Column="46" TopLine="527"/> </Position13> <Position14> <Filename Value="komponenten.pas"/> - <Caret Line="568" Column="3" TopLine="557"/> + <Caret Line="442" TopLine="375"/> </Position14> <Position15> <Filename Value="komponenten.pas"/> - <Caret Line="100" Column="23" TopLine="67"/> + <Caret Line="425" TopLine="393"/> </Position15> <Position16> <Filename Value="komponenten.pas"/> - <Caret Line="62" Column="25" TopLine="40"/> + <Caret Line="549" Column="40" TopLine="527"/> </Position16> <Position17> <Filename Value="komponenten.pas"/> - <Caret Line="82" Column="25" TopLine="60"/> + <Caret Line="157" Column="25" TopLine="92"/> </Position17> <Position18> <Filename Value="komponenten.pas"/> - <Caret Line="100" Column="25" TopLine="78"/> + <Caret Line="549" Column="34" TopLine="527"/> </Position18> <Position19> <Filename Value="komponenten.pas"/> - <Caret Line="359" TopLine="332"/> + <Caret Line="158" Column="24" TopLine="104"/> </Position19> <Position20> <Filename Value="komponenten.pas"/> - <Caret Line="568" Column="21" TopLine="478"/> + <Caret Line="157" Column="27" TopLine="120"/> </Position20> <Position21> <Filename Value="komponenten.pas"/> - <Caret Line="85" Column="4" TopLine="49"/> + <Caret Line="158" Column="11" TopLine="120"/> </Position21> <Position22> <Filename Value="komponenten.pas"/> - <Caret Line="478" Column="12" TopLine="410"/> + <Caret Line="157" Column="28" TopLine="157"/> </Position22> <Position23> <Filename Value="komponenten.pas"/> - <Caret Line="507" TopLine="478"/> + <Caret Line="560" Column="19" TopLine="538"/> </Position23> <Position24> <Filename Value="komponenten.pas"/> - <Caret Line="568" Column="13" TopLine="542"/> + <Caret Line="561" TopLine="528"/> </Position24> <Position25> <Filename Value="komponenten.pas"/> - <Caret Line="506" Column="58" TopLine="393"/> + <Caret Line="117" TopLine="95"/> </Position25> <Position26> <Filename Value="komponenten.pas"/> - <Caret Line="100" TopLine="61"/> + <Caret Line="513" Column="15" TopLine="491"/> </Position26> <Position27> <Filename Value="komponenten.pas"/> - <Caret Line="568" TopLine="546"/> + <Caret Line="508" Column="37" TopLine="497"/> </Position27> <Position28> <Filename Value="komponenten.pas"/> - <Caret Line="574" TopLine="551"/> + <Caret Line="291" Column="39" TopLine="161"/> </Position28> <Position29> - <Filename Value="unit1.pas"/> - <Caret Line="69" Column="20" TopLine="47"/> + <Filename Value="komponenten.pas"/> + <Caret Line="526" Column="9" TopLine="505"/> </Position29> <Position30> <Filename Value="unit1.pas"/> - <Caret Line="115" Column="67" TopLine="100"/> + <Caret Line="116" Column="88" TopLine="98"/> </Position30> </JumpHistory> </ProjectSession> |