Listing Program formMain (Unit1.pas)
Listing Program formMain (Unit1.pas)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math, ExtCtrls, Menus, Grids, DB, ADODB, Buttons; type TformMain = class(TForm) btnCompute: TButton; Image1: TImage; Image2: TImage; Button1: TButton; saveFile: TSaveDialog; MainMenu1: TMainMenu; Input1: TMenuItem; UpdateInput1: TMenuItem; Exit1: TMenuItem; Instruction1: TMenuItem; Instruction2: TMenuItem; About1: TMenuItem; Peramalan1: TMenuItem; RegresiLinear1: TMenuItem; StringGrid1: TStringGrid; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; ADOQuery2: TADOQuery; BitBtn1: TBitBtn; Label1: TLabel; cboBeamWidth: TComboBox; Label2: TLabel; cboFilterWidth: TComboBox; procedure btnComputeClick(Sender: TObject); procedure initialState(); procedure beamSearch(); procedure evaluateInsertion(no_node: integer); procedure evaluateSwap(no_node: integer); procedure FormCreate(Sender: TObject); procedure gambarGrafik(); procedure Button1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure Input2Click(Sender: TObject); procedure UpdateInput1Click(Sender: TObject); procedure RegresiLinear1Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure hitungBobot(); procedure Instruction2Click(Sender: TObject); procedure About1Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure cboBeamWidthChange(Sender: TObject); private
{ Private declarations } public { Public declarations } end; machine = record banyak_alokasi : integer; //banyak job yang ditaruh pada mesin tersebut no_alokasi : array [1..10] of integer; //job nomor berapa saja yang dijadwalkan alokasi_bobot : array [1..10] of real; //bobot dari job yg dijadwalkan yg sudah dikali kekuatan mesin total_alokasi : real; //total waktu yang diperlukan untuk mesin tersebut end; combination = record dari_job : integer; //no job yang mau dipindah dari_mesin : integer; //dari mesin nomer berapa ke_job : integer; //ke job mana mau ditukar (khusus swap) ke_mesin :integer; //mau ditaruh ke mesin no berapa bobot_terbesar : real; //waktu terbesar dari semua mesin total_evaluasi : real; //total waktu dari mesin1,2,3,4 end; smallest = record tipe : string; //insertion atau swap bobot : real; jumlah_bobot : real; no_node : integer; //diambil dari node keberapa no_kombinasi : integer; //no swap atau kombinasi keberapa end; bobot_rec= record a : real; b : real; end; var formMain: TformMain; banyak_job : integer; banyak_mesin : integer; bobot_job : array[1..20] of real; warna_job : array[1..20] of integer;//warna pilihannya 1,2,3 atau 4 warna mesin_optimal : array[1..4] of machine; mesin : array[1..10,1..4] of machine; mesin_cek_flipflop : array [1..3,1..4] of machine; beam_width : integer; alpha : integer; mesin_paling_berat : integer; insertion : array[1..10,1..20] of combination; banyak_insertion : array[1..10] of integer; swap : array[1..10,1..40] of combination; banyak_swap : array[1..10] of integer; terkecil : array[1..10] of smallest; warna : array[1..20] of integer; persamaan_mesin : array[1..4] of bobot_rec; bmp : TBitmap; //utk gabungin 2 image uses Unit2, Unit3, Unit4, Unit5; {$R *.dfm} function bobot_mesin(no_mesin:integer; bobot:real; no_warnajob:integer):real; begin if no_mesin=1 then //SORMZ begin if warna_job[no_warnajob]>2 then bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot else if warna_job[no_warnajob]<=2 then bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot/2; end else if no_mesin=2 then //GTOZ52 begin if warna_job[no_warnajob]>2 then bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot else if warna_job[no_warnajob]<=2 then bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot/2; end else if no_mesin=3 then //GTO 46 begin bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot*(warna_job[no_warnajob]/4); end else if no_mesin=4 then //MITSUBISHI begin bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot; end; end; procedure TformMain.initialState(); var i,j:integer; begin for i:=1 to banyak_mesin do begin mesin_optimal[i].banyak_alokasi:=0;//mulai dari index 1 end; i:=1; for j:=1 to banyak_job do begin mesin_optimal[i].no_alokasi[mesin_optimal[i].banyak_alokasi+1]:=j; mesin_optimal[i].alokasi_bobot[mesin_optimal[i].banyak_alokasi+1]:=bobo t_mesin(i,bobot_job[j],j); mesin_optimal[i].banyak_alokasi:=mesin_optimal[i].banyak_alokasi+1; i:=i+1;
end; for i:=1 to banyak_mesin do begin mesin_optimal[i].total_alokasi:=0; for j:=1 to mesin_optimal[i].banyak_alokasi do begin mesin_optimal[i].total_alokasi:=mesin_optimal[i].total_alokasi+mesin_op timal[i].alokasi_bobot[j]; end; end; for i:=1 to beam_width+alpha do begin for j:=1 to banyak_mesin do begin mesin[i][j]:=mesin_optimal[j]; end; end; end; procedure TformMain.evaluateInsertion(no_node:integer); var i,j:integer; tmp_total_alokasi:array [1..20,1..4] of real; begin for i:=1 to banyak_insertion[no_node] do begin for j:=1 to banyak_mesin do begin if j=insertion[no_node][i].dari_mesin then tmp_total_alokasi[i][j]:= mesin[no_node][insertion[no_node][i].dari_mesin].total_alokasi- bobot_mesin(insertion[no_node][i].dari_mesin,bobot_job[insertion[no_nod e][i].dari_job],insertion[no_node][i].dari_job) else if j=insertion[no_node][i].ke_mesin then tmp_total_alokasi[i][j]:= mesin[no_node][insertion[no_node][i].ke_mesin].total_alokasi
- bobot_mesin(insertion[no_node][i].ke_mesin,bobot_job[insertion[no_node] [i].dari_job],insertion[no_node][i].dari_job) else tmp_total_alokasi[i][j]:=mesin[no_node][j].total_alokasi; end; //menyimpan nilai bobot terbesar dari suatu insertion insertion[no_node][i].bobot_terbesar:=tmp_total_alokasi[i][1]; for j:=1 to banyak_mesin do begin if insertion[no_node][i].bobot_terbesar < tmp_total_alokasi[i][j] then begin insertion[no_node][i].bobot_terbesar := tmp_total_alokasi[i][j]; end; end; //menyimpan nilai hasil pertambahan bobot2 mesin 1,2,3,4 pd suatu
- bobot_mesin(swap[no_node][i].dari_mesin,bobot_job[swap[no_node][i].dari _job],swap[no_node][i].dari_job)
- bobot_mesin(swap[no_node][i].dari_mesin,bobot_job[swap[no_node][i].ke_j ob],swap[no_node][i].ke_job) else if j=swap[no_node][i].ke_mesin then tmp_total_alokasi[i][j]:= mesin[no_node][swap[no_node][i].ke_mesin].total_alokasi
- bobot_mesin(swap[no_node][i].ke_mesin,bobot_job[swap[no_node][i].dari_j ob],swap[no_node][i].dari_job)
- bobot_mesin(swap[no_node][i].ke_mesin,bobot_job[swap[no_node][i].ke_job ],swap[no_node][i].ke_job) else tmp_total_alokasi[i][j]:=mesin[no_node][j].total_alokasi; end; //menyimpan nilai bobot terbesar dari suatu insertion swap[no_node][i].bobot_terbesar:=tmp_total_alokasi[i][1]; for j:=1 to banyak_mesin do begin if swap[no_node][i].bobot_terbesar < tmp_total_alokasi[i][j] then begin swap[no_node][i].bobot_terbesar := tmp_total_alokasi[i][j]; end; end; //menyimpan nilai hasil pertambahan bobot2 mesin 1,2,3,4 pd suatu swap swap[no_node][i].total_evaluasi:=0; for j:=1 to banyak_mesin do begin swap[no_node][i].total_evaluasi:=swap[no_node][i].total_evaluasi+tmp_to
//dari nilai paling kecil cari total dari mesin1,2,3,4 terkecil for i:=1 to banyak_insertion[1] do begin tmp_if:=terkecil[j].jumlah_bobot>insertion[1][i].total_evaluasi; tmp_if2:=insertion[1][i].bobot_terbesar=terkecil[j].bobot; if tmp_if and validSmallest(j,'insertion',1,i) and tmp_if2 then begin if validNotSame(j,terkecil[j].bobot,insertion[1][i].total_evaluasi) then begin terkecil[j].tipe:='insertion'; terkecil[j].no_node:=1; terkecil[j].jumlah_bobot:=insertion[1][i].total_evaluasi; terkecil[j].no_kombinasi:=i; end; end; end; for i:=1 to banyak_swap[1] do begin tmp_if:=terkecil[j].jumlah_bobot>swap[1][i].total_evaluasi; tmp_if2:=swap[1][i].bobot_terbesar=terkecil[j].bobot; if tmp_if and validSmallest(j,'swap',1,i) and tmp_if2 then begin if validNotSame(j,terkecil[j].bobot,swap[1][i].total_evaluasi) then begin terkecil[j].tipe:='swap'; terkecil[j].no_node:=1; terkecil[j].jumlah_bobot:=swap[1][i].total_evaluasi; terkecil[j].no_kombinasi:=i; end; end; end; end;//for j:=1 to beam_width+alpha do end //end dari if pertama_kali=True else//bukan pertama_kali begin //for utk cari terkecil 1,2,3 dst.. for j:=1 to byk_perulangan do begin terkecil[j].bobot:=MaxExtended;//di set menjadi nilai terbesar terkecil[j].jumlah_bobot:=MaxExtended; for x:=1 to byk_perulangan do begin for i:=1 to banyak_insertion[x] do begin tmp_if:=terkecil[j].bobot>insertion[x][i].bobot_terbesar; if tmp_if and validSmallest(j,'insertion',x,i) and validNotSame(j,insertion[x][i].bobot_terbesar,insertion[x][i].total_eva luasi) then begin //terkecil[j].tipe:='insertion'; //terkecil[j].no_node:=x; end; end; for i:=1 to banyak_swap[x] do begin tmp_if:=terkecil[j].bobot>swap[x][i].bobot_terbesar; if tmp_if and validSmallest(j,'swap',x,i) and validNotSame(j,swap[x][i].bobot_terbesar,swap[x][i].total_evaluasi) then begin //terkecil[j].tipe:='swap'; //terkecil[j].no_node:=x; terkecil[j].bobot:=swap[x][i].bobot_terbesar; end; end; end; //dari nilai paling kecil cari total dari mesin1,2,3,4 terkecil for x:=1 to byk_perulangan do begin for i:=1 to banyak_insertion[x] do begin tmp_if:=terkecil[j].jumlah_bobot>insertion[x][i].total_evaluasi; tmp_if2:=insertion[x][i].bobot_terbesar=terkecil[j].bobot; if tmp_if and validSmallest(j,'insertion',x,i) and tmp_if2 then begin if validNotSame(j,terkecil[j].bobot,insertion[x][i].total_evaluasi) then begin terkecil[j].tipe:='insertion'; terkecil[j].no_node:=x; terkecil[j].jumlah_bobot:=insertion[x][i].total_evaluasi; terkecil[j].no_kombinasi:=i; end; end; end; for i:=1 to banyak_swap[x] do begin tmp_if:=terkecil[j].jumlah_bobot>swap[x][i].total_evaluasi; tmp_if2:=swap[x][i].bobot_terbesar=terkecil[j].bobot; if tmp_if and validSmallest(j,'swap',x,i) and tmp_if2 then begin if validNotSame(j,terkecil[j].bobot,swap[x][i].total_evaluasi) then begin terkecil[j].tipe:='swap'; terkecil[j].no_node:=x; terkecil[j].jumlah_bobot:=swap[x][i].total_evaluasi; terkecil[j].no_kombinasi:=i; end; end; end; end; end;//for j:=1 to beam_width do end;//else if pertama_kali=false
//update mesin nilai2 node lama menjadi nilai2 node baru dengan bobot terkecil for i:=1 to byk_perulangan do begin if terkecil[i].tipe='insertion' then begin for j:=1 to banyak_mesin do begin if j=insertion[terkecil[i].no_node][terkecil[i].no_kombinasi].dari_mesin then begin //atur alokasi job dan bobot job tmp_byk_alokasi:=0; tmp_mesin[i][j].total_alokasi:=0; for x:=1 to mesin[terkecil[i].no_node][j].banyak_alokasi do begin if mesin[terkecil[i].no_node][j].no_alokasi[x] <> insertion[terkecil[i].no_node][terkecil[i].no_kombinasi].dari_job then begin tmp_byk_alokasi:=tmp_byk_alokasi+1; tmp_mesin[i][j].no_alokasi[tmp_byk_alokasi]:=mesin[terkecil[i].no_node] [j].no_alokasi[x]; tmp_mesin[i][j].alokasi_bobot[tmp_byk_alokasi]:=mesin[terkecil[i].no_no de][j].alokasi_bobot[x]; tmp_mesin[i][j].total_alokasi:=tmp_mesin[i][j].total_alokasi+tmp_mesin[ i][j].alokasi_bobot[tmp_byk_alokasi]; end; end; tmp_mesin[i][j].banyak_alokasi:=tmp_byk_alokasi; end else if j=insertion[terkecil[i].no_node][terkecil[i].no_kombinasi].ke_mesin then begin //copy yg lama for x:=1 to mesin[terkecil[i].no_node][j].banyak_alokasi do begin tmp_mesin[i][j].no_alokasi[x]:=mesin[terkecil[i].no_node][j].no_alokasi [x]; tmp_mesin[i][j].alokasi_bobot[x]:=mesin[terkecil[i].no_node][j].alokasi _bobot[x]; end; tmp_mesin[i][j].total_alokasi:=mesin[terkecil[i].no_node][j].total_alok asi; //tambah yg insertion-nya tmp_mesin[i][j].no_alokasi[mesin[terkecil[i].no_node][j].banyak_alokasi
- 1]:=insertion[terkecil[i].no_node][terkecil[i].no_kombinasi].dari_job;
Image2.Canvas.Brush.Color := clWhite; Image2.Canvas.FillRect(rg); //grafik alokasi job rg.Left:=20; rg.Top:=5; rg.Right:=90; rg.Bottom:=30; Image1.Canvas.TextOut(rg.Right+20,rg.Top,'Grafik Alokasi Job'); ctr_warna:=1; //titik jam paling akhir Image1.Canvas.TextOut(75-58,Image1.Height-25,'Waktu (jam)'); Image1.Canvas.TextOut(Image1.Width-25-3,Image1.Height-25-2,chr(39)); mesin_paling_berat:=1; for i:=1 to banyak_mesin do begin if mesin_optimal[i].total_alokasi > mesin_optimal[mesin_paling_berat].total_alokasi then begin mesin_paling_berat:=i; end; end; Image1.Canvas.TextOut(Image1.Width-25-12,Image1.Height- 25+3,format('%4.2f',[mesin_optimal[mesin_paling_berat].total_alokasi])); //titik2 jam dari 1 sampai jam paling akhir lebar:=Image1.Width-25-3-75; persatuan:=lebar/Floor(mesin_optimal[mesin_paling_berat].total_alokasi); for i:=1 to Floor(mesin_optimal[mesin_paling_berat].total_alokasi)-1 do begin Image1.Canvas.TextOut(75+i*Floor(persatuan),Image1.Height-25- 2,chr(39)); Image1.Canvas.TextOut(75+i*Floor(persatuan)-2,Image1.Height- 25+3,inttostr(i)); end; //garis X pos.X:=75; pos.Y:=Image1.Height-25; Image1.Canvas.PenPos:=pos; Image1.Canvas.LineTo(Image1.Width-25,Image1.Height-25); //garis Y pos.X:=75; pos.Y:=Image1.Height-25; Image1.Canvas.PenPos:=pos; Image1.Canvas.LineTo(75,25); Image1.Canvas.TextOut(75-20,25-15,'Mesin'); //nilai-nilai Y dan nama mesin nm_mesin[1]:='SORMZ'; nm_mesin[2]:='GTOZ52'; nm_mesin[3]:='GTO46'; nm_mesin[4]:='MIT 1-F4'; for i:=1 to banyak_mesin do begin
Image1.Canvas.TextOut(75-3,Image1.Height-25-i*37,'-'); Image1.Canvas.TextOut(75-70,Image1.Height-25-i*37,nm_mesin[i]); end; //gambar kotak2 lebar:=Image1.Width-75-30;//lebar yg mungkin mesin_paling_berat:=1; for i:=1 to banyak_mesin do begin if mesin_optimal[i].total_alokasi > mesin_optimal[mesin_paling_berat].total_alokasi then begin mesin_paling_berat:=i; end; end; persatuan:=lebar/mesin_optimal[mesin_paling_berat].total_alokasi; for i:=1 to banyak_mesin do begin rg.Left:=75+1; for j:=1 to mesin_optimal[i].banyak_alokasi do begin rg.Right:=rg.Left+Floor(mesin_optimal[i].alokasi_bobot[j]*persatuan); rg.Bottom:=Image1.Height-25-18-(i-1)*37; rg.Top:=Image1.Height-25-42-(i-1)*37; Image1.Canvas.Brush.Color:=warna[ctr_warna]; ctr_warna:=ctr_warna+1; Image1.Canvas.Rectangle(rg); rg.Left:=rg.Left+Floor(mesin_optimal[i].alokasi_bobot[j]*persatuan); end; end; //label keterangan rg.Left:=15; rg.Top:=3; rg.Right:=30; rg.Bottom:=30; Image2.Canvas.Brush.Color:=clWhite; Image2.Canvas.TextOut(rg.Right+35,rg.Top,'Keterangan'); //Gambar legend rg.Left:=20; rg.Top:=20; rg.Right:=60; rg.Bottom:=30; ctr:=1; //set tabel StringGrid1.ColCount:=8; StringGrid1.Cells[6,0]:='No Mesin'; StringGrid1.ColWidths[7]:=110; StringGrid1.Cells[7,0]:='Waktu Proses (jam)'; for i:=1 to banyak_mesin do begin for j:=1 to mesin_optimal[i].banyak_alokasi do begin Image2.Canvas.Brush.Color:=warna[ctr]; Image2.Canvas.FillRect(rg); Image2.Canvas.Brush.Color:=clWhite; Image2.Canvas.TextOut(rg.Right+20,rg.Top,'Job '+IntToStr(mesin_optimal[i].no_alokasi[j])); Image2.Canvas.TextOut(rg.Right+55,rg.Top,StringGrid1.Cells[0,mesin_opti mal[i].no_alokasi[j]]); rg.Top:=rg.Bottom+5; rg.Bottom:=rg.Top+10; ctr:=ctr+1; //masukin di stringgrid / tabel informasinya StringGrid1.Cells[6,mesin_optimal[i].no_alokasi[j]]:=inttostr(i); grand_total_alokasi:=grand_total_alokasi+mesin_optimal[i].alokasi_bobot [j]; StringGrid1.Cells[7,mesin_optimal[i].no_alokasi[j]]:=floattostr(mesin_o ptimal[i].alokasi_bobot[j]); end; end; StringGrid1.Cells[0,StringGrid1.RowCount-1]:='Jumlah'; StringGrid1.Cells[7,StringGrid1.RowCount- 1]:=floattostr(grand_total_alokasi); //gabung 2 image bmp:=TBitmap.Create; bmp.Canvas.Create; bmp.Width:=Image1.Width+Image2.Width; bmp.Height:=Image2.Height; for i:=0 to Image1.Width-1 do begin for j:=0 to Image1.Height-1 do begin bmp.Canvas.Pixels[i,j]:=Image1.Canvas.Pixels[i,j]; end; end; for i:=0 to Image2.Width-1 do begin for j:=0 to Image2.Height-1 do begin bmp.Canvas.Pixels[i+Image1.Width,j]:=Image2.Canvas.Pixels[i,j]; end; end; end; procedure TformMain.FormCreate(Sender: TObject); begin Image1.Canvas.Create; Image2.Canvas.Create; warna[1]:=clHighlight; warna[2]:=clInfoBk; warna[3]:=clSkyBlue;
warna[5]:=clAqua; warna[6]:=clFuchsia; warna[7]:=clBlue; warna[8]:=clYellow; warna[9]:=clLime; warna[10]:=clRed; warna[11]:=clSilver; warna[12]:=clMaroon; warna[13]:=clGreen; warna[14]:=clOlive; warna[15]:=clNavy; warna[16]:=clPurple; warna[17]:=clTeal; ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Pass word="";Data Source='+GetCurrentDir+'\database.mdb;Persist Security Info=True'; stringgrid1.Cells[0,0]:='Kode Job'; stringgrid1.Cells[1,0]:='Nama Pesanan'; stringgrid1.Cells[2,0]:='Jumlah'; stringgrid1.Cells[3,0]:='Ukuran'; stringgrid1.Cells[4,0]:='Warna'; stringgrid1.Cells[5,0]:='Dua sisi'; end; procedure TformMain.Button1Click(Sender: TObject); var fileName : String; fileConfirm : Boolean; begin formMain.saveFile.InitialDir := GetCurrentDir; formMain.saveFile.Filter := 'Bitmap Image|*.bmp|'; fileConfirm := formMain.saveFile.Execute(); if fileConfirm = true then begin fileName := formMain.saveFile.FileName; bmp.SaveToFile(fileName); MessageDlg('Grafik sudah disimpan di ' + fileName, mtInformation, [mbOk] ,0); end; end; procedure TformMain.Exit1Click(Sender: TObject); begin Application.Terminate; end; procedure TformMain.Input2Click(Sender: TObject); begin formInput.showModal; end; procedure TformMain.UpdateInput1Click(Sender: TObject); begin formInput.ShowModal; procedure TformMain.RegresiLinear1Click(Sender: TObject); begin frmRegresi.ShowModal; end; procedure TformMain.FormActivate(Sender: TObject); begin ADOQuery1.Active:=false; ADOQuery1.Active:=true; ADOQuery1.First; banyak_job:=0; baris_pilihan:=-1; while ADOQuery1.Eof=False do begin banyak_job:=banyak_job+1; stringgrid1.Cells[0,banyak_job]:=ADOQuery1.FieldByName('kode').AsString; stringgrid1.Cells[1,banyak_job]:=ADOQuery1.FieldByName('nama').AsString; stringgrid1.Cells[2,banyak_job]:=ADOQuery1.FieldByName('jumlah').AsStri ng; stringgrid1.Cells[3,banyak_job]:=ADOQuery1.FieldByName('ukuran').AsStri ng; stringgrid1.Cells[4,banyak_job]:=ADOQuery1.FieldByName('warna').AsStrin g; stringgrid1.Cells[5,banyak_job]:=ADOQuery1.FieldByName('dua_sisi').AsSt ring; StringGrid1.RowCount:=banyak_job+2; ADOQuery1.Next; end; end; procedure TformMain.Instruction2Click(Sender: TObject); begin frmInstruction.Show; end; procedure TformMain.About1Click(Sender: TObject); begin frmAbout.Show; end; procedure TformMain.BitBtn1Click(Sender: TObject); begin Application.Terminate; end; procedure TformMain.cboBeamWidthChange(Sender: TObject); var i:integer; cbofilterwidth.Items.Clear; for i:=1 to strtoint(cbobeamwidth.Text) do begin cbofilterwidth.Items.Add(inttostr(i)); end; end; end.Listing Program formInput (Unit2.pas)
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, ADODB, DB; type TformInput = class(TForm) StringGrid1: TStringGrid; GroupBox1: TGroupBox; Label1: TLabel; txtKode: TEdit; Label2: TLabel; txtNama: TEdit; Label3: TLabel; txtJumlah: TEdit; Label4: TLabel; cboUkuran: TComboBox; Label5: TLabel; Label6: TLabel; rdoSisiYa: TRadioButton; rdoSisiTidak: TRadioButton; cmdAdd: TButton; cmdUpdate: TButton; cboWarna: TComboBox; cmdEdit: TButton; cmdInsert: TButton; cmdDelete: TButton; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; procedure FormCreate(Sender: TObject); procedure cmdAddClick(Sender: TObject); procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure cmdInsertClick(Sender: TObject); procedure cmdEditClick(Sender: TObject); procedure cmdDeleteClick(Sender: TObject); procedure cmdUpdateClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var formInput: TformInput; byk_input: integer; baris_pilihan:integer; implementation uses Unit1; {$R *.dfm} procedure TformInput.FormCreate(Sender: TObject); begin stringgrid1.Cells[0,0]:='Kode Job'; stringgrid1.Cells[1,0]:='Nama Pesanan'; stringgrid1.Cells[2,0]:='Jumlah'; stringgrid1.Cells[3,0]:='Ukuran'; stringgrid1.Cells[4,0]:='Warna'; stringgrid1.Cells[5,0]:='Dua sisi'; byk_input:=0; cmdAdd.Enabled:=false; cmdUpdate.Enabled:=false; cmdEdit.Enabled:=false; cmdDelete.Enabled:=false; baris_pilihan:=-1; //set koneksi ke database ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Pass word="";Data Source='+GetCurrentDir+'\database.mdb;Persist Security Info=True'; end; procedure TformInput.cmdAddClick(Sender: TObject); begin byk_input:=byk_input+1; stringgrid1.Cells[0,byk_input]:=txtKode.Text; stringgrid1.Cells[1,byk_input]:=txtNama.Text; stringgrid1.Cells[2,byk_input]:=txtJumlah.Text; stringgrid1.Cells[3,byk_input]:=cboUkuran.Text; stringgrid1.Cells[4,byk_input]:=cboWarna.Text; if rdoSisiYa.Checked then stringgrid1.Cells[5,byk_input]:=rdoSisiYa.Caption else stringgrid1.Cells[5,byk_input]:=rdoSisiTidak.Caption; txtKode.Text:=''; txtNama.Text:=''; txtJumlah.Text:=''; cboUkuran.Text:='1/4 A4'; cboWarna.Text:='1';
StringGrid1.RowCount:=byk_input+2; end; procedure TformInput.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin baris_pilihan:=ARow; cmdEdit.Enabled:=true; cmdDelete.Enabled:=true; end; procedure TformInput.cmdInsertClick(Sender: TObject); begin cmdAdd.Enabled:=true; cmdUpdate.Enabled:=false; end; procedure TformInput.cmdEditClick(Sender: TObject); begin if baris_pilihan<>-1 then begin cmdAdd.Enabled:=false; cmdUpdate.Enabled:=true; txtKode.Text:=StringGrid1.Cells[0,baris_pilihan]; txtNama.Text:=StringGrid1.Cells[1,baris_pilihan]; txtJumlah.Text:=StringGrid1.Cells[2,baris_pilihan]; cboUkuran.Text:=StringGrid1.Cells[3,baris_pilihan]; cboWarna.Text:=StringGrid1.Cells[4,baris_pilihan]; if StringGrid1.Cells[5,baris_pilihan]='Ya' then rdoSisiYa.Checked:=True else rdoSisiTidak.Checked:=True; end else MessageDlg('Silahkan pilih baris yang hendak diedit',mtWarning,[mbOK],0); end; procedure TformInput.cmdDeleteClick(Sender: TObject); var i:integer; label skipthis; begin if baris_pilihan=StringGrid1.RowCount-1 then begin MessageDlg('Silahkan pilih baris yang hendak didelete',mtWarning,[mbOK],0); goto skipthis; end; if (baris_pilihan<>-1) and (byk_input>0) then begin for i:=baris_pilihan to StringGrid1.RowCount-1 do begin
StringGrid1.Cells[1,i]:=StringGrid1.Cells[1,i+1]; StringGrid1.Cells[2,i]:=StringGrid1.Cells[2,i+1]; StringGrid1.Cells[3,i]:=StringGrid1.Cells[3,i+1]; StringGrid1.Cells[4,i]:=StringGrid1.Cells[4,i+1]; StringGrid1.Cells[5,i]:=StringGrid1.Cells[5,i+1]; end; StringGrid1.Cells[0,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[1,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[2,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[3,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[4,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[5,StringGrid1.RowCount-1]:=''; StringGrid1.RowCount:=StringGrid1.RowCount-1; byk_input:=byk_input-1; end else MessageDlg('Silahkan pilih baris yang hendak didelete',mtWarning,[mbOK],0); baris_pilihan:=-1; cmdDelete.Enabled:=false; cmdEdit.Enabled:=false; skipthis: end; procedure TformInput.cmdUpdateClick(Sender: TObject); begin stringgrid1.Cells[0,baris_pilihan]:=txtKode.Text; stringgrid1.Cells[1,baris_pilihan]:=txtNama.Text; stringgrid1.Cells[2,baris_pilihan]:=txtJumlah.Text; stringgrid1.Cells[3,baris_pilihan]:=cboUkuran.Text; stringgrid1.Cells[4,baris_pilihan]:=cboWarna.Text; if rdoSisiYa.Checked then stringgrid1.Cells[5,baris_pilihan]:=rdoSisiYa.Caption else stringgrid1.Cells[5,baris_pilihan]:=rdoSisiTidak.Caption; txtKode.Text:=''; txtNama.Text:=''; txtJumlah.Text:=''; cboUkuran.Text:='1/4 A4'; cboWarna.Text:='1'; rdoSisiTidak.Checked:=true; baris_pilihan:=-1; cmdEdit.Enabled:=false; cmdUpdate.Enabled:=false; cmdDelete.Enabled:=false; end; procedure TformInput.FormClose(Sender: TObject; var Action: TCloseAction); var i:integer; ya_tidak:String; begin
ADOConnection1.Execute('DELETE FROM jobs WHERE true;'); for i:=1 to byk_input do begin if StringGrid1.Cells[5,i]='Ya' then ya_tidak:='Ya' else ya_tidak:='Tidak'; ADOConnection1.Execute('INSERT INTO jobs'+ '(kode,nama,jumlah,ukuran,warna,dua_sisi)'+ ' values("'+StringGrid1.Cells[0,i]+'",'+ '"'+StringGrid1.Cells[1,i]+'",'+ StringGrid1.Cells[2,i]+','+ '"'+StringGrid1.Cells[3,i]+'",'+ StringGrid1.Cells[4,i]+','+ '"'+ya_tidak+'");'); end; formMain.StringGrid1.ColCount:=6; for i:=1 to formMain.StringGrid1.RowCount do begin formMain.StringGrid1.Cells[0,i]:=''; formMain.stringgrid1.Cells[1,i]:=''; formMain.stringgrid1.Cells[2,i]:=''; formMain.stringgrid1.Cells[3,i]:=''; formMain.stringgrid1.Cells[4,i]:=''; formMain.stringgrid1.Cells[5,i]:=''; end; for i:=1 to byk_input do begin formMain.StringGrid1.Cells[0,i]:=StringGrid1.Cells[0,i]; formMain.stringgrid1.Cells[1,i]:=StringGrid1.Cells[1,i]; formMain.stringgrid1.Cells[2,i]:=StringGrid1.Cells[2,i]; formMain.stringgrid1.Cells[3,i]:=StringGrid1.Cells[3,i]; formMain.stringgrid1.Cells[4,i]:=StringGrid1.Cells[4,i]; formMain.stringgrid1.Cells[5,i]:=StringGrid1.Cells[5,i]; end; formMain.stringgrid1.RowCount:=StringGrid1.RowCount; end; procedure TformInput.FormActivate(Sender: TObject); begin ADOQuery1.Active:=false; ADOQuery1.Active:=true; ADOQuery1.First; byk_input:=0; baris_pilihan:=-1; while ADOQuery1.Eof=False do begin byk_input:=byk_input+1; stringgrid1.Cells[0,byk_input]:=ADOQuery1.FieldByName('kode').AsString; stringgrid1.Cells[2,byk_input]:=ADOQuery1.FieldByName('jumlah').AsStrin g; stringgrid1.Cells[3,byk_input]:=ADOQuery1.FieldByName('ukuran').AsStrin g; stringgrid1.Cells[4,byk_input]:=ADOQuery1.FieldByName('warna').AsString; stringgrid1.Cells[5,byk_input]:=ADOQuery1.FieldByName('dua_sisi').AsStr ing; StringGrid1.RowCount:=byk_input+2; ADOQuery1.Next; end; end; end.
Listing Program frmRegresi (Unit3.pas)
unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls, Math, DB, ADODB; type TfrmRegresi = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Image1: TImage; Button1: TButton; Button2: TButton; StringGrid1: TStringGrid; txtX: TEdit; txtY: TEdit; Button3: TButton; txtKorelasi: TEdit; txtRegresi: TEdit; txtKP: TEdit; Button4: TButton; Button5: TButton; Label6: TLabel; cboMesin: TComboBox; Button6: TButton; ADOConnection1: TADOConnection; Label7: TLabel; Label8: TLabel; txtXPredict: TEdit;
Button7: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure tampilan(); procedure drawGraph(a:real;b:real); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmRegresi: TfrmRegresi; var byk_variabel: integer; var x_besar:array[1..20] of real; var y_besar:array[1..20] of real; var x_kecil:array[1..20] of real; var y_kecil:array[1..20] of real; var x_bar:real; var y_bar:real; var x_kuadrat:array[1..20] of real; var y_kuadrat:array[1..20] of real; var xy:array[1..20] of real; var sigma_x_kecil:real; var sigma_y_kecil:real; var sigma_x_kuadrat:real; var sigma_y_kuadrat:real; var sigma_xy:real; var r:real; var KP:real; var a,b:real; var warna:array[1..20] of integer; implementation uses Types, Unit1; {$R *.dfm} procedure TfrmRegresi.Button1Click(Sender: TObject); var i:integer; tmp:real; begin tmp:=0; for i:=1 to byk_variabel do begin tmp:=tmp+x_besar[i]; end; tmp:=0; for i:=1 to byk_variabel do begin tmp:=tmp+y_besar[i]; end; y_bar:=tmp/byk_variabel; sigma_x_kecil:=0; for i:=1 to byk_variabel do begin x_kecil[i]:=x_besar[i]-x_bar; sigma_x_kecil:=sigma_x_kecil+x_kecil[i]; end; sigma_y_kecil:=0; for i:=1 to byk_variabel do begin y_kecil[i]:=y_besar[i]-y_bar; sigma_y_kecil:=sigma_y_kecil+y_kecil[i]; end; sigma_x_kuadrat:=0; for i:=1 to byk_variabel do begin x_kuadrat[i]:=x_kecil[i]*x_kecil[i]; sigma_x_kuadrat:=sigma_x_kuadrat+x_kuadrat[i]; end; sigma_y_kuadrat:=0; for i:=1 to byk_variabel do begin y_kuadrat[i]:=y_kecil[i]*y_kecil[i]; sigma_y_kuadrat:=sigma_y_kuadrat+y_kuadrat[i]; end; sigma_xy:=0; for i:=1 to byk_variabel do begin xy[i]:=x_kecil[i]*y_kecil[i]; sigma_xy:=sigma_xy+xy[i]; end; tampilan; r:=sigma_xy/( Sqrt(sigma_x_kuadrat)*Sqrt(sigma_y_kuadrat) ); //koefisien penentu KP:=r*r; txtKorelasi.Text:=format('%7.5f',[r]);//floattostr(r); txtKP.Text:=format('%7.5f',[KP]);//floattostr(KP); end; procedure TfrmRegresi.Button2Click(Sender: TObject);
i:integer; tmp:real; begin tmp:=0; for i:=1 to byk_variabel do begin tmp:=tmp+x_besar[i]; end; x_bar:=tmp/byk_variabel; tmp:=0; for i:=1 to byk_variabel do begin tmp:=tmp+y_besar[i]; end; y_bar:=tmp/byk_variabel; sigma_x_kecil:=0; for i:=1 to byk_variabel do begin x_kecil[i]:=x_besar[i]-x_bar; sigma_x_kecil:=sigma_x_kecil+x_kecil[i]; end; sigma_y_kecil:=0; for i:=1 to byk_variabel do begin y_kecil[i]:=y_besar[i]-y_bar; sigma_y_kecil:=sigma_y_kecil+y_kecil[i]; end; sigma_x_kuadrat:=0; for i:=1 to byk_variabel do begin x_kuadrat[i]:=x_kecil[i]*x_kecil[i]; sigma_x_kuadrat:=sigma_x_kuadrat+x_kuadrat[i]; end; sigma_y_kuadrat:=0; for i:=1 to byk_variabel do begin y_kuadrat[i]:=y_kecil[i]*y_kecil[i]; sigma_y_kuadrat:=sigma_y_kuadrat+y_kuadrat[i]; end; sigma_xy:=0; for i:=1 to byk_variabel do begin xy[i]:=x_kecil[i]*y_kecil[i]; sigma_xy:=sigma_xy+xy[i]; end; tampilan; b:=((byk_variabel*sigma_xy)- (sigma_x_kecil*sigma_y_kecil))/((byk_variabel*sigma_x_kuadrat)- a:=y_bar - b*x_bar; a:=strtofloat(format('%7.5f',[a])); b:=strtofloat(format('%7.5f',[b])); if a>=0 then txtRegresi.text:= floattostr(a) + ' + ' + floattostr(b) + 'X' else txtRegresi.text:= floattostr(b) + 'X' + floattostr(a); //gambar grafik drawGraph(a,b); button7.Enabled:=true; end; procedure TfrmRegresi.Button3Click(Sender: TObject); begin byk_variabel:=byk_variabel+1; stringgrid1.Cells[0,byk_variabel]:=txtX.Text; stringgrid1.Cells[1,byk_variabel]:=txtY.Text; x_besar[byk_variabel]:=strtofloat(txtX.Text); y_besar[byk_variabel]:=strtofloat(txtY.Text); txtX.Text:=''; txtY.Text:=''; txtX.SetFocus; stringgrid1.RowCount:=byk_variabel+2; end; procedure TfrmRegresi.Button7Click(Sender: TObject); begin txtypredict.Text:=format('%7.2f',[(a+b*strtofloat(txtxpredict.Text))]); end; procedure TfrmRegresi.tampilan(); var i:integer; begin for i:=1 to byk_variabel do begin stringgrid1.cells[2,i]:=floattostr(x_kecil[i]); stringgrid1.cells[3,i]:=floattostr(y_kecil[i]); stringgrid1.cells[4,i]:=floattostr(xy[i]); stringgrid1.cells[5,i]:=floattostr(x_kuadrat[i]); stringgrid1.cells[6,i]:=floattostr(y_kuadrat[i]); end; end; procedure TfrmRegresi.FormCreate(Sender: TObject); begin stringgrid1.Cells[0,0]:='x'; stringgrid1.Cells[1,0]:='y'; stringgrid1.Cells[2,0]:='X'; stringgrid1.Cells[3,0]:='Y'; stringgrid1.Cells[5,0]:='X?; stringgrid1.Cells[6,0]:='Y?; byk_variabel:=0; //inisialisasi canvas Image1.Canvas.Create; ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Pass word="";Data Source='+GetCurrentDir+'\database.mdb;Persist Security Info=True'; end; procedure TfrmRegresi.Button4Click(Sender: TObject); var i:integer; rg : TRect; begin StringGrid1.RowCount:=2; for i:=1 to byk_variabel do begin stringgrid1.Cells[0,i]:=''; stringgrid1.Cells[1,i]:=''; stringgrid1.Cells[2,i]:=''; stringgrid1.Cells[3,i]:=''; stringgrid1.Cells[4,i]:=''; stringgrid1.Cells[5,i]:=''; stringgrid1.Cells[6,i]:=''; end; byk_variabel:=0; txtKorelasi.Text:=''; txtKP.Text:=''; txtRegresi.Text:=''; //grafik rg.Top := 0; rg.Bottom := Image1.Height; rg.Left := 0; rg.Right := Image1.Width; Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.FillRect(rg); end; procedure TfrmRegresi.drawGraph(a:real;b:real); var i:integer; pos:TPoint; x,y:integer; begin Image1.Canvas.TextOut(60,5,'Grafik Persamaan Linear'); //garis Y pos.X:=25; pos.Y:=Image1.Height-25; Image1.Canvas.PenPos:=pos; Image1.Canvas.LineTo(25,25); Image1.Canvas.TextOut(25-3,25-15,'Y');Image1.Canvas.TextOut(25-8,Image1.Height-25-5,'0'); //nilai-nilai Y for i:=1 to 10 do begin Image1.Canvas.TextOut(25-18,Image1.Height-25-i*25,IntToStr(i)); Image1.Canvas.TextOut(25-3,Image1.Height-25-i*25,'-'); end; //nilai-nilai X for i:=1 to 5 do begin Image1.Canvas.TextOut(25+i*33,Image1.Height-25-1,chr(39)); Image1.Canvas.TextOut(25+i*33-11,Image1.Height- 25+5,IntToStr(i*2000)); end; //garis X pos.X:=25; pos.Y:=Image1.Height-25; Image1.Canvas.PenPos:=pos; Image1.Canvas.LineTo(Image1.Width-25,Image1.Height-25); Image1.Canvas.TextOut(Image1.Width-25+4,Image1.Height-25-6,'X'); //gambar garis linear fungsinya,titik 0,0 sampai 10.000 pos.X:=25; pos.Y:=Image1.Height-25-Ceil(a*25); Image1.Canvas.PenPos:=pos; Image1.Canvas.LineTo(25+5*33,Image1.Height-21-Ceil((a+b*10000)*25)); //titik2 Image1.Canvas.Brush.Color:=clSkyBlue; for i:=1 to byk_variabel do begin x:=Round(25+x_besar[i]/2000*33); //OK y:=Image1.Height-20-Ceil(y_besar[i]*25); Image1.Canvas.Ellipse(x-4,y-4,x,y); end; Image1.Canvas.Brush.Color:=clWhite; end; procedure TfrmRegresi.Button5Click(Sender: TObject); var fileConfirm:boolean; fileName:string; begin formMain.saveFile.InitialDir := GetCurrentDir; formMain.saveFile.Filter := 'Bitmap Image|*.bmp|'; fileConfirm := formMain.saveFile.Execute(); if fileConfirm = true then begin fileName := formMain.saveFile.FileName; Image1.Picture.SaveToFile(fileName); MessageDlg('Grafik sudah disimpan di ' + fileName, mtInformation, [mbOk] ,0); end; end; begin if a>=0 then ADOConnection1.Execute('UPDATE bobot_mesin set a="'+floatToStr(a)+'", b="'+floatToStr(b)+'",plus_minus="+" where no_mesin="'+cboMesin.Text+'";') else ADOConnection1.Execute('UPDATE bobot_mesin set a="'+floatToStr(a)+'", b="'+floatToStr(b)+'",plus_minus="-" where no_mesin="'+cboMesin.Text+'";'); end; end.
Listing Program formInstruction (Unit4.pas)
unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TfrmInstruction = class(TForm) Memo1: TMemo; BitBtn1: TBitBtn; procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmInstruction: TfrmInstruction; implementation {$R *.dfm} procedure TfrmInstruction.BitBtn1Click(Sender: TObject); begin Close; end; procedure TfrmInstruction.FormCreate(Sender: TObject); begin end; end.
Listing Program formAbout (Unit5.pas) unit Unit5; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TfrmAbout = class(TForm) Memo1: TMemo; BitBtn1: TBitBtn; procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmAbout: TfrmAbout; implementation {$R *.dfm} procedure TfrmAbout.BitBtn1Click(Sender: TObject); begin Close; end; procedure TfrmAbout.FormCreate(Sender: TObject); begin end; end.