Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

9
cenadep.org http://www.cenadep.org/2013/04/05/tutorial-menampilkan-rumus-matematika-di-delphi/ Tutorial Menampilkan Rumus Matematika Di Delphi Tutorial Menampilkan Rumus Matematika Di Delphi sebenarnya masih jarang kita temui. Maksud menampilkan rumus Matematika di Delphi ini bukan berarti menampilkan kumpulan fungsi-fungsi Matematika yang tersedia di Delphi (terutama f ungsi-f ungsi dalam unit Math). Posting ini saya maksudkan untuk berbagi pengalaman menggunaan library dari Rusia untuk menampilkan persamaan/rumus matematika di Delphi. Rumus-rumus yang akan saya tulis contohnya antara lain integral & dif f erensial, Summa, Limit, Akar Kuadra (Square Root), dan rumus-rumus lain yang banyak dijumpai dalam Matematika. Posting ini juga sebagai jawaban atas pertanyaan seorang member di group Komunitas Penggemar Pemrograman Delphi Indonesia. Menampilkan Rumus/Persamaan Matematika Di Delphi Saya sendiri, dulu, sangat kesulitan dengan penampilan rumus matematika ini, sampai saya temukan sebuah library Delphi berbahasa Rusia. Di Delphi, ketika kita diminta menampilkan nilai “x kuadrat”, dengan mudah kita menulisnya sebagai : 0001 y := x * x ; {x dikali x) Dan ketika diminta menulis “x pangkat 3″, kita bisa menulis lagi: 0001 y := x * x * x; Atau, “x pangkat 1000″, maka kita tulis 0001 y := power(x,1000) ; {dariunit Mat h) Sebagaimana di contoh, “x pangkat 1000″ bisa dihitung dengan f ungsi Power() dari unit Math. Namun ini adalah hal umum, kita dapat memperoleh daf tar f ungsi matematik sejenis dari dokumentasi (Help) Delphi. Sekarang semisal kita diminta, tampilkan “x kuadrat” seperti pada gambar berikut, di Delphi: Atau “rumus luas lingkaran” seperti ini: Atau, “persamaan kuadrat”, sedikit lebih rumit lagi : Hayoooo… Mendapatkan Library Yang Diperlukan Pertama, silahkan download Mathematic Formulas Drawing Library (maaf , sebagaimana saya sebut di atas, library ini dibuat oleh orang Rusia, jadi silahkan gunakan Google Translate dengan bijak ). Kemudian silahkan ekstrak f ile hasil download [ expr.zip ] ke sebuah f older, lalu tambahkan f older tadi Library Path Delphi. Pastikan dalam f older ini ada dua f ile: ExprMake.pas dan ExprDraw.pas. Ada? Ada gak… Well, ternyata ada. Berarti kita sudah dapat membuat sebuah contoh aplikasi untuk menampilkan formula/rumus/persamaan Matematika di Delphi dalam bentuk gambar. Ada dua class utama yang akan kita butuhkan nanti, yaitu

description

Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi dilengkapi source code dan contoh untuk didownload.

Transcript of Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

Page 1: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

cenadep.o rg http://www.cenadep.org/2013/04/05/tutorial-menampilkan-rumus-matematika-di-delphi/

Tutorial Menampilkan Rumus Matematika Di Delphi

Tutorial Menampilkan Rumus Matematika Di Delphi sebenarnya masih jarang kita temui. Maksudmenampilkan rumus Matematika di Delphi ini bukan berarti menampilkan kumpulan f ungsi- f ungsi Matematikayang tersedia di Delphi (terutama f ungsi- f ungsi dalam unit Math). Posting ini saya maksudkan untuk berbagipengalaman menggunaan library dari Rusia untuk menampilkan persamaan/rumus matematika di Delphi.

Rumus-rumus yang akan saya tulis contohnya antara lain integral & dif f erensial, Summa, Limit, Akar Kuadra(Square Root), dan rumus-rumus lain yang banyak dijumpai dalam Matematika. Posting ini juga sebagaijawaban atas pertanyaan seorang member di group Komunitas Penggemar Pemrograman Delphi Indonesia.

Menampilkan Rumus/Persamaan Matematika Di DelphiSaya sendiri, dulu, sangat kesulitan dengan penampilan rumus matematika ini, sampai saya temukansebuah library Delphi berbahasa Rusia.

Di Delphi, ketika kita diminta menampilkan nilai “x kuadrat”, dengan mudah kita menulisnya sebagai :

0001 y := x * x ; {x dikali x)

Dan ketika diminta menulis “x pangkat 3″, kita bisa menulis lagi:

0001 y := x * x * x;

Atau, “x pangkat 1000″, maka kita tulis

0001 y := power(x,1000) ; {dariunit Math)

Sebagaimana di contoh, “x pangkat 1000″ bisa dihitung dengan f ungsi Power() dari unit Math. Namun iniadalah hal umum, kita dapat memperoleh daf tar f ungsi matematik sejenis dari dokumentasi (Help) Delphi.

Sekarang semisal kita diminta, tampilkan “x kuadrat” seperti pada gambar berikut, di Delphi:

Atau “rumus luas lingkaran” seperti ini:

Atau, “persamaan kuadrat”, sedikit lebih rumit lagi :

Hayoooo…

Mendapatkan Library Yang DiperlukanPertama, silahkan download Mathematic Formulas Drawing Library (maaf ,sebagaimana saya sebut di atas, library ini dibuat oleh orang Rusia, jadi silahkangunakan Google Translate dengan bijak ).

Kemudian silahkan ekstrak f ile hasil download [ expr.zip ] ke sebuah f older, lalutambahkan f older tadi Library Path Delphi. Pastikan dalam f older ini adadua f ile: ExprMake.pas dan ExprDraw.pas. Ada? Ada gak…

Well, ternyata ada. Berarti kita sudah dapat membuat sebuah contohaplikasi untuk menampilkan f ormula/rumus/persamaan Matematika diDelphi dalam bentuk gambar. Ada dua class utama yang akan kitabutuhkan nanti, yaitu

Page 2: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

TExprClass dari unit ExprDraw, dan

TExprBuilder dari unit ExprMake

TExprBuilder merupakan engine utama untuk mem-parse dan meng-generate f ormat yang diperlukan, hasilkonversi f ormula tekstual ke f ormula matematikal. Sedang TExprClass adalah drawing engine, untukmenggambar hasil konversi tadi ke gambar, yang kemudian ditampilkan ke VCL Canvas (class TCanvas).Saya singgung sedikit, TCanvas adalah VCL wrapper untuk Windows Device Context (Windows DC). Karenahampir semua kontrol (objek) dalam antarmuka aplikasi Windows memiliki Device Context, boleh sayakatakan bahwa hasil konversi library ini dapat ditampilkan hampir di semua kontrol GUI yang ada di Delphi(class-class turunan TWinControl), seperti TEdit, TButton, TForm, TPaintBox, dan beragam kontrol lainnya.

Mari kita buat sebuah projek baru, agar t idak bosan. Silahkan berkreasi dan bandingkan dengan punya saya:

Kasus terjelek, bila Anda lupa di mana komponen TPaintBox berada, saya kasih bocoran: Di ComponentPalette, page/tab “System”, dekat dengan TTimer…

Setelah Anda dapat desain yang pas, mari kita lihat kodenya. Silahkan tekan F12 untuk berpindah ke sourcecode. Hal pertama yang perlu diingat adalah, tambahkan kedua unit di atas, yaitu ExprMake dan ExprDraw keclausa uses. Silahkan bandingkan:

00010002000300040005000600070008000900100011001200130014

interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExprMake, ExprDraw, ExtCtrls; type TForm1 =class(TForm) Button1: TButton; Panel1: TPanel; Memo1: TMemo; Label1: TLabel; PaintBox1: TPaintBox;

Bila sudah, mari kita tambahkan lagi sebuah button untuk mengekspor gambar hasil konversi ke f ile. Untukekspor ke f ile, kita perlu menambahkan pula sebuah TSavePictureDialog untuk memilih f ile untuk diekspor.

Page 3: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

Plus, kita perlu sebuah TComboBox untuk menampung daf tar rumus/f ormula yang sering digunakan,sebagai panduan.

Silahkan lihat perubahan berikut:

Hasil ekspor akan kita batasi menjadi t ipe JPEG dan BITMAP, sehingga property Filter pada SaveDialog1perlu kita ubah, sehingga hanya tinggal BMP dan JPG saja. Jangan lupa tambahkan JPEG ke clausa uses.

Saatnya Kita CodingSetelah tampilan jadi, kita siap membuat kode untuk proses konversi, export, dsb….

Kita mulai dengan sebuah variabel global, yang merupakan f ield dari TForm1. Variabel ini akandigunakan sebagai buf f er untuk menampung hasil konversi bertipe TBitmap:

000100020003000400050006

private BufferBitmap: TBitMap;public end;

Selanjutnya, kita meng-create buf f er ini saat event FormCreate dan membuangnya saat event FormDestroy.Berikut kode saat FormCreate:

Page 4: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

0001000200030004000500060007000800090010001100120013

procedure TForm1.FormCreate(Sender: TObject);var i:integer;begin BufferBitmap := TBitmap.Create; for i:=0 to Length(_Expressions)-1 do begin ComboBox1.Items.Add(_Expressions[i][0]); end; ComboBox1.ItemIndex :=0; ComboBox1Change(ComboBox1);end;

Nah, Anda tentu bertanya. Di situ kenapa ada identif ier dengan nama _Expressions. Baiklah, itu adalahsebuah konstanta array dua dimensi untuk menampung daf tar f ormula dan simbol standar dalamMatematika. Kita akan melihat konstanta ini nanti. Kita lanjut saja dulu dengan FormDestroy:

00010002000300040005

procedure TForm1.FormDestroy(Sender: TObject);begin if Assigned(BufferBitmap)then FreeAndNil(BufferBitmap);end;

Kini, seperti janji saya, mari kita lihat konstant _Expressions:

00010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035

const _Expressions:array [0..91]of array [0..1]of String = ( ('Operasi Dasar','a+b/c'), ('Simbol Alpha','Alpha'), ('Simbol alpha','alpha'), ('Simbol EnglEnc','EnglEnc'), ('Simbol Beta','beta'), ('Simbol Beta0','beta0'), ('Simbol Angle 90 derajat ','Angle**90'), ('Simbol Asterix (Bintang) 1','Asterix'), ('Simbol Asterix (Bintang) 2','a_n^Asterix'), ('Simbol Psilon 1','Psi Asterix'), ('Simbol Psilon 2','Psi_Asterix'), ('Simbol Integral & Differensial','Int(Diff(y)/Diff(x))'), ('Simbol Chi','chi'), ('Simbol Koma x,y','x&comma&y'), ('Simbol Delta 1','Delta'), ('Simbol Delta 2','delta'), ('Simbol Epsilon 1','Epsilon'), ('Simbol Epsilon 2','epsilon'), ('Simbol Eta 1','Eta'), ('Simbol Eta 2','eta'), ('Simbol Gamma 1','Gamma'), ('Simbol Gamma 2','gamma'), ('Simbol Iota 1','Iota'), ('Simbol iota 2','iota'), ('Simbol Kappa 1','Kappa'), ('Simbol kappa 2','kappa'), ('Simbol Lambda 1','Lambda'), ('Simbol lambda 2','lambda'), ('Simbol Minus','a_Minus&comma&a^Minus'),

Page 5: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098

('Simbol Myu','mu'), ('Simbol Nabla 1','Nabla*f'), ('Simbol Nabla 2','Nabla*_a'), ('Simbol Nabla 3','Nabla*Vect(a)'), ('Simbol nyu','nu'), ('Simbol Omega 1','Omega'), ('Simbol Omega 2','omega'), ('Simbol Omicron','omicron'), ('Simbol Parallel 1','_a & Parallel & _b'), ('Simbol Parallel 2','a_Parallel'), ('Simbol Perpendicular 1','_a & Perpendicular & _b'), ('Simbol Perpendicular 2','x_Perpendicular'), ('Simbol Phi 1','Phi'), ('Simbol Phi 2','phi'), ('Simbol Pi 1','Pi'), ('Simbol Pi 2','pi'), ('Simbol PLambda','PLambda=lambda/(2*pi)'), ('Simbol rho','rho)'), ('Simbol Sigma 1','Sigma'), ('Simbol Sigma 2','sigma'), ('Simbol Tau, Theta, Upsilon, upsilon','Tau&comma&tau&comma&Theta&comma&theta&comma&Upsilon&comma&upsilon'), ('F(x,y,z)','f(x,y,z)'), ('Sinus','sin(pi/2+x)'), ('Cosinus','cos(x)'), ('Tangen','tg(1/pi)'), ('Contoh Cosinus','f(x)_n,cos(x)^2'), ('Absoulut ','Abs(x^2)=Abs(x)^2'), ('Contoh At','At(DiffRF(f,x),x=0)=1'), ('Cap ','Cap(x)'), ('Case ','|x|=Case(-x,x=0,0,x=0,x,x>0)'), ('Simbol Infinity (Inf)','Inf'), ('Simbol Infinity & Limit ','lim(x->0,1/x)=+-Inf'), ('Contoh Integral','Int(x*Diff(x))=sqr(x)/2'), ('Kuadrat (Pangkat 2)','sqr(x)'), ('Pangkat 3','x^3'), ('Pangkat n','pow(x+y,r/5)'), ('Square Root (Akar Pangkat 2)','sqrt(x^2-pow(y,1/n))'), ('Root (Akar Pangkat n)','root(n,x)'), ('Vector a ','vect(a)'), ('Tilde a ','t ilde(a)'), ('System (x+b = 7, x.b = 12) ','system(x+y=7,x*b=12)'), ('Summa 1 ','summa(a_i)'), ('Summa 2 (batas bawah)','summa(a_i,i<>j)'), ('Summa 3 (batas bawah & batas atas)','summa(a_i,i=0,n)'), ('Stroke (Petik) 1','strokes(f(x))'), ('Stroke (Petik) 2','strokes(f(x),2)'), ('Stroke (Petik) 3','strokes(y,3)'), ('Stand (Center)','StandC(0<=i<n,i<>j)'), ('Stand (Left)','StandL(0<=i<n,i<>j)'), ('Stand (Right)','StandR(0<=i<n,i<>j)'), ('Circle','Circ(_E*Diff(_l),L)'), ('Diff(x)','Diff(x)'), ('Diff(x,n)','Diff(x,n)'),

Page 6: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

00990100010101020103010401050106010701080109

('DiffN(x)','DiffN(x)'), ('DiffN(x,v)','DiffN(x,v)'), ('DiffR(x)','DiffR(x)'), ('DiffR(x,v)','DiffR(x,v)'), ('Contoh DiffR','DiffR(x,2)*f(x)=DiffR(x)*DiffR(x)*f(x)'), ('DiffRF(f,x)','DiffR(f,x)'), ('DiffRF(f(x),x,v)','DiffRF(f(x),x,v)'), ('Faktorial 1','Fact(n)'), ('Faktorial 2','Fact(k+1)'), ('Func(x)','Func(PDiffRF(f,x,3),x)') );

Konstanta array _Expressions ini kita deklarasian tepat di bawah keyword implementation, sehingga dapatdiakses oleh semua bagian program di bawahnya. Perhatikan, saya tiap item di dimensi kedua array tersebutke dalam dua bagian: pertama saya sebut caption, akan dimasukkan dalam ComboBox. Kedua, saya sebutf ormula, akan digunakan saat konversi bila caption pasangannya dipilih user.

Jadi kini kita tau bahwa saat Form di-create, array _Expressions di atas akan dimasukkan ke dalamComboBox1 untuk dipilih oleh user. Bila user memilih salah satu caption dari item ini, f ormula yang terkaitdengan caption tersebut akan dimasukkan ke dalam Memo1, untuk dimodif ikasi, di-copy atau sekadarnampang saja. Pokoknya user bisa melihat apa yang dipilihnya sebelum program melakukan konversi. Berikutkodenya:

0001000200030004000500060007

procedure TForm1.ComboBox1Change(Sender: TObject);var i:integer;begin i := TComboBox(Sender).ItemIndex; Memo1.Text := _Expressions[i][1];end;

Coba perhatikan lagi kode pada event FormCreate. Di situ ada pemanggilanComboBox1Change(ComboBox1) yang bermaksud menampilkan f ormula dari item pertama ke Memo1,sebagai def ault.

Setelah user memilih salah satu item dan f ormulanya sudah masuk ke Memo1, user dapat mengklik button“Konversi Ke Expresi Matematika” untuk menampilkan hasilnya. Untuk button ini, kita perlu membuatbeberapa prosedur global dulu, yaitu prosedur untuk mengambil ukuran canvas, mengubah gambar BMPmenjadi JPG, dan Mengkonversi formula Matematika menjadi gambar.

Ini kodenya:

0001000200030004000500060007000800090010001100120013001400150016

function BMPToJPEG(bitmap: TBitmap): TJPEGImage;begin Result := TJPEGImage.Create; Result .Assign(bitmap);end;procedure GetSizes(const Expression:String;var W, H:Integer);var vExprC : TExprClass; vExprB : TExprBuilder; cv: TBitmap;begin w :=0; h :=0; if trim(Expression) ='' then exit ; vExprB := TExprBuilder.Create;

Page 7: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

0017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065

cv := TBitmap.Create; try vExprC := vExprB.BuildExpr(expression); vExprC.Canvas := cv.Canvas; vExprC.Font.Size :=50; vExprC.Draw(10,10,ehLeft,evTop); w := vExprC.Width +20; h := vExprC.Height +20; finally cv.free; vExprC.Free; vExprB.Free; end;end;procedure DrawFormula(const Expression:String; Canvas: TCanvas);var vExprC : TExprClass; vExprB : TExprBuilder;begin if trim(Expression) ='' then exit ; vExprB := TExprBuilder.Create; try with Canvas.Brushdo begin Style := bsSolid; Color := clWhite; End; with Canvas.Pendo begin Style := psSolid; Color := clBlack; End; Canvas.FillRect(Canvas.ClipRect); vExprC := vExprB.BuildExpr(expression); vExprC.Canvas := Canvas; vExprC.Font.Size :=50; vExprC.Draw(10,10,ehLeft,evTop); finally vExprC.Free; vExprB.Free; end;end;

Dengan prosedur GetSizes(), kita bisa tau berapa lebar dan tinggi canvas yang akan digunakan, jadi gambarhasil konversi nanti t idak terpotong.

Sedangkan kode untuk konversi adalah:

0001000200030004000500060007

procedure TForm1.Button1Click(Sender: TObject);var w, h:Integer; Expr:String;begin Expr := Memo1.Text;

Page 8: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

0008000900100011001200130014001500160017

GetSizes(Expr, w, h); BufferBitmap.Width := w; BufferBitmap.Height:= h; DrawFormula(Expr, BufferBitmap.Canvas); DrawFormula(Expr, PaintBox1.Canvas); end;

Di situ ada dua kali pemanggilan prosedur DrawFormula(), yang satu untuk menggambar ke buf f er untukdiekspor nanti (bila user mengklik button Export) dan yang kedua untuk menampilkan ke PaintBox1.

Selanjutnya saat user mengklik button Export, program akan meminta user memilih nama f ile. Memeriksanyaapakah valid (JPG atau BMP) dan melakukan ekspor gambar ke f ile yang dipilih.

0001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034

procedure TForm1.Button3Click(Sender: TObject);var JPG: TJPEGImage; ext:String;begin SavePictureDialog1.DefaultExt :='.jpg'; if not SavePictureDialog1.Executethen exit ; ext := LowerCase( ExtractFileExt(SavePictureDialog1.FileName) ); if ext ='.bmp' then begin BufferBitmap.SaveToFile(SavePictureDialog1.FileName); MessageBox(Handle,'Gambar telah dieskpor.','Sukses', MB_ICONINFORMATION); end else if ext ='.jpg' then begin jpg := BMPToJPEG(BufferBitmap); try JPG.SaveToFile(SavePictureDialog1.FileName); MessageBox(Handle,'Gambar telah dieskpor.','Sukses', MB_ICONINFORMATION); finally jpg.Free; end; end else begin MessageBox(Handle,'Maaf. Ekstensi file t idak dikenali.','Error', MB_ICONHAND); end;end;

Sampai sini, mari kita jalankan program dan lihat hasilnya:

Page 9: Cenadep.org - Menampilkan Rumus-Rumus Matematika Di Delphi

Berhasil!

Oh iya, Anda adalah orang yang sangat malas dan lebih suka mendownload daripada membaca? Berartisama dengan saya…

Download Program Tutorial Menampilkan Rumus Matematika Di DelphiSilahkan. Bila ada masalah download di Mediaf ire, silahkan lihat trik mengatasi masalah downloadMediaf ire ini.

Download Contoh Program Tutorial Menampilkan Rumus Matematika Di Delphi – cenadep.org [ 250KB]

Sering kita terkendala saat ingin menampilkan rumus/f ormula Matematika dalam aplikasi kita. Bila Andasependapat, tentu saja Tutorial Menampilkan Rumus Matematika Di Delphi ini pantas Anda baca!

Sampai di sini, Tutorial Menampilkan Rumus Matematika Di Delphi ini sudah jadi. Silahkan dikembangkan.Anda boleh kasih komentar bila ada pertanyaan atau ada yang kurang jelas.

Salam Delphier Indonesia .