summaryrefslogtreecommitdiff
path: root/unit1.pas
diff options
context:
space:
mode:
Diffstat (limited to 'unit1.pas')
-rw-r--r--unit1.pas190
1 files changed, 190 insertions, 0 deletions
diff --git a/unit1.pas b/unit1.pas
new file mode 100644
index 0000000..962682c
--- /dev/null
+++ b/unit1.pas
@@ -0,0 +1,190 @@
+unit Unit1;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+ Spin, ExtCtrls, mystringlistunit;
+
+type
+
+ { TForm1 }
+
+ TForm1 = class(TForm)
+ Image1: TImage;
+ Memo1: TMemo;
+ Memo2: TMemo;
+ SpinEdit1: TSpinEdit;
+ SpinEdit2: TSpinEdit;
+ procedure FormActivate(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure FormResize(Sender: TObject);
+ procedure Memo1Change(Sender: TObject);
+ private
+ personen,tage: tMyStringList;
+ zeiten: array of longint;
+ kannNicht: array of array of array of longint;
+ inhaltOk: boolean;
+ procedure clearArrays;
+ procedure schreibeNach(x,y: longint; s: string);
+ public
+ procedure zeichnen;
+ procedure interpretiereInhalt;
+ end;
+
+var
+ Form1: TForm1;
+
+implementation
+
+{$R *.lfm}
+
+uses
+ math;
+
+{ TForm1 }
+
+procedure TForm1.FormResize(Sender: TObject);
+begin
+ memo2.width:=form1.clientWidth-memo1.left;
+ image1.free;
+ image1:=tImage.create(form1);
+ image1.parent:=form1;
+ image1.left:=0;
+ image1.top:=160;
+ image1.width:=form1.clientWidth-image1.left;
+ image1.height:=form1.clientHeight-image1.top;
+ zeichnen;
+end;
+
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+ personen:=tMyStringList.create;
+ tage:=tMyStringList.create;
+ setLength(kannNicht,0);
+ setLength(zeiten,0);
+ inhaltOk:=false;
+end;
+
+procedure TForm1.FormActivate(Sender: TObject);
+begin
+ interpretiereInhalt;
+ zeichnen;
+end;
+
+procedure TForm1.FormDestroy(Sender: TObject);
+begin
+ clearArrays;
+ personen.free;
+ tage.free;
+end;
+
+procedure TForm1.Memo1Change(Sender: TObject);
+begin
+ interpretiereInhalt;
+ zeichnen;
+end;
+
+procedure tForm1.clearArrays;
+var
+ i,j: longint;
+begin
+ personen.clear;
+ tage.clear;
+ for i:=0 to length(kannNicht)-1 do begin
+ for j:=0 to length(kannNicht[i])-1 do
+ setLength(kannNicht[i,j],0);
+ setLength(kannNicht[i],0);
+ end;
+ setLength(kannNicht,0);
+ setLength(zeiten,0);
+end;
+
+procedure tForm1.schreibeNach(x,y: longint; s: string);
+begin
+ image1.canvas.textOut(
+ round(image1.width/(tage.count+1)*(x+0.5) - image1.canvas.textWidth(s)/2),
+ round(image1.height/(length(zeiten)+1)*(y+0.5) - image1.canvas.textHeight(s)/2),
+ s
+ );
+end;
+
+procedure tForm1.zeichnen;
+var
+ i,j,k: longint;
+ ma,mi: longint;
+ guete: extended;
+ s: string;
+begin
+ if not inhaltOk then
+ exit;
+ image1.canvas.brush.color:=$ffffff;
+ image1.canvas.rectangle(-1,-1,image1.width+1,image1.height+1);
+ ma:=-1;
+ mi:=-1;
+ for i:=0 to length(zeiten)-1 do
+ for j:=0 to tage.count-1 do begin
+ if (ma<0) or (ma < length(kannNicht[i,j])) then
+ ma:=length(kannNicht[i][j]);
+ if (mi<0) or (mi > length(kannNicht[i,j])) then
+ mi:=length(kannNicht[i][j]);
+ end;
+ for i:=0 to length(zeiten)-1 do
+ schreibeNach(0,i+1,intToStr(zeiten[i]));
+ for j:=0 to tage.count-1 do
+ schreibeNach(j+1,0,tage[j]);
+ for i:=0 to length(zeiten)-1 do
+ for j:=0 to tage.count-1 do begin
+ guete:=min(1,max(0,1-(length(kannNicht[i,j])-mi)/(ma-mi+byte(ma=mi))));
+ if guete<0.5 then
+ image1.canvas.brush.color:=$ff or (round($ff*(2*guete)) shl 8)
+ else
+ image1.canvas.brush.color:=$ff00 or round($ff*(2-2*guete));
+ image1.canvas.pen.color:=image1.canvas.brush.color;
+ image1.canvas.rectangle(
+ round(image1.width/(tage.count+1)*(j+1)),
+ round(image1.height/(length(zeiten)+1)*(i+1)),
+ round(image1.width/(tage.count+1)*(j+2))-1,
+ round(image1.height/(length(zeiten)+1)*(i+2))-1
+ );
+ image1.canvas.pen.color:=$000000;
+ s:='';
+ for k:=0 to length(kannNicht[i,j])-1 do
+ s:=s+personen[kannNicht[i,j,k]]+', ';
+ delete(s,length(s)-1,2);
+ schreibeNach(j+1,i+1,s);
+ end;
+end;
+
+procedure tForm1.interpretiereInhalt;
+var
+ i,j,k: longint;
+begin
+ inhaltOk:=false;
+ clearArrays;
+ setLength(zeiten,spinEdit2.value - spinEdit1.value);
+ for i:=spinEdit1.value to spinEdit2.value-1 do
+ zeiten[i-spinEdit1.value]:=i;
+ tage.text:=memo1.lines.text;
+ tage.grep('^$',true);
+ personen.add('EE');
+ setLength(kannNicht,length(zeiten));
+ for i:=0 to length(kannNicht)-1 do begin
+ setLength(kannNicht[i],tage.count);
+ for j:=0 to length(kannNicht[i])-1 do begin
+ setLength(kannNicht[i,j],round(5*random));
+ for k:=0 to length(kannNicht[i,j])-1 do
+ kannNicht[i,j,k]:=0;
+ end;
+ end;
+ inhaltOk:=
+ (personen.count>0) and
+ (tage.count>0) and
+ (length(zeiten)>0);
+end;
+
+end.
+