Konstruk paling umum dalam a Delphi aplikasi akan menjadi prosedur atau fungsi. Dikenal sebagai rutinitas, prosedur atau fungsi adalah blok pernyataan yang Anda panggil dari lokasi yang berbeda dalam suatu program.
Sederhananya prosedur adalah rutinitas yang tidak mengembalikan nilai sementara fungsi mengembalikan nilai.
Nilai kembali dari suatu fungsi ditentukan oleh jenis pengembalian. Dalam kebanyakan kasus Anda akan menulis fungsi mengembalikan nilai tunggal yang akan berupa integer, string, boolean atau tipe sederhana lainnya, juga tipe yang dikembalikan bisa berupa array, daftar string, turunan dari objek kustom atau sejenisnya.
Perhatikan bahwa meskipun fungsi Anda mengembalikan daftar string (koleksi string) masih mengembalikan nilai tunggal: satu instance dari daftar string.
Lebih lanjut, rutinitas Delphi benar-benar dapat memiliki banyak wajah: Rutin, Metode, Pointer Metode, Delegasi Acara, metode Anonim ...
Bisakah suatu Fungsi Mengembalikan Banyak Nilai?
Jawaban pertama yang terlintas dalam pikiran adalah tidak, hanya karena ketika kita memikirkan suatu fungsi, kita memikirkan satu nilai pengembalian.
Namun, tentu saja jawaban untuk pertanyaan di atas adalah ya. Suatu fungsi dapat mengembalikan beberapa nilai. Mari kita lihat caranya.
Parameter Var
Berapa banyak nilai yang dapat dihasilkan fungsi berikut, satu atau dua?
fungsi PositiveReciprocal (const valueIn: integer; var valueOut: real): boolean;
Fungsi ini jelas mengembalikan nilai boolean (benar atau salah). Bagaimana dengan parameter kedua "valueOut" yang dinyatakan sebagai parameter "VAR" (variabel)?
Parameter var diteruskan ke fungsi dengan referensi artinya jika fungsi mengubah nilai parameter — variabel dalam blok kode panggilan — fungsi tersebut akan mengubah nilai variabel yang digunakan untuk parameter.
Untuk melihat cara kerja di atas, inilah implementasinya:
fungsi PositiveReciprocal (const valueIn: integer; var valueOut: real): boolean;
mulai
hasil: = valueIn> 0;
jika hasil kemudian valueOut: = 1 / valueIn;
akhir;
"ValueIn" dilewatkan sebagai parameter konstan — fungsi tidak dapat mengubahnya, dan diperlakukan sebagai hanya-baca.
Jika "valueIn" atau lebih besar dari nol, parameter "valueOut" diberi nilai resiprokal dari "valueIn" dan hasil dari fungsi tersebut benar. Jika valueIn adalah <= 0 maka fungsi mengembalikan false dan "valueOut" tidak diubah dengan cara apa pun.
Inilah penggunaannya:
var
b: boolean;
r: nyata;
mulai
r: = 5;
b: = PositiveReciprocal (1, r);
//here:
// b = true (sejak 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocal (-1, r);
//here:
// b = false (sejak -1
akhir;
Oleh karena itu, PositiveReciprocal sebenarnya dapat "mengembalikan" 2 nilai! Menggunakan parameter var Anda dapat memiliki pengembalian rutin lebih dari satu nilai.
Parameter Keluar
Ada cara lain untuk menentukan parameter referensi-menggunakan kata kunci "keluar", seperti pada:
fungsi PositiveReciprocalOut (const valueIn: integer; di luar valueOut: real): boolean;
mulai
hasil: = valueIn> 0;
jika hasil kemudian valueOut: = 1 / valueIn;
akhir;
Implementasi PositiveReciprocalOut sama seperti pada PositiveReciprocal, hanya ada satu perbedaan: "valueOut" adalah parameter OUT.
Dengan parameter yang dinyatakan sebagai "keluar", nilai awal dari variabel yang direferensikan "valueOut" dibuang.
Inilah penggunaan dan hasilnya:
var
b: boolean;
r: nyata;
mulai
r: = 5;
b: = PositiveReciprocalOut (1, r);
//here:
// b = true (sejak 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocalOut (-1, r);
//here:
// b = false (sejak -1
akhir;
Perhatikan bagaimana pada panggilan kedua nilai variabel lokal "r" diatur ke "0". Nilai "r" ditetapkan ke 5 sebelum panggilan fungsi tetapi karena parameter di dinyatakan sebagai "keluar," ketika "r" mencapai fungsi, nilai dibuang dan nilai "kosong" default ditetapkan untuk parameter (0 untuk nyata Tipe).
Sebagai hasilnya, Anda dapat dengan aman mengirim variabel tidak diinisialisasi untuk parameter keluar — sesuatu yang tidak boleh Anda lakukan dengan parameter "var". Parameter digunakan untuk mengirim sesuatu ke rutin, kecuali di sini dengan parameter "keluar" :), dan karena itu variabel yang tidak diinisialisasi (digunakan untuk parameter VAR) dapat memiliki nilai aneh.
Mengembalikan catatan?
Implementasi di atas di mana fungsi akan mengembalikan lebih dari satu nilai tidak baik. Fungsi sebenarnya mengembalikan nilai tunggal, tetapi juga mengembalikan, lebih baik untuk mengatakan mengubah, nilai-nilai parameter var / out.
Karena itu, Anda mungkin sangat jarang ingin menggunakan parameter referensi tambahan. Jika diperlukan lebih banyak hasil dari suatu fungsi, Anda dapat memiliki fungsi mengembalikan a jenis rekaman variabel.
Pertimbangkan yang berikut ini:
Tipe
TLatitudeLongitude = merekam
Latitude: nyata;
Bujur: nyata;
akhir;
dan fungsi hipotetis:
fungsi Dimana saya(const nama kota: tali): TLatitudeLongitude;
Fungsi WhereAmI akan mengembalikan Lintang dan Bujur untuk kota tertentu (kota, daerah, ...).
Implementasinya adalah:
fungsi Dimana saya(const nama kota: tali): TLatitudeLongitude;
mulai// gunakan beberapa layanan untuk mencari "townName", lalu tetapkan hasil fungsi:
hasil. Latitude: = 45,54;
hasil. Bujur: = 18,71;
akhir;
Dan di sini kita memiliki fungsi mengembalikan 2 nilai nyata. Oke, itu mengembalikan 1 catatan, tetapi catatan ini memiliki 2 bidang. Perhatikan bahwa Anda dapat memiliki catatan yang sangat kompleks dengan memadukan berbagai jenis untuk dikembalikan sebagai hasil dari suatu fungsi.
Itu dia. Oleh karena itu, ya, fungsi Delphi dapat mengembalikan beberapa nilai.