unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin, ComCtrls, ExtCtrls, Menus, SlitherlinkUnit; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; CheckBox1: TCheckBox; MenuItem1: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem; MenuItem4: TMenuItem; MenuItem5: TMenuItem; MenuItem6: TMenuItem; OpenDialog1: TOpenDialog; PopupMenu1: TPopupMenu; ProgressBar1: TProgressBar; SaveDialog1: TSaveDialog; SpinEdit1: TSpinEdit; SpinEdit2: TSpinEdit; SpinEdit3: TSpinEdit; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure CheckBox1Change(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); procedure MenuItem1Click(Sender: TObject); procedure MenuItem2Click(Sender: TObject); procedure MenuItem3Click(Sender: TObject); procedure MenuItem4Click(Sender: TObject); procedure MenuItem5Click(Sender: TObject); procedure MenuItem6Click(Sender: TObject); procedure SpinEdit1Change(Sender: TObject); procedure SpinEdit2Change(Sender: TObject); procedure SpinEdit3Change(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { private declarations } public { public declarations } Feld: TFeld; GenThread: TGenerierungsThread; end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin Feld:=TFeld.Create(Form1); Feld.Lerndatei:=Extractfilepath(Application.Exename)+'gelerntes.dat'; Feld.Oben:=32; Form1.OnKeyPress:=@(Feld.OnKeyPress); SpinEdit1.OnKeyPress:=@(Feld.OnKeyPress); SpinEdit2.OnKeyPress:=@(Feld.OnKeyPress); SpinEdit3.OnKeyPress:=@(Feld.OnKeyPress); Button1.OnKeyPress:=@(Feld.OnKeyPress); Button2.OnKeyPress:=@(Feld.OnKeyPress); Button3.OnKeyPress:=@(Feld.OnKeyPress); Button4.OnKeyPress:=@(Feld.OnKeyPress); Button5.OnKeyPress:=@(Feld.OnKeyPress); end; procedure TForm1.Button1Click(Sender: TObject); begin if Button1.Caption = 'erzeugen' then Feld.Erzeugen(Progressbar1) else Feld.LoadFromFeld(GenThread.Feld); Feld.Zeichnen; if Assigned(GenThread) then GenThread.Free; GenThread:=nil; GenThread:=TGenerierungsThread.create(Spinedit1.Value,Spinedit2.Value,Progressbar1,nil,Checkbox1.Checked); Button1.Caption:='noch eins'; Button1.Enabled:=false; end; procedure TForm1.Button2Click(Sender: TObject); begin Feld.RueckGaengig; Feld.Zeichnen; end; procedure TForm1.Button3Click(Sender: TObject); begin if OpenDialog1.Execute then if Feld.LoadFromFile(OpenDialog1.FileName) then Feld.Zeichnen else MessageDlg('Ungültiges Dateiformat!',mterror,[mbOk],0); end; procedure TForm1.Button4Click(Sender: TObject); begin if SaveDialog1.Execute then Feld.SaveToFile(SaveDialog1.FileName); end; procedure TForm1.Button5Click(Sender: TObject); begin Feld.Erzeugen(Progressbar1,true); end; procedure TForm1.CheckBox1Change(Sender: TObject); begin Feld.Schleife:=Checkbox1.Checked; Feld.Zeichnen; end; procedure TForm1.FormActivate(Sender: TObject); var I: Integer; begin For I:=0 to Form1.ComponentCount-1 do begin if Form1.Components[I] is TButton then (Form1.Components[I] as TButton).OnKeyDown:=Form1.OnKeyDown; if Form1.Components[I] is TSpinEdit then (Form1.Components[I] as TSpinEdit).OnKeyDown:=Form1.OnKeyDown; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin Feld.Destroy; if assigned(GenThread) then GenThread.destroy; end; procedure TForm1.FormResize(Sender: TObject); begin Progressbar1.Width:=Form1.ClientWidth-Progressbar1.Left; end; procedure TForm1.MenuItem1Click(Sender: TObject); var x,y: longint; s: string; begin // Feld.FelderErzeugen; spinedit1.value:=13; spinedit2.value:=12; checkbox1.checked:=true; (* s:= ' 2222 2222 '+ '22 22 22 22'+ '2 00 2320 02'+ '1 0 0 1 1'+ '1 1'+ '2 2'+ '21 12'+ '120 21'+ '022 022 '+ ' 22 022 '+ ' 0 221 122 0 '+ ' 01232100 '; // geht! *) s:= '02 0 022 0'+ '2 0 2'+ ' 3 2'+ ' 0 0 0 1'+ '1 '+ ' 0 '+ '2 1 '+ '1 02 '+ '0220 02 '+ ' 20 '+ ' 0 2 '+ ' 1 3 0 '; for x:=0 to Feld.Breite-1 do for y:=0 to Feld.Hoehe-1 do if s[1+x+y*Feld.Breite]<>' ' then Feld.Felder[x+y*(Feld.Breite+1)]:= ord(s[1+x+y*Feld.Breite])-ord('0'); Feld.Zeichnen; end; procedure TForm1.MenuItem2Click(Sender: TObject); begin Feld.Leeren(ProgressBar1,1); Feld.Zeichnen; end; procedure TForm1.MenuItem3Click(Sender: TObject); var anz: longint; begin anz:=Feld.LoesungsAnzahl; messagedlg('Es gibt zur Zeit '+inttostr(anz)+' Lösungsmöglichkeit'+copy('en',1,2*byte(anz<>1))+'.',mtInformation,[mbOk],0); end; procedure TForm1.MenuItem4Click(Sender: TObject); var i: longint; begin for i:=0 to 9 do begin Feld.Leeren(ProgressBar1,1); Feld.Zeichnen; Application.ProcessMessages; end; end; procedure TForm1.MenuItem5Click(Sender: TObject); begin Feld.Leeren(ProgressBar1,1,false); end; procedure TForm1.MenuItem6Click(Sender: TObject); var i: longint; begin for i:=0 to 9 do begin Feld.Leeren(ProgressBar1,1,false); Feld.Zeichnen; Application.ProcessMessages; end; end; procedure TForm1.SpinEdit1Change(Sender: TObject); begin Feld.Breite:=SpinEdit1.Value; Feld.Zeichnen; end; procedure TForm1.SpinEdit2Change(Sender: TObject); begin Feld.Hoehe:=SpinEdit2.Value; Feld.Zeichnen; end; procedure TForm1.SpinEdit3Change(Sender: TObject); begin Feld.Optionen.Schriftgroesse:=Spinedit3.Value; Feld.Zeichnen; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if Assigned(GenThread) and (GenThread.Fertig=1) then begin GenThread.Fertig:=2; Button1.Enabled:=true; end; end; end.