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 fungsi-fungsi 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 & differensial, 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 :
y := x * x ; {x dikali x)
Dan ketika diminta menulis “x pangkat 3″, kita bisa menulis lagi:
y := x * x * x;
Atau, “x pangkat 1000″, maka kita tulis
y := power(x, 1000) ; {dari unit Math)
Sebagaimana di contoh, “x pangkat 1000″ bisa dihitung dengan fungsi Power() dari unit Math. Namun ini adalah hal umum, kita dapat memperoleh daftar fungsi 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 file hasil download [ expr.zip ] ke sebuah folder, lalu tambahkan folder tadi Library Path Delphi. Pastikan dalam folder ini ada dua file: 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
- TExprClass dari unit ExprDraw, dan
- TExprBuilder dari unit ExprMake
TExprBuilder merupakan engine utama untuk mem-parse dan meng-generate format yang diperlukan, hasil konversi formula tekstual ke formula matematikal. Sedang TExprClass adalah drawing engine, untuk menggambar 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). Karena hampir semua kontrol (objek) dalam antarmuka aplikasi Windows memiliki Device Context, boleh saya katakan 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 tidak bosan. Silahkan berkreasi dan bandingkan dengan punya saya:

Kasus terjelek, bila Anda lupa di mana komponen TPaintBox berada, saya kasih bocoran: Di Component Palette, page/tab “System”, dekat dengan TTimer…
Setelah Anda dapat desain yang pas, mari kita lihat kodenya. Silahkan tekan F12 untuk berpindah ke source code. Hal pertama yang perlu diingat adalah, tambahkan kedua unit di atas, yaitu ExprMake dan ExprDraw ke clausa uses. Silahkan bandingkan:
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 file. Untuk ekspor ke file, kita perlu menambahkan pula sebuah TSavePictureDialog untuk memilih file untuk diekspor.
Plus, kita perlu sebuah TComboBox untuk menampung daftar rumus/formula yang sering digunakan, sebagai panduan.
Silahkan lihat perubahan berikut:

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


Saatnya Kita Coding
Setelah tampilan jadi, kita siap membuat kode untuk proses konversi, export, dsb….
Kita mulai dengan sebuah variabel global, yang merupakan field dari TForm1. Variabel ini akan digunakan sebagai buffer untuk menampung hasil konversi bertipe TBitmap:
private
{ Private declarations }
BufferBitmap: TBitMap;
public
{ Public declarations }
end;
Selanjutnya, kita meng-create buffer ini saat event FormCreate dan membuangnya saat event FormDestroy. Berikut kode saat FormCreate:
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
BufferBitmap := TBitmap.Create;
//daftar pustaka formula:
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 identifier dengan nama _Expressions. Baiklah, itu adalah sebuah konstanta array dua dimensi untuk menampung daftar formula dan simbol standar dalam Matematika. Kita akan melihat konstanta ini nanti. Kita lanjut saja dulu dengan FormDestroy:
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(BufferBitmap) then
FreeAndNil(BufferBitmap);
end;
Kini, seperti janji saya, mari kita lihat konstant _Expressions:
const
_Expressions: array [0..91] of array [0..1] of String =
(
//Maaf mas berow, saya malas menulis semuanya. Silahkan tanyakan di komentar kalau ada yang kurang...
//dasar:
('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'),
('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'),
//lanjutan
('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 ', 'tilde(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)'),
('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 dapat diakses oleh semua bagian program di bawahnya. Perhatikan, saya tiap item di dimensi kedua array tersebut ke dalam dua bagian: pertama saya sebut caption, akan dimasukkan dalam ComboBox. Kedua, saya sebut formula, 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 dalam ComboBox1 untuk dipilih oleh user. Bila user memilih salah satu caption dari item ini, formula yang terkait dengan caption tersebut akan dimasukkan ke dalam Memo1, untuk dimodifikasi, di-copy atau sekadar nampang saja. Pokoknya user bisa melihat apa yang dipilihnya sebelum program melakukan konversi. Berikut kodenya:
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 pemanggilan ComboBox1Change(ComboBox1) yang bermaksud menampilkan formula dari item pertama ke Memo1, sebagai default.
Setelah user memilih salah satu item dan formulanya sudah masuk ke Memo1, user dapat mengklik button “Konversi Ke Expresi Matematika” untuk menampilkan hasilnya. Untuk button ini, kita perlu membuat beberapa prosedur global dulu, yaitu prosedur untuk mengambil ukuran canvas, mengubah gambar BMP menjadi JPG, dan Mengkonversi formula Matematika menjadi gambar.
Ini kodenya:
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;
cv := TBitmap.Create;
try
//vExprC := vExprB.BuildExpr('(X^2+3)/vX');
vExprC := vExprB.BuildExpr(expression);
vExprC.Canvas := cv.Canvas;
vExprC.Font.Size := 50;
vExprC.Draw(10,10,ehLeft,evTop);
w := vExprC.Width + 20; //margin left, right 10px;
h := vExprC.Height + 20; //margin top, bottom 10px;
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
//vExprC := vExprB.BuildExpr('(X^2+3)/vX');
//kosongkan canvas:
with Canvas.Brush do
begin
Style := bsSolid;
Color := clWhite;
End;
with Canvas.Pen do
begin
Style := psSolid;
Color := clBlack;
End;
//Draw formula ke canvas:
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 gambar hasil konversi nanti tidak terpotong.
Sedangkan kode untuk konversi adalah:
procedure TForm1.Button1Click(Sender: TObject);
var
w, h: Integer;
Expr: String;
begin
Expr := Memo1.Text;
//Ambil width & Height
GetSizes(Expr, w, h);
//set ukuran canvas pada buffer:
BufferBitmap.Width := w;
BufferBitmap.Height:= h;
//konversi formula & gambar ke canvas buffer (buat export):
DrawFormula(Expr, BufferBitmap.Canvas);
//konversi juga ke PaintBox1 untuk ditampilkan
DrawFormula(Expr, PaintBox1.Canvas);
end;
Di situ ada dua kali pemanggilan prosedur DrawFormula(), yang satu untuk menggambar ke buffer untuk diekspor 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 file. Memeriksanya apakah valid (JPG atau BMP) dan melakukan ekspor gambar ke file yang dipilih.
procedure TForm1.Button3Click(Sender: TObject);
var
JPG: TJPEGImage;
ext: String;
begin
//Extensi default. Akan dipakai jika user tidak memilih jenis file:
SavePictureDialog1.DefaultExt := '.jpg';
if not SavePictureDialog1.Execute then
exit;
//cek apakah target export adalah JPG atau BMP:
ext := LowerCase( ExtractFileExt(SavePictureDialog1.FileName) );
if ext = '.bmp' then
begin
//save hasil konversi (bitmap) ke file:
BufferBitmap.SaveToFile(SavePictureDialog1.FileName);
MessageBox(Handle, 'Gambar telah dieskpor.', 'Sukses', MB_ICONINFORMATION);
end
else
if ext = '.jpg' then
begin
//convert ke JPG dan save ke file:
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 tidak dikenali.', 'Error', MB_ICONHAND);
end;
end;
Sampai sini, mari kita jalankan program dan lihat hasilnya:

Berhasil!
Sayangi dengan berbagi
Oh iya, Anda adalah orang yang sangat malas dan lebih suka mendownload daripada membaca? Berarti sama dengan saya…
Download Contoh Program Tutorial Menampilkan Rumus Matematika Di Delphi – cenadep.org [ 250KB ]
Sering kita terkendala saat ingin menampilkan rumus/formula Matematika dalam aplikasi kita. Bila Anda sependapat, 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
.
Incoming search terms: