Pascal Delphi menggunakan bahasa Pascal, sebuah bahasa terstruktur generasi ketiga, yang sering juga disebut sebagai bahasa highly typed, bahasa dengan aturan tipe data yang ketat. hal ini akan menghasilkan program yang bersih, dengan gaya pemrograman yang konsisten, dan yang terpenting dapat diandalkan untuk berbagai aplikasi. Pascal mengalami sejarah yang panjang: Awal mula Kemunculan Pascal boleh dikatakan terlamabt dalam sejarah bahasa pemrograman. Karena muncul belakangan, Pascal dapat belajar dari pendahulunya seperti Fortran, Cobol, dan PL/1 yang muncul sekitar awal 1960-an. Niklaus Wirth menyatakan bahwa di mulai mengembangkan Pascal tahun 1968, dengan implemetasi pertama dilakukan pada mesin seri CDC 6000 di tahun 1970. Bahasa C belum muncul sampai tahun 1972. C dibuat dengan tujuan yang berbeda dengan Pascal. C dibuat sebagai bahasa tingkat tinggi yang juga memberikan kemudahan akses pada level bahasa rendah seperti yang diberikan oleh assembly. Pascal dibangun untuk menghasilkan aplikasi yang terstruktur dan mudah dikelola. Tahun 1970-an Pada tahun 1975, Wirth bekerja bersama Jensen untuk menghasilkan buku referensi Pascal "Pascal User Manual and Report". Wirth beralih dari Pascal tahun 1977 untuk mengerjakan Modula penerus Pascal. Tahun 1980-an Thun 1982 muncul ISO Pascal. Ada seven besar pada bulan November 1983, dengan keluarnya Turbo Pascal. Tahun 1987 Turbo Pascal sudah mencapai rilis 4. Turbo Pascal mengungguli lawanlawannya dalam hal kecepatan kompilasi dan eksekusi, meninggalkan pesaingnya dengan kelemahannya. Dari Turbo Pascal menuju Delphi Delphi, sebuah lingkungan pengembangan pemrograman yang cukup ampuh di lingkungan Windows© dan Linux© (dengan nama Kylix) muncul pertama kali pada tahun 1995. Delphi, merupakan kelanjutan dari Turbo Pascal©. Borland sepertinya mengadu untung saat memunculkan Pascal versi Object Oriented. Namun ternyata keberanian itu memperoleh imbalan karena memang IDE tetap disukai dan waktu kompilasi maupun eksekusi tetap cepat. Versi pertama Delphi terasa sangat terbatas kemampuannya dibandingkan dengan Delphi yang ada saat ini, namun saat itu Delphi meraih sukses karena faktor kecepatan. Pada era 1990-an Delphi terus berubah dengan cepat. Delphi version 8 Dari versi pertama Delphi sekarang sudah sampai versi 8, yang mengikuti jalur arsitektur Microsoft© Net. Namun demikian Delphi tetap merupakan, menurut hemat penulis, development tool yang terbaik untuk Windows maupun Linux. Pascal adalah bahasa yang jernih, dan lebih disiplin daripada Basic, dan dalam hal adaptasi pemragraman objek juga lebih baik daripada Basic. Perhatikan program berikut: program pertama(input,output); begin writeln(1+1); end. Dari program tersebut didapat katakunci (keyword) : program, begin, dan end. pengenal (identifier) : pertama, input, output, dan writeln tipe data (konstanta) : 1 operator : + ekspresi : 1 + 1 Baris pertama dari program tersebut oleh kebanyakan sistem (compiler) Pascal diabaikan atau tidak diproses. Untuk Turbo Pascal for Windows perlu ditambah baris uses WinCrt; setelah baris program. Jika digunakan Delphi baris yang perlu ditambahkan adalah {$APPTYPE CONSOLE} Ekspresi (1+1) oleh sistem Pascal akan langsung dievaluasi dan menghasilkan nilai 2. Dengan demikian statemen tersebut akan sama dengan statemen writeln(2). Pascal termasuk bahasa pemrograman yang menganut pada format bebas. Artinya program tidak perlu dibagi dalam baris dan kolom. Dengan kata lain suatu program Pascal dapat ditulis dalam 1 baris saja atau dalam banyak baris, yang oleh compiler Pascal akan dianggap sama saja. Namun program tersebut akan berbeda rasaanya jika dibaca oleh manusia yang lebih memilih tata letak yang baik. Program Pascal tersusun atas deretan karakter ASCII (termasuk karakter EOL - end of line). Pada penulisan di buku keyword sering ditulis dalam bentuk huruf tebal, namun dalam penyimpanannya hanya disimpan dalam bentuk melulu karakter. Pascal tidak mengenal pembedaan huruf kecil dan huruf kapital, kecuali dalam konstanta string. Anda dapat menambah komentar dalam program, yang merupakan keterangan tambahan bagi orang yang membaca program tersebut tetapi tidak berarti apa-apa bagi compiler Pascal. Dalam Pascal ada beberapa cara penulisan komentar: 1. Tanda "{" dan "}" digunakan untuk mengapit keterangan. Artinya teks diantara kedua tanda itu akan diabaikan oleh compiler. 2. Tanda "(*" dan "*)" juga digunakan untuk mengapit keterangan. Tanda ini dapat digunakan jika dalam keterangan mengandung tanda "{" atau "}". 3. Tanda "//" digunakan untuk mengawali keterangan dalam 1 baris. Setelah ganti baris komentar berakhir. Jadi komentar hanya berlaku pada teks di belakang tanda "//" ini. Program yang baik biasanya akan diawali dengan komentar yang berisi antara lain: informasi pembuat program nama program kegunaan program dan tanggal dilakukannya perubahan terakhir. Prosedur writeln dapat digunakan untuk menampilkan nilai dari tipedata: integer : 1, -2, 34566 real : 3.14, 1.0E+07 char : 'a', 'z','%','#' string : 'selamat pagi','mahasiswa','Jum''at' boolean : true, false Prosedur writeln tidak dapat digunakan untuk menampilkan nilai dari tipe data yang dibuat oleh pemrogram seperti : enumerasi, array, dan record. Namun demikian untuk tipe data buatan yang merupakan subtipe dari tipe data standar di atas, writeln masih dapat digunakan. write berfungsi seperti writeln namun tidak diikuti dengan ganti baris. Dengan demikian write(1); write(2); akan menghasilkan 12. writeln dan write dapat menampung lebih dari satu nilai yang akan ditampikan secara berurutan. Contoh: writeln('Hasilnya adalah : ',1+1) dapat ditulis dalam bentuk write('Hasilnya adalah : '); writeln(1+1); Perhatikan bahwa writeln(1+1) berbeda dengan writeln('1+1'). Yang pertama akan menghasilkan 2 sedang yang kedua akan menghasilkan "1+1". Tidak dilakukan evaluasi pada string (teks yang diapit tanda petik tunggal), kecuali '' yang berarti petik tunggal. Anda dapat menentukan panjang karakter yang akan ditampilkan. Misalnya write(1:3) akan menghasilkan angka 1 dengan 3 karakter yaitu : " 1". Jika data yang akan ditampilkan tidak dapat dimuat dalam panjang yang ditentukan, Pascal akan menampilkannya menurut panjang yang dibutuhkan oleh nilai tersebut. Jika nilai 3.14 ingin ditampikan "3.14" bukan "3.13000E+00" Anda harus menentukan panjang angka desimalnya. Format penulisannya menjadi writeln(3.14:4:2). Nilai 2 menunjukkan panjang angka desimalnya. Variabel adalah lokasi memory yang digunakan untuk menyimpan nilai. Pada lokasi memori ini dapat dilakukan: penyimpanan data pembacaan data/pengambilan data Pada saat menyimpan data, jika lokasi tersebut sudah pernah diisi data maka data lama akan tertindis oleh data yang baru. Pembacaan data tidak mengubah nilai data yang tersimpan di variabel. Variabel dalam Pascal selalu mempunyai tipe data. Dengan demikian: tipe data suatu variabel harus dideklarasikan terlebih dahulu var n : integer; nilai data yang dapat disimpan hanya yang cocok tipenya dengan tipe data variabel. untuk deklarasi di atas nilai 'A' tidak dapat disimpan di n setiap variabel harus mempunyai nama yang berbeda. Latihan Apa yang dihasilkan oleh program berikut? program lat1; var n,m : integer; begin n := 1; m := n+1; m := m+1; n := m * m; writeln(n); end. Untuk melacak jalannya program perlu dikenal titik-titik pemantauan program. Titik-titik tersebut adalah : statemen yang akan dikerjakan nilai setiap variabel pada saat itu teks yang dihasilkan Dari contoh program di atas, pelacakan dilakukan mulai pada baris keempat, yang memuat statemen pertama (setelah begin). Pada titik itu semua variabel belum terisi, dan tidak ada yang ditampilkan oleh program. Ekspresi berisi penghitungan nilai. Ekspresi tersusun atas : data literal (konstanta), seperti 1 atau 'a' variabel, seperti n operator, seperti +,-,*,/,mod,div fungsi, seperti sqrt, sin, cos kurung, ( dan ) Jika tidak ada tanda kurung secara eksplisit, pengelompokan operan dan operator tergantung pada tingkat prioritas operator. Misalnya * lebih tinggi prioritasnya daripada +. Operator yang mempunyai prioritas sama akan dikerjakan mulai dari kiri ke kanan. Struktur ekspresi dapat divisualisasi dengan menggunakan pohon operator, yang menunjukkan aliran nilai yang masuk ke operator. Ekspresi a + b * 3 dapat digambarkan sbb: + / \ a * / \ b 3 Latihan Gambar pohon ekspresi untuk Pascal mengharuskan pemanggilan fungsi menggunakan tanda kurung. Misal sin(x) atau ln(a+b) Jika Anda tidak yakin mengenai urutan prioritasnya, gunakan saja tanda kurung. Cara lain, Anda dapat menggunakan variabel temporer. Misalnya daripada menulis Anda dapat menggantinya dengan Latihan Tulis program untuk menghitung untuk dan . Hasil akhir ditampilkan dengan format 1 tempat di belakang koma. Banyak fungsi dan operator yang dapat dikenakan pada tipe data bawaan (boolean, integer, real, dan char). Setiap operator atau fungsi berlaku untuk tipe data tertentu dan menghasilkan nilai dengan tipe data tertentu juga. Misal div: integer x integer integer Artinya argumen untuk div dua-duanya harus integer dan hasil dari div bertipe integer juga. Dengan demikian "jumlah div 0.25" menjadi error karena tipe data tidak cocok dengan pola operator div. Bilangan 0.25 bukan integer melainkan real. Contoh lain : /: integer x integer real Berarti / selalu menghasilkan nilai bertipe real. Jika Anda mencoba mengisi variabel bertipe integer dengan bilangan real, Anda akan mendapat error. Dalam statemen pengisian nilai (:=) tipe variabel dan tipe nilainya harus kompatibel, yang berartti kedua tipe sama persis atau hampir sama. Sehingga a := b / 25 akan error jika a dideklarasikan sebagai variabel bertipe integer. Beberapa operator bersifat overloaded yaitu satu operator, mempunyai pola 2 atau lebih. Misalnya: + : integer x integer integer + : real x real real Jika diperlukan Pascal secara otomatis akan mengubah tipe integer menjadi real. Namun demikian tidak berlaku sebaliknya. Anda harus menggunakan fungsi trunc arau round. Apa tipe data hasil dari ekspresi berikut? 1*1+2.4 ln(7 mod 3) Program Baca; var n : integer; begin write('Ketik nilai untuk n : '); readln(n); writeln(n * (n + 1) div 2); end. Readln digunakan intuk mengisi nilai variabel dari keyboard. Dengan demikian readln(n) mirip dengan n := .... Dalam pernyataan pengisian nilai, nilai berasal dari dalam program. Nilai tersebut dapat berupa konstanta (eksplisit tertulis) atau hasil dari perhitungan. Dalam pertanyaan read, nilai berasal dari pengguna. Read dan Readln hanya dapat digunakan untuk membaca data yang bertipe standar char, integer, string, atau real. Kecuali jika data tersebut berasal dari file, maka read dapat digunakan juga membaca bentuk tipe data lain. Perbedaan antara read dan readln adalah : readln akan mengabaikan data yang masih ada dibelakangnya sampai ditemukan tanda ganti baris. Readln(x, y) identik dengan read(x); readln(y); Urutan pembacaan: Data dibaca secara urut satu-persatu : artinya tidak ada data yang terlewati dan tidak boleh dibaca dua kali Data masukan dapat dianggap sebagai deretan karakter yang harus dibaca pada karakter pertama. Artinya untuk membaca karakter kedua, maka dilakukan pembacaan terhadap karakter pertama dan dengan demikian karakter pertama akan hilang dari deretan dan karakter kedua bergeser menjadi karakter pertama. Penahan masukan: Walaupun program Anda hanya membutuhkan masukan 1 karakter, sistem operasi masih mengijinkan pengguna untuk mengisi lengkap 1 baris hingga ditekan tombol "Enter" Karakter yang sudah telanjur masuk, tetapi tidak dibutuhkan oleh program akan ditahan oleh sistem operasi. Jika masih ada karakter dalam tahanan sistem operasi, dan program berikutnya membutuhkan masukan, maka karakter yang ditahan tadi akan dilepas untuk memenuhi permintaan data, tanpa perlu pemasukan data dari pengguna. Akhir baris: Tanda akhir baris dalam sistem MS-DOS/Windows menggunakan dua karakter yaitu : CR (Carriage Return) (ASCII 13) dan LF (Line Feed) (ASCII 10). Dalam sistem Unix hanya menggunakan satu karakter yaitu LF. Fungsi eoln digunakan untuk mendeteksi apakah karakter berikutnya adalah CR. Jika ya eoln bernilai true. Fungsi ini tidak mengubah posisi masukan. Fungsi readln membaca sampai dengan tanda LF pada akhir baris. Pemanggilan readln dengan atau tanpa argumen akan memindah posisi masukan ke baris berikutnya. Pemasukan bilangan: Sistem operasi selalu memberikan deretan karakter kepada program Jika Anda memanggil read dengan argumen n (integer), maka read akan melakukan pembacaan karakter (angka) dari sistem operasi, menghitung nilai integer dari masukan tersebut dan menyimpannya sebagai integer di n. read akan mengabaikan spasi di awal dan akhir bilangan atau tanda ganti baris. Namun demikian, jika di dalam deretan angka terdapat karakter lain (misalnya huruf), akan mengakibatkan error. Dalam sistem Turbo Pascal, dalam setiap masukan bilangan harus diikuti oleh spasi atau tanda ganti baris. Latihan 1. Tulis program untuk menghitung untuk nilai dan dan nilai yang dibaca dari masukan pengguna. 2. Tulis program untuk membaca 3 angka (sebagai karakter), menghitungnya sebagai 1 bilangan, menambah dengan 1 , dan mencetak hasilnya. Anda bisa menggunakan ekspresi ord(angka) - ord('0') untuk mengubah karakter menjadi bilangan. program musik; var tahun : integer; begin write('Kapan Mozart lahir?'); readln(tahun); if tahun=1756 then writeln('Benar. Selamat!') else writeln('Maaf. Anda belum benar.'); end. Pernyataan tunggal dapat segera diikuti then dan else. Jika lebih dari satu pernyataan, maka pernyataan-pernyataan itu harus diapit dengan begin dan end: if tahun=1756 then begin writeln('Benar. Selamat!'); jawabanbenar := jawabanbenar+1; end Secara teknis, konstruksi begin ... end dianggap satu pernyataan, walaupun berisi banyak statemen. Tanda ";" sebelum else akan menimbulkan error. Agar tampilan nampak terstruktur dan enak dilihat gunakan indentasi. Walaupun cara ini tidak berpengaruh pada compiler karena compiler tidak mengenal perbedaan ada 2 spasi atau 1 spasi atau ganti baris sekalipun. Versi terakhir di atas bisa juga ditulis dalam bentuk: if tahun = 1756 then begin writeln('Benar. Selamat!'); jawabanbenar := jawabanbenar + 1; end Sebaiknya Anda konsisten menggunakan salah satu model indentasi. Latihan Anggap compiler Pascal yang kita gunakan tidak mengenal penentuan panjang tampilan. Buatlah program untuk menampilkan bilangan dengan 3 tempat. Demikian demikian perlu ditambahi: dua spasi untuk bilangan dalam rentang 0 s.d. 9 satu spasi untuk bilangan dalam rentang 10 s.d. 99 Untuk bilangan lainnya tidak perlu ditambahi spasi. Pernyataan if dapat berkalang, artinya pada pernyataan bagian then atau pernyataan bagian else dapat berisi pernyataan if lain. Bentuk if ... then ...else if ...then biasa digunakan. Penggunaan AND untuk pemeriksaan seluruh kasus Misalnya kita mempunyai sederetan pertanyaan (seperti dalam ujian) dan kita ingin tahu apakah seluruh pertanyaan terjawab dengan benar atau tidak. Untuk menyelesaikan permasalahan ini dapat ditempuh beberapa cara: Pertama, kita dapat menggunakan AND if (jawab1=1756) and (jawab2=1685) and .... then writeln('Semua jawaban benar!'); Kedua, kita dapat menghitung jumlah jawaban yang benar seperti contoh sebelumnya, nilai jawabanbenar bertambah satu demi satu setipa ada jawaban yang benar. Seteleah semua soal dikerjakan, kita tinggal membandingkan nilai jawabanbenar dengan jumlah soal. Jika keduanya sama, maka berarti semua jawaban benar. Ketiga, kita dapat menggunakan variabel "benarsemua", yang pertama diisi dengan nilai True. Jika didapatkan jawaban yang salah, maka nilai variabel ini berubah menjadi False. Jika sampai akhir, nilai variabel ini tetap True, berarti semua jawaban benar. Latihan Gunakan variabel boolean untuk mengecek apakah tiga deretan karakter yang dimasukkan bernilai 'yyn'. Case Statemen case digunakan jika diinginkan ada beberapa alternatif pernyataan yang akan dikerjakan, tetapi hanya satu yang benar-benar dikerjakan. Pemilihan pernyataan yang dikerjakan ditentukan oleh nilai ekspresi yang cocok dengan nilai label yang mendahului pernyataan alternatif. Sintaksis untuk pernyataan case adalah : CASE {ekspresi} OF case label1 : pernyataan-1; case label2 : pernyataan-2; case label3 : pernyataan-3; ... case labeln : pernyataan-n; else pernyataan-else; END; Cara kerja pernyataan case adalah sebagai berikut: 1. Ekspresi dievaluasi, nilainya dicocokkan dengan label. 2. Nilai ekspresi tersebut dibandingkan dengan nilai pada label. Jika ada yang cocok maka pernyataan yang menyertainya dikerjakan. 3. Jika tidak ada label yang cocok dengan nilai tersebut dan ada pernyataan-else, maka pernyataan-else dikerjakan. Struktur Iterasi Pada saat diinginkan mengulang-ulang instruksi dalam program yang dibuat, saat itulah diperlukan iterasi. Struktur iterasi secara sederhana menentukan berapa kali suatu instruksi atau kelompok instruksi diulang. Pada suatu kasus jumlah iterasi sudah dapat ditentukan sebelumnya namun pada kasus yang lain jumlah iterasi tidak dapat ditentukan sebelumnya. Untuk kasus kedua, proses akan berhenti berulang atau keluar dari iterasi setelah tidak memenuhi syarat untuk dilakukannya iterasi. Syarat tersebut dapat dipenuhi kapan saja. Algoritme iterasi: 1. Inisialisasi pencacah 2. Jika pencacah < maksimum kerjakan a. instruksi yang diulang 3. naikkan nilai pencacah jika tidak kerjakan langkah 4 4. Kembali ke langkah 2 5. Selesai Ada beberapa macam struktur iterasi yaitu: 1. for 2. while 3. repeat Dalam for jumlah iterasi sudah dapat ditentukan terlebih dahulu sedang pada while dan repeat untuk melakukan atau menghentikan iterasi perlu dilakukan pengecekan kondisi. Pada iterasi while, pengecekan kondisi dilakukan sebelum mengerjakan instruksi yang diulang. Selama kondisi memenuhi syarat (bernilai True), maka instruksi yang diulang dikerjakan. Dengan demikian jika pada saat pertama kali kondisi sudah tidak memenuhi syarat, maka instruksi yang diulang tidak pernah dikerjakan. Pada iterasi repeat, instruksi yang diulang dikerjakan terlebih dahulu baru kemudian dicek kondisinya. Jika kondisi bernilai True maka iterasi dihentikan. Dengan demikian instruksi yang diulang pasti pernah dikerjakan paling tidak sekali. Mungkin struktur iterasi for adalah struktur yang paling mudah dipahami. Dalam for dilakukan pencacahan berapa instruksi yang mengikutinya diulang-ulang. Untuk keperluan ini dideklarasikan terlebih dahulu variabel bertipe ordinal (misal integer) sebagai variabel pencacat jumlah perulangan. Contoh deklarasi: var cacah : integer; Variabel cacah dinamakan variabel kendali iterasi. Variabel ini digunakan sebagai pencacat sudah berapa kali suatu instruksi dijalankan. Struktur iterasi for kemudian ditulis sbb: for cacah := 1 to 10 do Memo1.Lines[Kount].Add(‘Selamat pagi’); Iterasi tersebut dapat diartikan "Untuk nilai cacah dari 1 sampai dengan 10 tambahkan 'Selamat pagi' pada baris terakhir pada Memo1. Pada contoh tersebut, hanya ada satu instruksi yang ada dalam iterasi. Memo1.Lines[Kount].Add(‘Selamat pagi’); Jika ada lebih dari satu instruksi yang ingin diulang maka diperlukan pengelompokan instruksi tersebut dengan menggunakan begin dan end Untuk for ada dua 'variasi', yang pertama untuk pencacah naik dan yang kedua untuk pencacah turun. Prinsip dasar keduanya sama saja, yaitu digunakan untuk mengulang instruksi sejumlah nilai yang sudah ditentukan. var cacah : integer; ... for cacah := awal to akhir do begin KerjakanSesuatu; KerjakanYangLain; end; Variabel cacah harus dideklarasikan secara lokal dan bertipe ordinal. Awal dan Akhir adalah variabel yang bertipe sama atau kompatibel dengan tipe data cacah. Untuk pencacah turun, to pada iterasi for diganti dengan downto. Jika diinginkan berhenti dari iterasi walaupun nilai akhir belum tercapai, gunakan break. Struktur Repeat Instruksi di antara repeat dan until akan dikerjakan terus menerus sampai kondisi bernilai True. Jika kondisi tidak pernah mencapai True, instruksi akan terus menerus dikerjakan selamanya tanpa henti. repeat KerjakanSesuatu; KerjakanYangLain; until kondisi; Instruksi di antara repeat dan until akan dikerjakan sekali, kemudian nilai kondisi dicek. Jika bernilai True, iterasi dihentikan. Namun jika bernilai False, instruksi yang diulang akan dikerjakan lagi. Penggunaan break juga diperbolehkan dalam repeat. repeat if (Nilai < 1) then break; Nilai := Nilai * Nilai; until (Nilai > 1000000); Pada kasus ini, iterasi repeat mengulang instruksi untuk mengalikan Nilai dengan Nilai sampai bernilai lebih dari 1000000. Namun demikian, jika Nilai pada awalnya berisi kurang dari 1, maka iterasi langsung dihentikan. Hal ini dilakukan untuk mencegah perulangan yang tanpa henti. Seperti diketahui bahwa suatu bilangan jika dikalikan dengan bilangan itu sendiri nilainya akan bertambah besar, kecuali bilangan itu kurang dari 1. Misalnya 2 x 2 adalah 4, namun 0.5 x 0.5 adalah 0.25 yang lebih kecil dari 0.5. Oleh karena iterasi akan berhnati jika Nilai > 1000000, dan ini tidak akan tercapai jika Nilai < 1, maka iterasi akan dikerjakan terus-menerus tanpa henti. Dengan adanya break perulangan yang terus menerus untuk kasus tersebut tidak perlu terjadi. Iterasi While Instruksi dalam While akan dikerjakan selama kondisi bernilai True. Jika kondisi ini tidak pernah mencapai False, instruksi akan diulang terus-menerus tanpa henti. while kondisi do begin KerjakanSesuatu; KerjakanYangLain; end; Kondisi harus ekspresi boolean. Pertama, nilai kondisi ini dicek. Jika bernilai True, instruksi antara begin dan end dikerjakan. Jika bernilai False, instruksi tidak dikerjakan. Begin dan end boleh dihilangkan jika hanya ada 1 instruksi yang diulang. Menggambar grafik Pengantar Microsoft Windows dan Borland Delphi menawarkan kemudahan untuk menggambar grafik. Objek yang digunakan untuk menggambar secara khusus dinamakan canvas. Pada kenyataannya semua objek yang memerlukan penggambaran mempunyai property Canvas yang merupakan instance dari TCanvas. Menggambar garis Penggambaran garis biasanya terdiri atas 2 langkah. Pertama menentukan titik awal garis yang menggunakan method TCanvas.MoveTo(). Method ini memerlukan 2 argumen yaitu x dan y, yang menunjukkan koordinat awal garis. Untuk menggambar garis perlu juga diketahui koordinat titik akhir garis. Koordinat ini diumpankan sebagai argumen untuk method TCanvas.LineTo(). Contoh penggunaan kedua method itu dapat dilihat pada program untuk event OnPaint dari Form berikut: procedure TForm1.FormPaint(Sender: TObject); begin Canvas.MoveTo(20, 15); Canvas.LineTo(150, 245); end; Jika Anda menghendaki bahwa yang menentukan titik awal dan akhir adalah pengguna, Anda dapat mengisi program pada event mouse. Sebaiknya Anda menggunakan variabel yang digunakan untuk mencatat titik awal dari garis tersebut. Misalnya: var Form1: TForm1; StartX, StartY: Integer; implementation Pengguna biasanya akan menggambar garis dengan menekan tombol mouse dan menggesernya. Untuk keperluan ini, perlu diisi program pada event OnMouseDown. Walaupun akan lebih baik jika penggambaran dilakukan pada TPaintBox atau TBitmap, namun untuk contoh di bawah ini menggunakan form sebagai tempat untuk menggambar. Implementasi dari kasus tersebut adalah: procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Reserve the starting point of the line // using our own StartX and StartY StartX := X; StartY := Y; end; Pengguna menghentikan penggambaran garis dengan melepas mouse, yang sesuai dengan event OnMouseUp. Untuk mengimplementasikannya, Anda tinggal menggunakan titik awal yang sudah dicatat tadi sebagai awla garis dan titik tempat mouse dilepas sebagai titik akhir garis. Bentuk implementasi bisa seperti berikut ini: procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Start the line on the previous point we reserved Canvas.MoveTo(StartX, StartY); // End the line on the current point Canvas.LineTo(X, Y); end; Pewarnaan Penggambaran garis tadi, menggunakan warna yang tersimpan dalam objek Pen yang merupakan instance dari TPen. Pen ini merupakan anggota dari klas TCanvas. Warna bawaan dari Pen adalah hitam (clBlack), sehingga garis yang digambar tadi berwarna hitam. Anda dapat mengubah warna Pen dengan mengubah nilai Pen.Color seperti contoh berikut: procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Set the red color to the pen of the convas Canvas.Pen.Color := clRed; // Start the line on the previous point we reserved Canvas.MoveTo(StartX, StartY); // End the line on the current point Canvas.LineTo(X, Y); end; Jika pengguna diperbolehkan menggambar garis semaunya, maka perlu dibuat fasilitas untuk memilih warna. Delphi sudah menyediakan fasilitas pemilihan warna dengan komponen ColorGrid yang dengan mudah dapat dipasang dan digunakan. ColorGrid menyediakan 2 pilihan warna: latar depan (ForeGroundColor) dan latar belakang (BackgroudColor). Tidak usah terlalu memikirkan penamaan tersebut, Anda dapat menggunakannya untuk keperluan pemilihan warna. Contohnya, Anda dapat menggunakan property ForegroundColor untuk mengisi nilai Pen.Color. Contoh: procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Set the color of the pen to the color // selected on the Color Grid control Canvas.Pen.Color := ColorGrid1.ForegroundColor;; // Start the line on the previous point we reserved Canvas.MoveTo(StartX, StartY); // End the line on the current point Canvas.LineTo(X, Y); end;