En yaygın yapı Delphi uygulama bir prosedür veya fonksiyon. Rutinler, prosedürler veya işlevler olarak bilinen programdaki farklı konumlardan çağırdığınız ifade bloklarıdır.
Basitçe bir yordam, bir işlev bir değer döndürürken bir değer döndürmeyen bir yordamdır.
İşlevden döndürülen değer, döndürme türü tarafından tanımlanır. Çoğu durumda, tek bir değer döndür bir tamsayı, dize, boole veya başka bir basit tür olabilir, ayrıca dönüş türleri bir dizi, bir dize listesi, özel bir nesne örneği veya benzeri olabilir.
İşleviniz bir dize listesi ( Teller) yine de tek bir değer döndürür: dize listesinin bir örneği.
Ayrıca, Delphi rutinleri gerçekten çok sayıda yüze sahip olabilir: Rutin, Yöntem, Yöntem İşaretçisi, Olay Temsilcisi, Anonim yöntem ...
Bir İşlev Birden Fazla Değer Dönebilir mi?
Akla gelen ilk cevap hayır, çünkü bir işlevi düşündüğümüzde, tek bir dönüş değeri düşünüyoruz.
Kuşkusuz, yukarıdaki sorunun cevabı evettir. Bir işlev birkaç değer döndürebilir. Nasıl olduğunu görelim.
Var Parametreleri
Aşağıdaki işlev bir veya iki kaç değer döndürebilir?
fonksiyon PositiveReciprocal (const valueIn: tamsayı; var valueOut: real): boolean;
İşlev açıkça bir boole değeri döndürür (true veya false). "VAR" (değişken) parametresi olarak bildirilen ikinci "valueOut" parametresi nasıl olur?
Var parametreleri işleve geçirilir referans olarak yani işlev parametrenin değerini değiştirirse (kod çağırma kodundaki bir değişken), parametre için kullanılan değişkenin değerini değiştirir.
Yukarıdakilerin nasıl çalıştığını görmek için uygulama:
fonksiyon PositiveReciprocal (const valueIn: tamsayı; var valueOut: real): boolean;
başla
sonuç: = valueIn> 0;
Eğer sonuç sonra valueOut: = 1 / valueIn;
son;
"ValueIn" sabit bir parametre olarak iletilir; işlev bunu değiştiremez ve salt okunur olarak değerlendirilir.
"ValueIn" veya sıfırdan büyükse, "valueOut" parametresine "valueIn" değişken değeri atanır ve işlevin sonucu true olur. ValueIn <= 0 ise, işlev false değerini döndürür ve "valueOut" hiçbir şekilde değiştirilmez.
İşte kullanımı:
var
b: boole;
r: gerçek;
başla
r: = 5;
b: = Pozitif Geri Dönüş (1, r);
//here:
// b = doğru (1> = 0 olduğundan)
// r = 0,2 (1/5)
r: = 5;
b: = PozitifRekiprokal (-1, r);
//here:
// b = yanlış (-1'den beri
son;
Bu nedenle, PositiveReciprocal aslında 2 değer "dönebilir"! Var parametrelerini kullanarak, birden fazla değer içeren bir rutin dönüş elde edebilirsiniz.
Çıkış Parametreleri
Aşağıdaki şekilde olduğu gibi "out" anahtar kelimesini kullanarak bir referans referans parametresi belirtmenin başka bir yolu vardır:
fonksiyon PositiveReciprocalOut (const valueIn: tamsayı; dışarı valueOut: real): boolean;
başla
sonuç: = valueIn> 0;
Eğer sonuç sonra valueOut: = 1 / valueIn;
son;
PositiveReciprocalOut uygulaması, PositiveReciprocal ile aynıdır, tek bir fark vardır: "valueOut" bir OUT parametresidir.
Parametreler "out" olarak bildirildiğinde, başvuruda bulunulan "valueOut" değişkeninin başlangıç değeri atılır.
Kullanımı ve sonuçları:
var
b: boole;
r: gerçek;
başla
r: = 5;
b: = PozitifReciprocalOut (1, r);
//here:
// b = doğru (1> = 0 olduğundan)
// r = 0,2 (1/5)
r: = 5;
b: = PozitifReciprocalOut (-1, r);
//here:
// b = yanlış (-1'den beri
son;
İkinci çağrıda, yerel değişken "r" değerinin "0" olarak nasıl ayarlandığına dikkat edin. "R" değeri işlev çağrısından önce 5 olarak ayarlandı, ancak "r" olduğunda "in" parametresi "out" olarak bildirildiğinden değerin atıldığı ve parametre için varsayılan "boş" değerin ayarlandığı işleve ulaştı (real için 0 ) Kullanımı önerilir.
Sonuç olarak, "var" parametreleriyle yapmamanız gereken bir şey olan out parametreleri için başlatılmamış değişkenleri güvenle gönderebilirsiniz. Parametreler, "out" parametreleri :) hariç, rutine bir şeyler göndermek için kullanılır ve bu nedenle başlatılmamış değişkenler (VAR parametreleri için kullanılır) garip değerlere sahip olabilir.
Kayıtları Döndürüyor musunuz?
Bir fonksiyonun birden fazla değer döndüreceği yukarıdaki uygulamalar hoş değildir. İşlev aslında tek bir değer döndürür, ancak var / out parametrelerinin değerlerini değiştirmek daha iyidir.
Bu nedenle, çok nadiren referans parametreleri kullanmak isteyebilirsiniz. Bir işlevden daha fazla sonuç gerekiyorsa, bir işlev döndürme Kayıt tipi değişken.
Aşağıdakileri göz önünde bulundur:
tip
TLatitudeLongitude = kayıt
Enlem: gerçek;
Boylam: gerçek;
son;
ve varsayımsal bir işlev:
fonksiyon Neredeyim(const townName: sicim): TLatitudeLongitude;
WhereAmI işlevi Enlem ve Boylam belirli bir kasaba için (şehir, bölge, ...).
Uygulama:
fonksiyon Neredeyim(const townName: sicim): TLatitudeLongitude;
başla// "townName" i bulmak için bir servis kullanın, ardından işlev sonucunu atayın:
sonuç. Enlem: = 45.54;
sonuç. Boylam: = 18.71;
son;
Ve burada 2 gerçek değer döndüren bir fonksiyonumuz var. Tamam, 1 kayıt döndürüyor, ancak bu kayıtta 2 alan var. Bir işlev sonucunda döndürülecek çeşitli türleri karıştıran çok karmaşık bir kayda sahip olabileceğinizi unutmayın.
Bu kadar. Bu nedenle, evet, Delphi işlevleri birden çok değer döndürebilir.