From 9348a2c95e863391818d0dd6d8a44e5d38e3b75c Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Wed, 25 Nov 2015 15:57:15 +0100 Subject: läuft jetzt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bus_da.ico | Bin 766 -> 894 bytes filterunit.pas | 352 ++++++++++++++++++++++++++++--------------------------- jenah.lpi | 21 ++-- jenah.lpr | 4 +- jenah.lps | 360 ++++++++++++++++++++++++++++++--------------------------- jenah.res | Bin 1700 -> 2268 bytes normal.ico | Bin 766 -> 894 bytes optionen.txt | 4 +- unbekannt.ico | Bin 766 -> 894 bytes unit1.lfm | 144 +++++++++++++++++++---- unit1.pas | 226 ++++++++---------------------------- 11 files changed, 539 insertions(+), 572 deletions(-) diff --git a/bus_da.ico b/bus_da.ico index 7ca1dfa..4509270 100644 Binary files a/bus_da.ico and b/bus_da.ico differ diff --git a/filterunit.pas b/filterunit.pas index e030bcb..fb1e54f 100644 --- a/filterunit.pas +++ b/filterunit.pas @@ -8,209 +8,207 @@ uses Classes, SysUtils; type + tAbfahrt = record - haltestellenId: integer; - Linie,Ziel,Richtung: String; - sAn,sAb,iAn,iAb: TDatetime; - end; + haltestellenId: integer; + linie,ziel,richtung: string; + sAn,sAb,iAn,iAb: tDateTime; + end; + tFilterKriterium = (fkZeit,fkLinie,fkHaltestelle); - tBoolOperation = (boPush1,boPop1,boPush2,boPop2, - boNot,boAnd,boOr, - boSet,boPropablySet,boClr, - boTrust,boMistrust, - boDrop,boCopy); + + tBoolOperation = + (boPush1,boPop1,boPush2,boPop2, + boNot,boAnd,boOr, + boSet,boPropablySet,boClr, + boTrust,boMistrust, + boDrop,boCopy); + tFilter = class - Kriterien: array of TFilterKriterium; - Vergleiche: array of string; - Verknuepfung: array of TBoolOperation; - function Regel_erfuellt(Abf: TAbfahrt; Genuegsamkeit: byte): boolean; - constructor create(var f: textfile); - destructor destroy; - end; - -function extract_time(source: string): tdatetime; -function extract_advtime(source: string): tdatetime; + kriterien: array of tFilterKriterium; + vergleiche: array of string; + verknuepfung: array of tBoolOperation; + function regelErfuellt(abf: tAbfahrt; genuegsamkeit: byte): boolean; + constructor create(var f: textfile); + destructor destroy; override; + end; + +function extractTime(source: string): tDateTime; function extract(verifyer,source: string): string; overload; -function extract(verifyer,source: string; var Tag: string): string; overload; +function extract(verifyer,source: string; out tag: string): string; overload; implementation -uses math; +uses math, lowlevelUnit; -function tFilter.Regel_erfuellt(abf: TAbfahrt; genuegsamkeit: Byte): boolean; -var i: longint; - stack1,stack2,reg: array of byte; +function tFilter.regelErfuellt(abf: tAbfahrt; genuegsamkeit: byte): boolean; +var + i: longint; + stack1,stack2,reg: array of byte; begin - setlength(stack1,0); - setlength(stack2,0); - setlength(reg,min(length(Kriterien),length(Vergleiche))); - for I:=0 to length(Reg)-1 do begin - case Kriterien[I] of - fkZeit: Reg[I]:=max(Byte(Abf.sAb - now < strtotime(Vergleiche[I])), - 2*Byte(Abf.iAb - now < strtotime(Vergleiche[I]))); - fkLinie: Reg[I]:=2*Byte(strtoint(Abf.Linie) = strtoint(Vergleiche[I])); - fkHaltestelle: Reg[I]:=2*Byte(Abf.haltestellenId = strtoint(Vergleiche[I])); - end{of Case}; - end; - for I:=0 to length(Verknuepfung)-1 do - case Verknuepfung[I] of - boNot: Reg[length(Reg)-1]:=2-Reg[length(Reg)-1]; - boPush1: begin - setlength(Stack1,length(Stack1)+1); - Stack1[length(Stack1)-1]:=Reg[length(Reg)-1]; - setlength(Reg,length(Reg)-1); - end; - boPop1: begin - setlength(Reg,length(Reg)+1); - Reg[length(Reg)-1]:=Stack1[length(Stack1)-1]; - setlength(Stack1,length(Stack1)-1); - end; - boPush2: begin - setlength(Stack2,length(Stack2)+1); - Stack2[length(Stack2)-1]:=Reg[length(Reg)-1]; - setlength(Reg,length(Reg)-1); - end; - boPop2: begin - setlength(Reg,length(Reg)+1); - Reg[length(Reg)-1]:=Stack1[length(Stack2)-1]; - setlength(Stack2,length(Stack2)-1); - end; - boAnd: begin - Reg[length(Reg)-2]:=min(Reg[length(Reg)-1],Reg[length(Reg)-2]); - setlength(Reg,length(Reg)-1); - end; - boOr: begin - Reg[length(Reg)-2]:=max(Reg[length(Reg)-1],Reg[length(Reg)-2]); - setlength(Reg,length(Reg)-1); - end; - boSet: Reg[length(Reg)-1]:=2; - boPropablySet: Reg[length(Reg)-1]:=1; - boClr: Reg[length(Reg)-1]:=0; - boDrop: setlength(Reg,length(Reg)-1); - boTrust: Reg[length(Reg)-1]:=2*Byte(Reg[length(Reg)-1]<>0); - boMistrust: Reg[length(Reg)-1]:=2*Byte(Reg[length(Reg)-1]=2); - boCopy: begin - setlength(Reg,length(Reg)+1); - Reg[length(Reg)-1]:=Reg[length(Reg)-2]; - end; - end{of case}; - Result:=Reg[0]>=Genuegsamkeit; - setlength(Reg,0); - setlength(Stack1,0); - setlength(Stack2,0); + setlength(stack1,0); + setlength(stack2,0); + setlength(reg,min(length(kriterien),length(vergleiche))); + for i:=0 to length(reg)-1 do + case kriterien[i] of + fkZeit: reg[i]:=max(byte(abf.sAb - now < strtotime(vergleiche[i])), + 2*byte(abf.iAb - now < strtotime(vergleiche[i]))); + fkLinie: reg[i]:=2*byte(strtoint(abf.Linie) = strtoint(vergleiche[i])); + fkHaltestelle: reg[i]:=2*byte(abf.haltestellenId = strtoint(vergleiche[i])); + end{of Case}; + for i:=0 to length(verknuepfung)-1 do + case verknuepfung[i] of + boNot: reg[length(reg)-1]:=2-reg[length(reg)-1]; + boPush1: begin + setlength(stack1,length(stack1)+1); + stack1[length(stack1)-1]:=reg[length(reg)-1]; + setlength(reg,length(reg)-1); + end; + boPop1: begin + setlength(reg,length(reg)+1); + reg[length(reg)-1]:=stack1[length(stack1)-1]; + setlength(stack1,length(stack1)-1); + end; + boPush2: begin + setlength(stack2,length(stack2)+1); + stack2[length(stack2)-1]:=reg[length(reg)-1]; + setlength(reg,length(reg)-1); + end; + boPop2: begin + setlength(reg,length(reg)+1); + reg[length(reg)-1]:=stack1[length(stack2)-1]; + setlength(stack2,length(stack2)-1); + end; + boAnd: begin + reg[length(reg)-2]:=min(reg[length(reg)-1],reg[length(reg)-2]); + setlength(reg,length(reg)-1); + end; + boOr: begin + reg[length(reg)-2]:=max(reg[length(reg)-1],reg[length(reg)-2]); + setlength(reg,length(reg)-1); + end; + boSet: reg[length(reg)-1]:=2; + boPropablySet: reg[length(reg)-1]:=1; + boClr: reg[length(reg)-1]:=0; + boDrop: setlength(reg,length(reg)-1); + boTrust: reg[length(reg)-1]:=2*byte(reg[length(reg)-1]<>0); + boMistrust: reg[length(reg)-1]:=2*byte(reg[length(reg)-1]=2); + boCopy: begin + setlength(reg,length(reg)+1); + reg[length(reg)-1]:=reg[length(reg)-2]; + end; + end{of case}; + result:=reg[0]>=genuegsamkeit; + setlength(reg,0); + setlength(stack1,0); + setlength(stack2,0); end; -constructor TFilter.create(var f: textfile); -var s: string; - i: byte; +constructor tFilter.create(var f: textfile); +var + s: string; + i: byte; begin - inherited create; - setlength(Kriterien,0); - setlength(Vergleiche,0); - setlength(Verknuepfung,0); - i:=0; - - while not eof(f) do begin - readln(f,s); - if s=':filter' then exit; - if (length(s)=0) or (s[1]='#') then continue; - if s=':filter:' then begin - if i<>0 then - raise Exception.create('Ich habe zu häufig '':filter:''!'); - inc(i); - continue; - end; - case i of - 0: begin - setlength(Kriterien,length(Kriterien)+1); - case s[1] of - 't': Kriterien[length(Kriterien)-1]:=fkZeit; - 'l': Kriterien[length(Kriterien)-1]:=fkLinie; - 'h': Kriterien[length(Kriterien)-1]:=fkHaltestelle; - else raise Exception.create('Ich kenne Kriterium '''+s[1]+''' nicht!'); - end{of Case}; - delete(s,1,1); - setlength(Vergleiche,length(Vergleiche)+1); - Vergleiche[length(Vergleiche)-1]:=s; - end; - 1: begin - setlength(Verknuepfung,length(Verknuepfung)+1); - case s[1] of - '-': Verknuepfung[length(Verknuepfung)-1]:=boNot; - '&': Verknuepfung[length(Verknuepfung)-1]:=boAnd; - '|': Verknuepfung[length(Verknuepfung)-1]:=boOr; - '0': Verknuepfung[length(Verknuepfung)-1]:=boClr; - '1': Verknuepfung[length(Verknuepfung)-1]:=boPropablySet; - '2': Verknuepfung[length(Verknuepfung)-1]:=boSet; - 'v': Verknuepfung[length(Verknuepfung)-1]:=boPush1; - '^': Verknuepfung[length(Verknuepfung)-1]:=boPop1; - '<': Verknuepfung[length(Verknuepfung)-1]:=boPush2; - '>': Verknuepfung[length(Verknuepfung)-1]:=boPop2; - '*': Verknuepfung[length(Verknuepfung)-1]:=boDrop; - '~': Verknuepfung[length(Verknuepfung)-1]:=boCopy; - 'T': Verknuepfung[length(Verknuepfung)-1]:=boTrust; - 'M': Verknuepfung[length(Verknuepfung)-1]:=boMistrust; - else raise Exception.create('Ich kenne Verknüpfung '''+s[1]+''' nicht!'); - end{of Case}; - end; - end{of Case}; - end; - raise Exception.create('Unerwartetes Dateiende!'); -end; - -destructor TFilter.destroy; -var i: longint; -begin - for i:=0 to length(Vergleiche)-1 do - Vergleiche[i]:=''; - setlength(Kriterien,0); - setlength(Vergleiche,0); - setlength(Verknuepfung,0); - inherited destroy; + inherited create; + setlength(kriterien,0); + setlength(vergleiche,0); + setlength(verknuepfung,0); + i:=0; + + while not eof(f) do begin + readln(f,s); + if s=':filter' then exit; + if (length(s)=0) or (s[1]='#') then continue; + if s=':filter:' then begin + if i<>0 then + raise exception.create('Ich habe zu häufig '':filter:''!'); + inc(i); + continue; + end; + case i of + 0: begin + setlength(kriterien,length(kriterien)+1); + case s[1] of + 't': kriterien[length(kriterien)-1]:=fkZeit; + 'l': kriterien[length(kriterien)-1]:=fkLinie; + 'h': kriterien[length(kriterien)-1]:=fkHaltestelle; + else raise Exception.create('Ich kenne Kriterium '''+s[1]+''' nicht!'); + end{of Case}; + delete(s,1,1); + setlength(vergleiche,length(vergleiche)+1); + vergleiche[length(vergleiche)-1]:=s; + end; + 1: begin + setlength(verknuepfung,length(verknuepfung)+1); + case s[1] of + '-': verknuepfung[length(verknuepfung)-1]:=boNot; + '&': verknuepfung[length(verknuepfung)-1]:=boAnd; + '|': verknuepfung[length(verknuepfung)-1]:=boOr; + '0': verknuepfung[length(verknuepfung)-1]:=boClr; + '1': verknuepfung[length(verknuepfung)-1]:=boPropablySet; + '2': verknuepfung[length(verknuepfung)-1]:=boSet; + 'v': verknuepfung[length(verknuepfung)-1]:=boPush1; + '^': verknuepfung[length(verknuepfung)-1]:=boPop1; + '<': verknuepfung[length(verknuepfung)-1]:=boPush2; + '>': verknuepfung[length(verknuepfung)-1]:=boPop2; + '*': verknuepfung[length(verknuepfung)-1]:=boDrop; + '~': verknuepfung[length(verknuepfung)-1]:=boCopy; + 'T': verknuepfung[length(verknuepfung)-1]:=boTrust; + 'M': verknuepfung[length(verknuepfung)-1]:=boMistrust; + else raise exception.create('Ich kenne Verknüpfung '''+s[1]+''' nicht!'); + end{of Case}; + end; + end{of Case}; + end; + raise exception.create('Unerwartetes Dateiende!'); end; -function extract_time(source: string): tdatetime; -var s: string; +destructor tFilter.destroy; +var + i: longint; begin - s:=copy(source,1,pos('-',source)-1); - delete(source,1,pos('-',source)); - s:=copy(source,1,pos('-',source)-1)+'.'+s; - delete(source,1,pos('-',source)); - s:=copy(source,1,pos('T',source)-1)+'.'+s; - delete(source,1,pos('T',source)); - s:=s+' '+source; - result:=strtodatetime(s); + for i:=0 to length(vergleiche)-1 do + vergleiche[i]:=''; + setlength(kriterien,0); + setlength(vergleiche,0); + setlength(verknuepfung,0); + inherited destroy; end; -function extract_advtime(source: string): tdatetime; +function extractTime(source: string): tDateTime; +var + ja,mo,ta,st,mi,se: word; begin - delete(source,1,pos('"',source)); - source:=copy(source,1,pos('"',source)-1); - result:=extract_time(source); + ja:=strtoint(erstesArgument(source,'-')); + mo:=strtoint(erstesArgument(source,'-')); + ta:=strtoint(erstesArgument(source,'T')); + st:=strtoint(erstesArgument(source,':')); + mi:=strtoint(erstesArgument(source,':')); + se:=strtoint(source); + result:=encodeDate(ja,mo,ta)+encodeTime(st,mi,se,0); end; function extract(verifyer,source: string): string; overload; begin - result:=''; - if (pos('<'+verifyer+'>',source)>0) or - (pos('<'+verifyer+' ',source)>0) then - begin - delete(source,1,pos('<'+verifyer,source)+length('<'+verifyer)-1); - delete(source,1,pos('>',source)); - result:=copy(source,1,pos('',source)-1); + result:=''; + if (pos('<'+verifyer+'>',source)>0) or + (pos('<'+verifyer+' ',source)>0) then begin + delete(source,1,pos('<'+verifyer,source)+length('<'+verifyer)-1); + delete(source,1,pos('>',source)); + result:=copy(source,1,pos('',source)-1); end; end; -function extract(verifyer,source: string; var Tag: string): string; overload; +function extract(verifyer,source: string; out tag: string): string; overload; begin - result:=''; - if (pos('<'+verifyer+'>',source)>0) or - (pos('<'+verifyer+' ',source)>0) then - begin - delete(source,1,pos('<'+verifyer,source)+length('<'+verifyer)-1); - Tag:=copy(source,2,pos('>',source)-2); - delete(source,1,pos('>',source)); - result:=copy(source,1,pos('',source)-1); + result:=''; + tag:=''; + if (pos('<'+verifyer+'>',source)>0) or + (pos('<'+verifyer+' ',source)>0) then begin + delete(source,1,pos('<'+verifyer,source)+length('<'+verifyer)-1); + tag:=copy(source,2,pos('>',source)-2); + delete(source,1,pos('>',source)); + result:=copy(source,1,pos('',source)-1); end; end; diff --git a/jenah.lpi b/jenah.lpi index 4c0f222..b456aae 100644 --- a/jenah.lpi +++ b/jenah.lpi @@ -28,19 +28,15 @@ - + - - - - + - + - @@ -53,8 +49,11 @@ - + + + + @@ -74,12 +73,6 @@ - - - - - - diff --git a/jenah.lpr b/jenah.lpr index c078881..0ba2fb6 100644 --- a/jenah.lpr +++ b/jenah.lpr @@ -3,11 +3,9 @@ program jenah; {$mode objfpc}{$H+} uses - {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, - {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset - Forms, Unit1, lnetvisual, filterunit + Forms, Unit1, filterunit, jenahunit { you can add units after this }; {$R *.res} diff --git a/jenah.lps b/jenah.lps index b7e8de6..293778a 100644 --- a/jenah.lps +++ b/jenah.lps @@ -1,172 +1,188 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jenah.res b/jenah.res index 3bfffa0..955b8f8 100644 Binary files a/jenah.res and b/jenah.res differ diff --git a/normal.ico b/normal.ico index cb6b9a3..55b71e3 100644 Binary files a/normal.ico and b/normal.ico differ diff --git a/optionen.txt b/optionen.txt index 7ed028a..ced6824 100644 --- a/optionen.txt +++ b/optionen.txt @@ -8,8 +8,10 @@ t00:02:30 :filter: - & -& +v | +^ +& T :filter diff --git a/unbekannt.ico b/unbekannt.ico index c92ec9e..69dd092 100644 Binary files a/unbekannt.ico and b/unbekannt.ico differ diff --git a/unit1.lfm b/unit1.lfm index d7926f7..9a952d5 100644 --- a/unit1.lfm +++ b/unit1.lfm @@ -1,15 +1,17 @@ object Form1: TForm1 - Left = 362 + Left = 2320 Height = 576 - Top = 176 + Top = 163 Width = 779 Caption = 'Form1' ClientHeight = 576 ClientWidth = 779 + OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy OnResize = FormResize - LCLVersion = '1.2.2.0' + OnShow = FormShow + LCLVersion = '1.4.4.0' object Memo1: TMemo Left = 0 Height = 490 @@ -20,32 +22,124 @@ object Form1: TForm1 ) TabOrder = 0 end + object unbekanntIcon: TImage + Left = 56 + Height = 18 + Top = 8 + Width = 18 + Picture.Data = { + 055449636F6E7E03000000000100010010100000010018006803000016000000 + 2800000010000000200000000100180000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000004D4D4D4D4D4D4D4D4D4D4D4D00000000000000000000 + 00000000000000000000000000000000000000000000000000004D4D4D000000 + 0000004D4D4D0000000000000000000000000000000000000000000000000000 + 000000000000000000000000004D4D4D4D4D4D00000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000004D4D4D + 4D4D4D4D4D4D0000000000000000000000000000000000000000000000000000 + 000000000000000000004D4D4D0000000000004D4D4D00000000000000000000 + 00000000000000000000000000000000000000000000000000004D4D4D000000 + 0000000000004D4D4D4D4D4D0000000000000000000000000000000000000000 + 000000000000000000004D4D4D0000000000000000000000000000004D4D4D00 + 00000000000000000000000000000000000000000000000000000000004D4D4D + 4D4D4D4D4D4D0000000000004D4D4D0000000000000000000000000000000000 + 000000000000000000000000000000000000000000004D4D4D0000000000004D + 4D4D000000000000000000000000000000000000000000000000000000000000 + 0000000000004D4D4D0000000000004D4D4D0000000000000000000000000000 + 000000000000000000000000000000000000000000004D4D4D0000000000004D + 4D4D0000000000000000000000000000000000004D4D4D4D4D4D4D4D4D000000 + 0000004D4D4D0000000000000000004D4D4D0000000000000000000000000000 + 000000004D4D4D0000000000004D4D4D4D4D4D0000000000000000000000004D + 4D4D0000000000000000000000000000000000004D4D4D000000000000000000 + 0000000000000000000000004D4D4D0000000000000000000000000000000000 + 000000000000004D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D00000000 + 0000000000000000FE3F0000FC3F0000FC3F0000FE7F0000FE3F0000FC3F0000 + FC0F0000FC070000FE070000FFC30000FFC30000FFC30000F1830000F0030000 + F0070000F80F0000 + } + Visible = False + end + object busDaIcon: TImage + Left = 84 + Height = 18 + Top = 8 + Width = 18 + Picture.Data = { + 055449636F6E7E03000000000100010010100000010018006803000016000000 + 2800000010000000200000000100180000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000000000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000B70000FF00 + 00FF0000BF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000B80000FF0000FF0000B80000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000B80000FF00 + 00FF0000B80000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000B80000FF0000FF0000B80000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000B80000FF00 + 00FF0000B80000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000BC0000FF0000FF0000BC0000FF0000FF4040788080 + 388080384040780000FF4040788080388080384040780000FF40405480803880 + 80384040540000FF0000FF808038FFFF00FFFF008080380000FF808038FFFF00 + FFFF008080380000FF808038FFFF00FFFF008080380000FF0000FF808038FFFF + 00FFFF008080380000FF808038FFFF00FFFF008080380000FF808038FFFF00FF + FF008080380000FF0000FF808038FFFF00FFFF008080380000FF808038FFFF00 + FFFF008080380000FF808038FFFF00FFFF008080380000FF0000FF808038FFFF + 00FFFF008080380000FF808038FFFF00FFFF008080380000FF808038FFFF00FF + FF008080380000FF0000FF4040788080388080384040780000FF404078808038 + 8080384040780000FF4040788080388080384040780000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF93F9000011F1000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000080010000 + } + Visible = False + end + object normalIcon: TImage + Left = 112 + Height = 18 + Top = 8 + Width = 18 + Picture.Data = { + 055449636F6E7E03000000000100010010100000010018006803000016000000 + 2800000010000000200000000100180000000000000000000000000000000000 + 0000000000000000000000000000000000008000000000007800007800007800 + 0078000078000078000000000080000000000000000000000000000000000000 + 0000830500780000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00780000830500 + 000000000000000000000000000000780000780000FFFF00FFFE00FFFF00FFFF + 00FFFF00FFFF00FFFE00FFFF0078000078000000000000000080000083050078 + 0000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + 780000830500800000000000780000FFFF00FFFF00780000780000FFFF00FFFF + 00FFFF00FFFF00780000780000FFFF00FFFF00780000000000780000FFFF00FF + FE00FFFF00780000780000FFFF00FFFF00FFFF00FFFF00780000780000FFFF00 + FFFE00FFFF00780000780000FFFF00FFFF00FFFF00780000780000FFFF00FFFF + 00FFFF00FFFF00780000780000FFFF00FFFF00FFFF00780000780000FFFF00FF + FF00FFFF00780000780000780000780000780000780000780000780000FFFF00 + FFFF00FFFF00780000780000FFFF00FFFF00FFFF007800007800007800007800 + 00780000780000780000780000FFFF00FFFF00FFFF00780000780000FFFF00FF + FF00FFFF00780000780000FFFF00FFFF00FFFF00FFFF00780000780000FFFF00 + FFFF00FFFF00780000780000FFFF00FFFE00FFFF00780000780000FFFF00FFFF + 00FFFF00FFFF00780000780000FFFF00FFFE00FFFF00780000000000780000FF + FF00FFFF00780000780000FFFF00FFFF00FFFF00FFFF00780000780000FFFF00 + FFFF00780000000000800000830500780000FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0078000083050080000000000000000078 + 0000780000FFFF00FFFE00FFFF00FFFF00FFFF00FFFF00FFFE00FFFF00780000 + 780000000000000000000000000000000000830500780000FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF0078000083050000000000000000000000000000000000 + 0000800000000000780000780000780000780000780000780000000000800000 + 0000000000000000F81F0000F00F0000E0070000C00300008001000000000000 + 000000000000000000000000000000000000000080010000C0030000E0070000 + F00F0000F81F0000 + } + Visible = False + end object TrayIcon1: TTrayIcon OnDblClick = TrayIcon1DblClick OnMouseDown = TrayIcon1MouseDown left = 8 top = 8 end - object LHTTPClientComponent1: TLHTTPClientComponent - Tag = -1 - Host = 'fpl.jenah.de' - OnDoneInput = LHTTPClientComponent1DoneInput - OnInput = LHTTPClientComponent1Input - Timeout = 0 - left = 120 - top = 8 - end - object Starttimer: TTimer - Tag = -3 - Interval = 50 - OnTimer = StarttimerTimer - left = 48 - top = 8 - end - object Timer1: TTimer - Interval = 30000 - OnTimer = Timer1Timer - left = 83 - top = 8 - end end diff --git a/unit1.pas b/unit1.pas index 50e6baa..941fe5f 100644 --- a/unit1.pas +++ b/unit1.pas @@ -5,41 +5,33 @@ unit Unit1; interface uses - Classes, SysUtils, FileUtil, lNetComponents, Forms, Controls, Graphics, - Dialogs, ExtCtrls, StdCtrls, lhttp, filterunit, math; + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, + Dialogs, ExtCtrls, StdCtrls, jenahunit; type { TForm1 } TForm1 = class(TForm) - LHTTPClientComponent1: TLHTTPClientComponent; + unbekanntIcon: TImage; + busDaIcon: TImage; + normalIcon: TImage; Memo1: TMemo; - Starttimer: TTimer; - Timer1: TTimer; TrayIcon1: TTrayIcon; + procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); - procedure LHTTPClientComponent1DoneInput(ASocket: TLHTTPClientSocket); - function LHTTPClientComponent1Input(ASocket: TLHTTPClientSocket; - ABuffer: pchar; ASize: integer): integer; - procedure StarttimerTimer(Sender: TObject); - procedure Timer1Timer(Sender: TObject); + procedure FormShow(Sender: TObject); procedure TrayIcon1DblClick(Sender: TObject); procedure TrayIcon1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { private declarations } - procedure parseOptionFile; - procedure Station_waehlen; - procedure Zeiten_holen; + procedure abfahrtenAnzeigen(sender: tObject); public { public declarations } - mastnr: array of longint; - Stat,buff: string; - Anzeige: array of tAbfahrt; - Filter_s: array of tFilter; + jenahThread: tJenahThread; lastButton: tMouseButton; end; @@ -52,27 +44,13 @@ implementation { TForm1 } -procedure TForm1.Station_waehlen; -begin - LHTTPClientComponent1.URI:='http://fpl.jenah.de/bontip-ifgi/php/getStation.php?action=getMastNo&q='+stat+'&q2='; - LHTTPClientComponent1.SendRequest; -end; - -procedure TForm1.Zeiten_holen; -begin - LHTTPClientComponent1.Tag:=0; - LHTTPClientComponent1.URI:='http://fpl.jenah.de/bontip-ifgi/php/proxy.php?vsz=120&azbid='+inttostr(mastnr[Starttimer.tag-1]); - LHTTPClientComponent1.SendRequest; -end; - procedure TForm1.TrayIcon1DblClick(Sender: TObject); begin case lastButton of - mbLeft: begin - if form1.visible then Form1.Hide - else Form1.Show; - end; - mbRight: Application.Terminate; + mbLeft: + form1.visible:=not form1.visible; + mbRight: + form1.close; end{of case}; end; @@ -82,49 +60,27 @@ begin lastButton:=Button; end; -procedure TForm1.parseOptionFile; -var f: textfile; - s: string; +procedure TForm1.FormCreate(Sender: TObject); begin - assignfile(f,extractfilepath(application.exename)+'optionen.txt'); - reset(f); - while not eof(f) do begin - readln(f,s); - if (length(s)=0) or (s[1]='#') then continue; - if pos('haltestelle:',s)=1 then begin - delete(s,1,length('haltestelle:')); - stat:=s; - continue; - end; - if pos('filter:',s)=1 then begin - setlength(Filter_s,length(Filter_s)+1); - Filter_s[length(Filter_s)-1]:=TFilter.create(f); - continue; - end; - raise Exception.create('Verstehe '''+s+''' nicht!'); - end; - closefile(f); + lastButton:=mbLeft; + trayIcon1.icon:=unbekanntIcon.picture.icon; + trayIcon1.show; + jenahThread:=tJenahThread.create; + jenahThread.abfahrtenAnzeigen:=@abfahrtenAnzeigen; + jenahThread.parseOptionFile(extractfilepath(application.exename)+'optionen.txt'); + jenahThread.suspended:=false; end; -procedure TForm1.FormCreate(Sender: TObject); +procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin - buff:=''; - setlength(Filter_s,0); - setlength(mastnr,0); - lastButton:=mbLeft; - TrayIcon1.Icon.LoadFromFile(extractfilepath(application.exename)+'unbekannt.ico'); - TrayIcon1.Show; - Application.ProcessMessages; - parseOptionFile; + jenahThread.beenden:=true; end; procedure TForm1.FormDestroy(Sender: TObject); -var i: longint; begin - for i:=0 to length(Filter_s)-1 do - Filter_s[i].destroy; - setlength(Filter_s,0); - setlength(mastnr,0); + while not jenahThread.beendet do + sleep(10); + jenahThread.free; end; procedure TForm1.FormResize(Sender: TObject); @@ -133,121 +89,31 @@ begin memo1.height:=form1.clientheight-memo1.top; end; -procedure TForm1.LHTTPClientComponent1DoneInput(ASocket: TLHTTPClientSocket); -var s,t,meth,zeit: string; - i: integer; -begin - s:=buff; - buff:=''; - meth:=extract('method',S); - if meth = 'getMastNo' then - begin - setlength(Anzeige,0); - s:=extract('result',s); - setlength(mastnr,strtoint(extract('stopcount',s))); - for i:=0 to length(mastnr)-1 do - begin - mastnr[i]:=strtoint(extract('stopno',extract('stop',s))); - delete(s,1,pos('',s)); - end; - Starttimer.Tag:=1; - Starttimer.enabled:=true; - exit; - end; - if meth='' then - begin - s:=extract('AZBNachricht',s); - while pos('0 do - begin - t:=extract('AZBFahrplanlage',s,zeit); - delete(s,1,pos('',s)+length('')-1); - setlength(Anzeige,length(Anzeige)+1); - meth:=extract('AZBID',t); - delete(meth,1,length(meth)-4); - Anzeige[length(Anzeige)-1].HaltestellenId:=strtoint(meth); - Anzeige[length(Anzeige)-1].Linie:=extract('LinienText',t); - Anzeige[length(Anzeige)-1].Ziel:=extract('ZielHst',t); - Anzeige[length(Anzeige)-1].Richtung:=extract('RichtungsText',t); - Anzeige[length(Anzeige)-1].sAn:=extract_time(extract('AnkunftszeitAZBPlan',t)); - Anzeige[length(Anzeige)-1].iAn:=extract_time(extract('AnkunftszeitAZBPrognose',t)); - Anzeige[length(Anzeige)-1].sAb:=extract_time(extract('AbfahrtszeitAZBPlan',t)); - Anzeige[length(Anzeige)-1].iAb:=extract_time(extract('AbfahrtszeitAZBPrognose',t)); - end; - Starttimer.Enabled:=true; - exit; - end; - Memo1.lines.add(meth); - Memo1.lines.add(S); -end; - -function TForm1.LHTTPClientComponent1Input(ASocket: TLHTTPClientSocket; - ABuffer: pchar; ASize: integer): integer; -begin - buff:=buff+copy(ABuffer,1,ASize); - result:=ASize; -end; +const __erstesMal: boolean = true; -procedure TForm1.StarttimerTimer(Sender: TObject); -var I: Integer; - Hinweis: string; +procedure TForm1.FormShow(Sender: TObject); begin - Starttimer.enabled:=false; - if Starttimer.tag = -3 then begin - Form1.visible:=false; - Starttimer.tag:=-1; - parseOptionFile; - end; - if Starttimer.tag = -1 then begin - Station_waehlen; - exit - end; - if Starttimer.Tag = 0 then begin - Starttimer.Tag := -1; - Form1.Visible:=false; - exit; - end; - if Starttimer.Tag >= 1 then begin - Zeiten_holen; - if Starttimer.Tag>=length(mastnr) then Starttimer.Tag := -2 - else Starttimer.Tag := Starttimer.Tag + 1; - exit; - end; - if Starttimer.Tag = -2 then begin - Memo1.lines.clear; - Hinweis:=''; - for I:=0 to length(Anzeige)-1 do begin - if (length(Filter_s)<=0) or - (Filter_s[0].regel_erfuellt(Anzeige[I],2)) then - Hinweis:=Hinweis+#$0D#$0A+Anzeige[I].Linie+'('+inttostr(Anzeige[I].HaltestellenID)+'): '+timetostr(Anzeige[I].iAb); - if (length(Filter_s)<=0) or - (Filter_s[min(1,length(Filter_s)-1)].regel_erfuellt(Anzeige[I],1)) then begin - Memo1.lines.add(inttostr(Anzeige[I].HaltestellenId)+': <'+ - Anzeige[I].Linie+'> '''+ - Anzeige[I].Richtung+''' nach '''+ - Anzeige[I].Ziel+''': '+ - timetostr(Anzeige[I].iAn)+' ('+ - timetostr(Anzeige[I].sAn)+') -> '+ - timetostr(Anzeige[I].iAb)+' ('+ - timetostr(Anzeige[I].sAb)+')'); - end; - end; - if length(Hinweis)>0 then begin - delete(Hinweis,1,2); - TrayIcon1.Hint:=Hinweis; - TrayIcon1.Icon.LoadFromFile(extractfilepath(application.exename)+'bus_da.ico'); - end - else begin - TrayIcon1.Hint:='Busauskunft - kein Bus in Sicht!'#0; - TrayIcon1.Icon.LoadFromFile(extractfilepath(application.exename)+'normal.ico'); - end; - exit; - end; + if __erstesMal then begin + __erstesMal:=false; + form1.visible:=false; + end; + form1.left:= + screen.monitors[0].left + (screen.monitors[0].width -form1.width ) div 2; + form1.top:= + screen.monitors[0].top + (screen.monitors[0].height-form1.height) div 2; end; -procedure TForm1.Timer1Timer(Sender: TObject); +procedure tForm1.abfahrtenAnzeigen(sender: tObject); begin - starttimer.Tag:=-1; - starttimer.enabled:=true; + memo1.lines.text:=jenahThread.memoZeilen; + if jenahThread.bahnKommt then begin + trayIcon1.icon:=busDaIcon.picture.icon; + trayIcon1.hint:=jenahThread.hinweis; + end + else begin + trayIcon1.icon:=normalIcon.picture.icon; + trayIcon1.hint:='zur Zeit keine Abfahrt'; + end; end; end. -- cgit v1.2.3-54-g00ecf