Adobe® Flash® için Adobe® ActionScript® 3.0 Programlama

advertisement
ADOBE ACTIONSCRIPT 3.0'ı
Programlama
®
®
© 2008 Adobe Systems Incorporated. Tüm hakları saklıdır.
Telif Hakkı
Adobe® Flash® için Adobe® ActionScript® 3.0 Programlama
Bu kılavuz son kullanıcı sözleşmesini içeren bir yazılımla birlikte verilmişse bu kılavuz ve onda anlatılan yazılım lisanslıdır ve yalnızca bu lisansa uygun şekilde
kullanılabilir veya kopyalanabilir. Bu türde bir lisans tarafından izin verildiği durumlar dışında, bu kılavuzun hiçbir bölümü Adobe Systems Incorporated
şirketinden önceden yazılı izin alınmadan çoğaltılamaz, geri alma sistemlerinde depolanamaz veya elektronik, mekanik, kayıt yoluyla veya diğer herhangi bir
şekilde veya herhangi bir yöntemle aktarılamaz. Lütfen bu kılavuzun içeriğinin, kılavuz son kullanıcı lisans sözleşmesine sahip bir yazılımla birlikte verilmemiş
olsa dahi, telif hakkı yasalarıyla korunduğunu unutmayın.
Bu kılavuzun içeriği yalnızca bilgi amaçlıdır, önceden haber verilmeden değiştirilebilir ve Adobe Systems Incorporated şirketinin bir taahhüdü olarak
yorumlanmamalıdır. Adobe Systems Incorporated bu kılavuzdaki bilgilerin hatalı veya yanlış olması durumunda hiçbir sorumluluk veya yükümlülük kabul
etmez.
Projenize dahil etmek isteyebileceğiniz mevcut resimlerin ve görüntülerin telif hakkı yasalarıyla korunuyor olabileceğini unutmayın. Bu türde malzemenin yeni
çalışmanıza yetkisiz olarak katılması, telif hakkı sahibinin haklarını ihlal etmek anlamına gelebilir. Lütfen telif hakkı sahibinden gerekli tüm izinleri aldığınızdan
emin olun.
Örnek şablonlarda şirket adlarına yapılan tüm referanslar yalnızca tanıtım amaçlıdır ve hiçbir gerçek kuruluşla ilgili değildir.
Adobe, the Adobe logo, Adobe AIR, ActionScript, Flash, Flash Lite, Flex, Flex Builder, MXML, and Pixel Bender are either registered trademarks or trademarks
of Adobe Systems Incorporated in the United States and/or other countries.
ActiveX and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and other countries. Macintosh is a
trademark of Apple Inc., registered in the United States and other countries. Java is a trademark or registered trademark of Sun Microsystems, Inc. in the United
States and other countries. All other trademarks are the property of their respective owners.
This product includes software developed by the Apache Software Foundation (http://www.apache.org/).
MPEG Layer-3 audio compression technology licensed by Fraunhofer IIS and Thomson Multimedia (http://www.mp3licensing.com)
Speech compression and decompression technology licensed from Nellymoser, Inc. (www.nellymoser.com).
Video compression and decompression is powered by On2 TrueMotion video technology. © 1992-2005 On2 Technologies, Inc. All Rights Reserved.
http://www.on2.com.
This product includes software developed by the OpenSymphony Group (http://www.opensymphony.com/).
This product contains either BSAFE and/or TIPEM software by RSA Security, Inc.
Sorenson Spark™ video compression and decompression technology licensed from Sorenson Media, Inc.
Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USA
Notice to U.S. government end users. The software and documentation are “Commercial Items,” as that term is defined at 48 C.F.R. §2.101, consisting of
“Commercial Computer Software” and “Commercial Computer Software Documentation,” as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202,
as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §§227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software and
Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial items and (b) with only those rights
as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States.
Adobe Systems Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, USA. For U.S. Government End Users, Adobe agrees to comply with all applicable
equal opportunity laws including, if appropriate, the provisions of Executive Order 11246, as amended, Section 402 of the Vietnam Era Veterans Readjustment
Assistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and the regulations at 41 CFR Parts 60-1 through 60-60,
60-250 ,and 60-741. The affirmative action clause and regulations contained in the preceding sentence shall be incorporated by reference.
iii
İçindekiler
Bölüm 1: Bu kılavuz hakkında
Bu kılavuzu kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
ActionScript belgelerine erişim
....................................................................................... 2
ActionScript öğrenme kaynakları
....................................................................................... 3
Bölüm 2: ActionScript 3.0'a giriş
ActionScript hakkında . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
ActionScript 3.0'ın avantajları
.......................................................................................... 4
ActionScript 3.0'daki yenilikler
......................................................................................... 5
Önceki sürümlerle uyumluluk
.......................................................................................... 7
Bölüm 3: ActionScript ile çalışmaya başlama
Programlama temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Nesnelerle çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Ortak program öğeleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Örnek: Animasyon portföy parçası
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
ActionScript ile uygulamalar oluşturma
Kendi sınıflarınızı oluşturma
Örnek: Temel bir uygulama oluşturma
Sonraki örnekleri çalıştırma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Bölüm 4: ActionScript dili ve sözdizimi
Dile genel bakış . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Nesneler ve sınıflar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Paketler ve ad alanları
Değişkenler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Veri türleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Sözdizimi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Operatörler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Koşullar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Döngü
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
İşlevler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Bölüm 5: ActionScript'te nesne tabanlı programlama
Nesne tabanlı programlama temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Sınıflar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Arabirimler
Miras
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Gelişmiş başlıklar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Örnek: GeometricShapes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Bölüm 6: Tarih ve saatlerle çalışma
Tarih ve saat temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Takvim tarih ve saatlerini yönetme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA iv
İçindekiler
Zaman aralıklarını denetleme
Örnek: Basit analog saat
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Bölüm 7: Dizelerle çalışma
Dizelerin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Dizeler oluşturma
length özelliği
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Dizelerdeki karakterlerle çalışma
Dizeleri karşılaştırma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Diğer nesnelerin dize halinde temsilini alma
Dizeleri bitiştirme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Dizelerdeki alt dizeleri ve desenleri bulma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Dizeleri büyük harfe veya küçük harfe dönüştürme
Örnek: ASCII art
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Bölüm 8: Dizilerle çalışma
Dizilerin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Dizinlenmiş diziler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
İlişkilendirilebilir diziler
Çok boyutlu diziler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Dizileri klonlama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Gelişmiş başlıklar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Örnek: PlayList
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Bölüm 9: Hataları işleme
Hata işlemenin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Hata türleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
ActionScript 3.0'da hata işleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Flash Player ve AIR uygulamalarının hata ayıklayıcı sürümleriyle çalışma
Bir uygulamada eşzamanlı hataları işleme
Özel hata sınıfları oluşturma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Hata olaylarını ve durumunu yanıtlama
Error sınıflarını karşılaştırma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Örnek: CustomErrors uygulaması
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Bölüm 10: Normal ifadeler kullanma
Normal ifadelerin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Normal ifade sözdizimi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Dizelerle normal ifadeleri kullanma yöntemleri
Örnek: Wiki ayrıştırıcı
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Bölüm 11: XML ile çalışma
XML temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
XML işlemeye yönelik E4X yaklaşımı
XML nesneleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
XMLList nesneleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
XML değişkenlerini başlatma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
XML nesnelerini birleştirme ve dönüştürme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA v
İçindekiler
XML yapılarında geçiş yapma
XML ad alanlarını kullanma
XML tür dönüştürmesi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Harici XML belgelerini okuma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Örnek: Internet'ten RSS yükleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Bölüm 12: Olayları işleme
Olay işleme temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
ActionScript 3.0 olay işleme, önceki sürümlerden nasıl farklılık gösterir
Olay akışı
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Olay nesneleri
Olay dinleyicileri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Örnek: Alarm Clock
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Bölüm 13: Görüntü programlama
Görüntü programlama temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Çekirdek görüntüleme sınıfları
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Görüntüleme listesi yaklaşımının avantajları
Görüntüleme nesneleriyle çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Görüntüleme nesnelerini işleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Nesnelere animasyon uygulama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Görüntüleme içeriğini dinamik olarak yükleme
Örnek: SpriteArranger
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Bölüm 14: Çizim API'sini kullanma
Çizim API'sini kullanma temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Graphics sınıfını anlama
Çizgi ve eğriler çizme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Yerleşik yöntemleri kullanarak şekiller çizme
Degrade çizgiler ve dolgular oluşturma
Çizim yöntemleriyle Math sınıfını kullanma
Çizim API'si ile animasyon uygulama
Yol Çizme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Örnek: Algoritmik Görsel Efekt Oluşturucu
Çizim API'sinin ileri düzey kullanımı
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Sargı kurallarını tanımlama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Grafik verisi sınıflarını kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
drawTriangles() öğesini kullanma hakkında
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Bölüm 15: Geometriyle çalışma
Geometri temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Point nesnelerini kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Rectangle nesnelerini kullanma
Matrix nesnelerini kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Örnek: Görüntüleme nesnesine matris dönüştürmesi uygulama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA vi
İçindekiler
Bölüm 16: Görüntüleme nesnelerine filtre uygulama
Görüntüleme nesnelerine filtre uygulama temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Filtreler oluşturma ve uygulama
Kullanılabilir görüntü filtreleri
Örnek: Filter Workbench
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Bölüm 17: Pixel Bender gölgelendiricileriyle çalışma
Pixel Bender gölgelendiricilerinin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Gölgelendirici yükleme veya gömme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Gölgelendirici meta verilerine erişme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Gölgelendirici girdisi ve parametre değerlerini belirtme
Gölgelendirici kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Bölüm 18: Film klipleriyle çalışma
Film kliplerinin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
MovieClip nesneleriyle çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Film klibi oynatımını denetleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
ActionScript ile MovieClip nesneleri oluşturma
Harici bir SWF dosyasını yükleme
Örnek: RuntimeAssetsExplorer
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Bölüm 19: Ara hareketlerle çalışma
Ara Hareket Temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Ara hareket komut dosyalarını kopyalama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Ara hareket komut dosyalarını birleştirme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Animasyonu açıklama
Filtreler ekleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Ara hareketi görüntüleme nesneleriyle ilişkilendirme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Bölüm 20: Ters kinematikle çalışma
Ters Kinematik temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
IK Armatürlerine Animasyon Uygulamaya Genel Bakış
IK armatürü hakkında bilgi alma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
IK Taşıyıcısını Başlatma ve IK Taşıyıcısının Hareketini Sınırlama
Bir IK Armatürünü hareket ettirme
IK Olaylarını Kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Bölüm 21: Metinle çalışma
Metinle çalışmanın temelleri
TextField sınıfını kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Flash Text Engine'i kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Bölüm 22: Bitmaplerle çalışma
Bitmaplerle çalışmanın temelleri
Bitmap ve BitmapData sınıfları
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Piksellerde değişiklik yapma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Bitmap verilerini kopyalama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Gürültü işlevleri ile doku oluşturma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA vii
İçindekiler
Bitmapleri kaydırma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Mipmap oluşturma avantajından yararlanma
Örnek: Animasyonlu dönen ay
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Bölüm 23: Üç boyutlu (3B) çalışma
3B temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Flash Player ve AIR çalışma zamanının 3B özelliklerini anlama
3B nesneler oluşturma ve taşıma
3B nesneleri 2B görünümde yansıtma
Örnek: Perspektif projeksiyonu
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Karmaşık 3B dönüştürmeler gerçekleştirme
3B efektler için üçgenleri kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Bölüm 24: Videoyla çalışma
Video temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Video formatlarını anlama
Video sınıfını anlama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Video dosyalarını yükleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Video oynatımını denetleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Tam ekran modunda video oynatma
Video dosyalarını akışa alma
İşaret noktalarını anlama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Meta veri ve işaret noktaları için geri çağrı yöntemleri yazma
İşaret noktalarını ve meta verileri kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Kamera girdisini yakalama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Sunucuya video gönderme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
FLV dosyaları için gelişmiş başlıklar
Örnek: Video Jukebox
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Bölüm 25: Sesle çalışma
Sesle çalışmanın temelleri
Ses mimarisini anlama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
Harici ses dosyalarını yükleme
Gömülü seslerle çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Akış ses dosyalarıyla çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Dinamik olarak oluşturulmuş sesle çalışma
Sesleri çalma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Sesler yüklenirken ve çalınırken dikkate alınması gereken güvenlikle ilgili noktalar
Ses düzeyini denetleme ve yatay kaydırma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Ses meta verisiyle çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Ham ses verilerine erişme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
Ses girdisini yakalama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
Örnek: Podcast Player
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Bölüm 26: Kullanıcı girdisini yakalama
Kullanıcı girdisinin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Klavye girdisini yakalama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA viii
İçindekiler
Fare girişi yakalama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
Örnek: WordSearch
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
Bölüm 27: Ağ iletişimi ve iletişim
Ağ iletişimi ve iletişimin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Harici verilerle çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
Diğer Flash Player ve AIR örneklerine bağlanma
Soket bağlantıları
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Yerel verileri saklama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
Veri dosyalarıyla çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Örnek: Bir Telnet istemcisi oluşturma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Örnek: Dosya yükleme ve indirme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Bölüm 28: İstemci sistemi ortamı
İstemci sistemi ortamının temelleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
System sınıfını kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Capabilities sınıfını kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
ApplicationDomain sınıfını kullanma
IME sınıfını kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Örnek: Sistem yeteneklerini algılama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
Bölüm 29: Kopyalayıp yapıştırma
Kopyalayıp yapıştırma temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
Sistem panosundan okuma ve sistem panosuna yazma
Pano veri formatları
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Bölüm 30: Yazdırma
Yazdırma temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Sayfa yazdırma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Flash Player ve AIR görevleri ve sistem yazdırması
Boyutu, ölçeği ve yönlendirmeyi ayarlama
Örnek: Çoklu sayfa yazdırma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
Örnek: Ölçekleme, kırpma ve yanıtlama
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
Bölüm 31: Harici API'yi kullanma
Harici API'yi kullanma temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Harici API gereksinimleri ve avantajları
ExternalInterface sınıfını kullanma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Örnek: Harici API'yi bir web sayfası konteyneriyle kullanma
Örnek: Harici API'yi bir ActiveX konteyneriyle kullanma
Bölüm 32: Flash Player güvenliği
Flash Player güvenliğine genel bakış
Güvenlik sanal alanları
İzin denetimleri
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Ağ iletişim API'lerini kısıtlama
Tam ekran modu güvenliği
İçerik yükleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA ix
İçindekiler
Çapraz komut dosyası oluşturma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
Veri olarak yüklenen ortama erişme
Veri yükleme
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Güvenlik etki alanına içe aktarılan SWF dosyalarından gömülü içerik yükleme
Eski içerikle çalışma
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
LocalConnection izinlerini ayarlama
Giden URL erişimini denetleme
Paylaşılan nesneler
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717
Kamera, mikrofon, pano, fare ve klavye erişimi
Dizin
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
1
Bölüm 1: Bu kılavuz hakkında
Bu kılavuz Adobe® ActionScript® 3.0'da uygulama geliştirmek için gerekli olan temel bilgileri sunar. Açıklanan fikir ve
teknikleri en iyi şekilde anlayabilmek için veri türleri, değişkenler, döngüler ve işlevler gibi genel programlama
kavramlarını bilmeniz gerekmektedir. Ayrıca sınıflar ve miras alma gibi nesne tabanlı temel programlama
kavramlarını da anlıyor olmanız gerekir. ActionScript 1.0 veya ActionScript 2.0 bilgisi işinize yarayacak olsa da şart
değildir.
Bu kılavuzu kullanma
Bu kılavuzun bölümleri ActionScript belgelerinin ilgili kısımlarını daha kolay bulmanız için aşağıdaki mantıksal
gruplara ayrılmıştır:
Bölümler
Açıklama
Bölüm 2-5, ActionScript programlamaya genel bakış
Dil sözdizimi, deyimler, operatörler ve nesne tabanlı ActionScript programlama gibi
temel ActionScript 3.0 kavramlarını ele alır.
Bölüm 6-11, temel ActionScript 3.0 veri türleri ve
sınıfları
ActionScript 3.0'daki üst düzey veri türlerini açıklar.
Bölüm 12-32, Flash Player ve Adobe AIR API'leri
Olay işleme, görüntüleme nesneleri ve görüntüleme listesiyle çalışma, ağ ve
iletişimler, dosya girdisi ve çıktısı, harici arabirim, uygulama güvenlik modeli ve
bunlar gibi Adobe Flash Player ve Adobe AIR uygulamasına özgü paket ve sınıflarda
uygulanan önemli özellikleri açıklar.
Bu kılavuz ayrıca önemli veya sık kullanılan sınıflar için uygulama programlama kavramlarını gösteren sayısız örnek
dosya içerir. Örnek dosyalar Adobe® Flash® CS4 Professional ile daha kolay yüklenecek ve kullanılabilecek şekilde
paketlenmiştir ve saran dosyalar içerebilir. Ancak, örnek kodun temeli istediğiniz geliştirme ortamında
kullanabileceğiniz ActionScript 3.0 biçimindedir.
ActionScript 3.0 şunlar da dahil olmak üzere birden fazla şekilde yazılabilir ve derlenebilir:
• Adobe Flex Builder 3 geliştirme ortamını kullanma
• Flex Builder 3 ile birlikte verilen gibi herhangi bir metin düzenleyici ve komut satırı derleyici kullanma
• Adobe® Flash® CS4 Professional geliştirme aracını kullanma
ActionScript geliştirme ortamları ile ilgili daha fazla bilgi için “ActionScript 3.0'a giriş” sayfa 4 bölümüne bakın.
Bu kılavuzdaki kod örneklerini anlamak için Flex Builder veya Flash geliştirme aracı gibi ActionScript için dahili
geliştirme ortamları tecrübeniz olması gerekli değildir. Ancak bu araçlarla ActionScript 3.0 kodu yazmayı ve derlemeyi
öğrenmek için ilgili araçların belgelerine başvurmak isteyeceksiniz. Daha fazla bilgi için bkz. “ActionScript belgelerine
erişim” sayfa 2.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 2
Bu kılavuz hakkında
ActionScript belgelerine erişim
Bu kılavuz ağırlıklı olarak zengin ve güçlü bir nesne tabanlı programlama dili olan ActionScript 3.0'ı anlattığı için
belirli bir araç veya sunucu mimarisi içerisindeki uygulama geliştirme sürecine veya iş akışına geniş yer vermez. Bu
nedenle, ActionScript 3.0'ı Programlama'nın yanı sıra, ActionScript 3.0 uygulamalarının tasarlama, geliştirme, test
etme ve konuşlandırma sürecinde diğer belgelere de başvurmak isteyeceksiniz.
ActionScript 3.0 belgeleri
Bu kılavuz size ActionScript 3.0 programlama dilinin altındaki kavramları tanıtır ve dilin önemli özelliklerini gösteren
uygulama detayları ve örnekleri sunar. Ancak, bu kılavuz tam bir dil başvurusu değildir. Bu nedenle, dil içindeki her
sınıfı, yöntemi, özelliği ve olayı anlatan ActionScript 3.0 Dil ve Bileşen Başvurusu bölümünü inceleyin. ActionScript
3.0 Dil ve Bileşenler Başvurusu, temel dil, Flash geliştirme aracı bileşenleri (fl paketlerindeki) ve Flash Player ve Adobe
AIR API'leri (flash paketlerindeki) ile ilgili ayrıntılı başvuru bilgisi sunar.
Flash belgeleri
Flash geliştirme aracını kullanıyorsanız, şu kılavuzlara başvurmak isteyebilirsiniz:
Kitap
Açıklama
Flash'ı kullanma
Flash geliştirme aracında dinamik web uygulamalarınızı nasıl geliştireceğinizi
açıklar
ActionScript 3.0'ı Programlama
ActionScript 3.0 dili ve temel Flash Player ve Adobe AIR API'sinin belirli kullanımını
açıklar
ActionScript 3.0 Dil ve Bileşenler Başvurusu
Flash geliştirme aracı bileşenleri ve ActionScript 3.0 API'si için sözdizimi, kullanım
ve kod örnekleri sunar
ActionScript 3.0 Bileşenlerini Kullanma
Flash tarafından oluşturulan uygulamaları geliştirmek için bileşenlerin
kullanımıyla ilgili ayrıntıları açıklar
Flash CS4 Professional ile Adobe AIR Uygulamaları
Geliştirme
Flash içinde ActionScript 3.0 ve Adobe AIR API'si kullanılarak Adobe AIR
uygulamalarının nasıl geliştirileceğini ve konuşlandırılacağını anlatır
Adobe Flash içinde ActionScript 2.0 Öğrenme
ActionScript 2.0 sözdizimine genel bir bakış sunar ve farklı nesne türleri ile
çalışırken ActionScript 2.0'ın nasıl kullanılacağını açıklar
ActionScript 2.0 Dil Başvurusu
Flash geliştirme aracı bileşenleri ve ActionScript 2.0 API'si için sözdizimi, kullanım
ve kod örnekleri sunar
ActionScript 2.0 Bileşenlerini Kullanma
Flash tarafından oluşturulan uygulamaları geliştirmek için ActionScript 2.0
bileşenlerinin nasıl kullanılacağını ayrıntılı şekilde açıklar
ActionScript 2.0 Bileşenleri Dil Başvurusu
Sürüm 2 Adobe Bileşen Mimarisi ve ilgili API içerisinde bulunan bileşenleri anlatır
Flash'ı Genişletme
Javascript API'si içerisindeki nesneleri, yöntemleri ve özellikleri anlatır
Flash Lite 2.x ile Çalışmaya Başlama
Uygulama geliştirmek için Adobe® Flash® Lite™ 2.x uygulamasının nasıl
kullanılacağını açıklar ve Flash Lite 2.x ile kullanılabilen ActionScript özellikleri için
sözdizimi, kullanım ve kod örnekleri sunar
Flash Lite 2.x Uygulamaları Geliştirme
Flash Lite 2.x uygulamalarının nasıl geliştirileceğini açıklar
Flash Lite 2.x ActionScript'e Giriş
Flash Lite 2.x ile nasıl uygulama geliştirileceğini gösterir ve Flash Lite 2.x
geliştiricilerinin kullanabildiği tüm ActionScript özelliklerini anlatır
Flash Lite 2.x ActionScript Dil Başvurusu)
Flash Lite 2.x içinde bulunan ActionScript 2.0 API'si için sözdizimi, kullanım ve kod
örneği sunar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 3
Bu kılavuz hakkında
Kitap
Açıklama
Flash Lite 1.x ile Çalışmaya Başlama
Flash Lite 1.x uygulamasına giriş sunar ve Adobe® Device Central CS4 emülatörü
kullanarak içeriğinizi nasıl test edeceğinizi açıklar
Flash Lite 1.x Uygulamaları Geliştirme
Flash Lite 1.x kullanılarak mobil cihazlar için nasıl uygulama geliştirileceğini
anlatır.
Flash Lite 1.x ActionScript Öğrenmek
Flash Lite 1.x içerisinde nasıl ActionScript kullanılacağını ve Flash Lite 1.x içerisinde
bulunan ActionScript özelliklerini anlatır
Flash Lite 1.x ActionScript Dil Başvurusu
Flash Lite 1.x içerisinde bulunan ActionScript öğelerinin sözdizimini ve kullanımını
sunar
ActionScript öğrenme kaynakları
Bu kılavuzlara ek olarak Adobe, Adobe Geliştirici Merkezi ve Adobe Tasarım Merkezi'nde düzenli olarak güncellenen
makaleler, tasarım fikirleri ve örnekler sunar.
Adobe Geliştirici Merkezi
Adobe Geliştirici Merkezi'nde ActionScript ile ilgili en son bilgiler, gerçek dünya uygulama geliştirme üzerine
makaleler ve önemli yeni konular ile ilgili bilgiler yer almaktadır. Geliştirici Merkezi'ne www.adobe.com/devnet/
adreslerinden ulaşabilirsiniz.
Adobe Tasarım Merkezi
Dijital tasarım ve hareketli grafik ile ilgili en son bilgileri alın. Önemli sanatçıların adıyla göz atın, yeni tasarım
eğilimlerini keşfedin ve dersler, önemli iş akışları ve gelişmiş tekniklerle becerilerinizi geliştirin. Yeni dersler ve
makaleler ile ilham verici galeri öğeleri için iki haftada bir kontrol edin. Tasarım Merkezi'ne
www.adobe.com/designcenter/ adresinden ulaşabilirsiniz.
4
Bölüm 2: ActionScript 3.0'a giriş
Bu bölümde, en yeni ve en yenilikçi ActionScript sürümü olan Adobe® ActionScript® 3.0'a genel bakış sağlanmaktadır.
ActionScript hakkında
ActionScript, Adobe® Flash® Player ve Adobe® AIR™ çalışma zamanı ortamları için programlama dilidir. Flash, Flex ve
AIR içerik ve uygulamalarında etkileşim, veri işleme ve daha fazlasına olanak sağlar.
ActionScript, Flash Player ve AIR uygulamasının bir parçası olan ActionScript Virtual Machine (AVM) tarafından
çalıştırılır. ActionScript kodu, Adobe® Flash® CS4 Professional veya Adobe® Flex™ Builder™ uygulamasında yerleşik
olanlar ya da Adobe® Flex™ SDK uygulamasında kullanılabilir olanlar gibi, genellikle bir derleyici tarafından bayt kodu
formatında (bilgisayarlar tarafından yazılan ve anlaşılan bir çeşit programlama dili) derlenir. Bayt kodu, Flash Player
ve AIR uygulamaları tarafından çalıştırılan SWF dosyalarında gömülüdür.
ActionScript 3.0, nesne tabanlı programlama konusunda temel bilgisi olan geliştiricilere bilindik gelecek güçlü bir
programlama modeli sunar. ActionScript 3.0'ın önceki ActionScript sürümlerinden daha gelişmiş olan bazı önemli
özellikleri arasında şunlar yer alır:
• AVM2 adı verilen ve yeni bir bayt kodu talimat kümesi kullanıp önemli ölçüde performans artışı sağlayan yeni bir
ActionScript Virtual Machine.
• Önceki derleyici sürümlerinden daha derin eniyileştirmeler gerçekleştiren daha modern bir derleyici kodu
• Düşük düzeyde nesne denetimi ve gerçek bir nesne odaklı model içeren, genişletilmiş ve geliştirilmiş bir uygulama
programlama arabirimi (API)
• XML için ECMAScript (E4X) belirtimini (ECMA-357 sürüm 2) esas alan XML API'si. E4X, dilin yerel veri türü
olarak ECMAScript'e XML ekleyen bir dil uzantısıdır.
• Belge Nesnesi Modeli (DOM) Düzey 3 Olaylar Belirtimi'ni esas alan bir olay modeli
ActionScript 3.0'ın avantajları
ActionScript 3.0, önceki ActionScript sürümlerinin komut dosyası oluşturma yeteneklerinden çok daha fazlasını
sunar. Büyük veri kümeleri ve nesne tabanlı, yeniden kullanılabilir kod tabanları ile oldukça karmaşık uygulamaların
oluşturulmasını kolaylaştırmak üzere tasarlanmıştır. ActionScript 3.0, Adobe Flash Player uygulamasında çalışan
içerik için gerekmese de, yalnızca yeni sanal makine olan AVM2 ile kullanılabilen performans artışına bir kapı açar.
ActionScript 3.0 kodu, eski ActionScript kodundan on kata kadar daha hızlı çalışabilir.
Eski ActionScript Virtual Machine sürümü olan AVM1, ActionScript 1.0 ve ActionScript 2.0 kodunu çalıştırır.
Varolan ve eski içerikle geriye doğru uyumluluk sağlamak için Flash Player 9 ve 10 tarafından AVM1 desteklenir. Daha
fazla bilgi için, bkz. “Önceki sürümlerle uyumluluk” sayfa 7.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 5
ActionScript 3.0'a giriş
ActionScript 3.0'daki yenilikler
ActionScript 3.0, ActionScript programcılara tanıdık gelen birçok sınıf ve özellik içerse de, ActionScript 3.0 mimari ve
kavramsal açıdan önceki ActionScript sürümlerinden farklıdır. ActionScript 3.0'daki geliştirmeler arasında, çekirdek
dilin yeni özellikleri ve düşük düzeyli nesneler üzerinde daha yüksek denetim sağlayan gelişmiş Flash Player API'si yer
alır.
Not: Adobe® AIR™ uygulamaları, Flash Player API'lerini de kullanabilir.
Çekirdek dil özellikleri
Çekirdek dil, programlama dilinin deyimler, ifadeler, koşullar, döngüler ve türler gibi temel bina bloklarını tanımlar.
ActionScript 3.0, geliştirme işlemini hızlandıran birçok yeni özellik içerir.
Çalışma zamanı istisnaları
ActionScript 3.0, önceki ActionScript sürümlerinden daha çok hata koşulu bildirir. Yaygın hata koşulları için çalışma
zamanı istisnaları kullanılarak hata ayıklama deneyimini geliştirir ve hataları daha güçlü şekilde işleyen uygulamalar
geliştirmenizi sağlar. Çalışma zamanı hataları, kaynak dosya ve satır numarası bilgilerini ek açıklama olarak veren
yığın izleri sağlayarak hızlı şekilde hataların yerini belirlemenize yardımcı olur.
Çalışma zamanı türleri
ActionScript 2.0'da tür ek açıklamaları birincil olarak geliştiriciye yardım sağlama amaçlıydı; çalışma zamanında tüm
değerler dinamik olarak türlenmiştir. ActionScript 3.0'da, tür açıklamaları çalışma zamanında korunur ve birçok amaç
için kullanılır. Flash Player ve Adobe AIR, çalışma zamanı, çalışma zamanı tür denetlemesi uygulayarak sistemin tür
güvenliğini artırır. Tür bilgileri aynı zamanda yerel makine temsillerinde değişkenleri temsil etmek için de kullanılarak
performansı artırır ve bellek kullanımını azaltır.
Mühürlenmiş sınıflar
ActionScript 3.0, mühürlenmiş sınıf kavramını getirmiştir. Mühürlenmiş bir sınıf, derleme zamanında tanımlanmış
yalnızca sabit özellikler ve yöntemler kümesine sahiptir; bu sınıfa ek özellikler ve yöntemler eklenemez. Bu da daha
katı derleme zamanı denetlemesi sağlayarak daha güçlü programlar oluşmasına neden olur. Buna ek olarak, nesne
örneklerinin her biri için dahili bir karma tablo gerektirmeyerek bellek kullanımını da azaltır. dynamic anahtar
sözcüğünün kullanılmasıyla dinamik sınıflar da mümkündür. ActionScript 3.0'daki tüm sınıflar varsayılan olarak
mühürlenmiştir ancak dynamic anahtar sözcüğüyle bu sınıfların dinamik olduğu bildirilebilir.
Yöntem kapanışı
ActionScript 3.0, yöntem kapanışının otomatik olarak orijinal nesne örneğini hatırlamasına olanak sağlar. Bu özellik,
olay işlemesi için kullanışlıdır. ActionScript 2.0'da, yöntem kapanışları hangi nesne örneğinden ayıklandıklarını
hatırlamaz ve bu da yöntem kapanışı çağrıldığında beklenmeyen davranış oluşmasına neden olur. mx.utils.Delegate
sınıfı sık kullanılan bir geçici çözümdür ancak artık buna ihtiyaç kalmamıştır.
XML için ECMAScript (E4X)
ActionScript 3.0, en son ECMA-357 olarak standartlaştırılmış olan XML için ECMAScript (E4X) uygular. E4X,
XML'in işlenmesi için doğal ve akıcı bir dil yapıları kümesi sunar. Geleneksel XML ayrıştırma API'lerinin tersine, E4X
ile XML, dilin yerel bir veri türüymüş gibi hareket eder. E4X, ihtiyaç duyulan kod miktarını büyük ölçüde azaltarak
XML'i işleyen uygulamaların geliştirilmesini kolaylaştırır. E4X'in ActionScript 3.0 uygulaması hakkında daha fazla
bilgi almak için, bkz. “XML ile çalışma” sayfa 222.
ECMA’nın E4X belirtimini görüntülemek için www.ecma-international.org adresine gidin.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 6
ActionScript 3.0'a giriş
Normal ifadeler
ActionScript 3.0, hızlı şekilde dizeleri arayabilmeniz ve işleyebilmeniz amacıyla normal ifadeler için yerel destek içerir.
ECMAScript (ECMA-262) sürüm 3 dil belirtiminde belirtildiği şekilde ActionScript 3.0, normal ifadeler için destek
uygular.
Ad alanları
Ad alanları, bildirimlerin görünürlüğünü (public, private, protected) kontrol etmek için kullanılan geleneksel
erişim belirticilerine benzer. Bunlar, seçtiğiniz adlara sahip olabilen özel erişim belirticileri olarak çalışır. Çakışmaları
önlemek için, ad alanlarında bir Universal Resource Identifier (URI) bulunur ve E4X ile çalıştığınızda XML ad
alanlarını temsil etmek için de ad alanları kullanılır.
Yeni ilkel türler
ActionScript 2.0, Number adında, çift kesinlikli ve kayan nokta sayısı olan tek bir sayısal türe sahiptir. ActionScript
3.0, int ve uint türlerini içerir. int türü, ActionScript'in CPU için hızlı tam sayı matematik yeteneklerinden
faydalanmasına olanak sağlayan 32-bit işaretli bir tam sayıdır. int türü, döngü sayaçları ve tam sayıların kullanıldığı
değişkenler için kullanışlıdır. uint türü, RGB renk değerleri, bayt sayıları ve daha fazlası için kullanışlı olan işaretsiz,
32-bit tam sayı türüdür.
Flash Player API'sinin özellikleri
ActionScript 3.0'daki Flash Player API'leri, düşük bir düzeydeki nesneleri kontrol etmenize olanak sağlayan birçok
sınıf içerir. Dil mimarisi, önceki sürümlere göre daha sezgisel olacak şekilde tasarlanmıştır. Burada ayrıntılı şekilde ele
alınacak çok fazla sayıda yeni sınıf olsa da, ilerleyen bölümlerde bazı önemli değişikliklere yer verilmiştir.
Not: Adobe® AIR™ uygulamaları, Flash Player API'lerini de kullanabilir.
DOM3 olay modeli
Belge Nesnesi Modeli Düzey 3 olay modeli (DOM3), uygulama içindeki nesnelerin etkileşim ve iletişim kurarak
durumlarını koruyabilmesi ve değişikliğe yanıt vermesi için olay mesajları oluşturma ve işlemeye yönelik standart bir
yöntem sağlar. World Wide Web Consortium DOM Düzey 3 Olaylar Belirtimi'nden sonra düzenlenen bu model,
önceki ActionScript sürümlerinde kullanılabilir olan olay sistemlerinden daha net ve daha etkili bir mekanizma sağlar.
Olaylar ve hata olayları, flash.events paketinde bulunur. Flash bileşenleri çerçevesi, Flash Player API'siyle aynı olay
modelini kullanır, bu nedenle olay sistemi tüm Flash platformunda birleştirilmiştir.
Görüntüleme listesi API'si
Flash Player ve Adobe AIR görüntüleme listesine (uygulamadaki görsel öğeleri içeren ağaç) erişme API'si, görsel ilkel
öğelerle çalışmaya yönelik sınıfları içerir.
Yeni Sprite sınıfı, hafif bir bina bloğu olup MovieClip sınıfına benzer ancak UI bileşenleri için temel sınıf olarak daha
uygundur. Yeni Shape sınıfı ham vektör şekillerini temsil eder. Bu sınıflar new operatörüyle doğal olarak başlatılabilir
ve herhangi bir zamanda dinamik olarak yeniden üst öğeye sahip olabilir.
Derinlik yönetimi şimdi otomatiktir ve Flash Player ve Adobe AIR uygulamalarında yerleşik olarak bulunur, böylece
derinlik sayılarının atamasının oluşturulması gereksizdir. Nesnelerin z sırasının belirtilmesi ve yönetilmesi için yeni
yöntemler sağlanır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 7
ActionScript 3.0'a giriş
Dinamik verileri ve içerikleri işleme
ActionScript 3.0, uygulamanızda varlıkların ve verilerin yüklenmesi için tüm API'de sezgisel ve tutarlı olan
mekanizmalar içerir. Yeni Loader sınıfı, SWF dosyalarının ve görüntü varlıklarının yüklenmesi için tek bir mekanizma
ve yüklenen içerikle ilgili ayrıntılı bilgilere erişme yolu sağlar. URLLoader sınıfı, veri tabanlı uygulamalarda metin ve
ikili verilerin yüklenmesi için ayrı bir mekanizma sağlar. Socket sınıfı, sunucu soketlerine herhangi bir formatta ikili
verileri okuyup yazmak için bir araç sağlar.
Düşük düzeyli veri erişimi
Çeşitli API'ler, önceden ActionScript'te asla kullanılabilir olmayan verilere düşük düzeyli erişim sağlar. URLLoader
tarafından uygulanan URLStream sınıfı, indirilen veriler için, indirme sırasında verilere ham ikili veriler olarak
erişilmesini sağlar. ByteArray sınıfı, ikili verilerle okumayı, yazmayı ve çalışmayı eniyileştirmenize olanak sağlar. Yeni
Sound API'si, SoundChannel ve SoundMixer sınıfları üzerinden ayrıntılı ses denetimi sağlar. Güvenlikle ilgilenen yeni
API'ler, SWF dosyasının veya yüklenen içeriğin güvenlik ayrıcalıkları hakkında bilgi sağlayarak güvenlik hatalarını
daha iyi işlemenize olanak tanır.
Metinle çalışma
ActionScript 3.0, tüm metinle ilgili API'ler için bir flash.text paketi içerir. TextLineMetrics sınıfı, bir metin alanındaki
metin satırı için ayrıntılı ölçütler sağlar; ActionScript 2.0'daki TextFormat.getTextExtent() öğesinin yerini alır.
TextField sınıfı, bir metin satırı veya bir metin satırındaki tek bir karakter hakkında belirli bilgiler sağlayabilen ilginç
özellikte birçok yeni düşük düzeyli yöntemler içerir. Bu yöntemler arasında, bir karakterin sınırlama kutusunu temsil
eden dikdörtgeni döndüren getCharBoundaries(), belirtilen bir noktadaki karakterin dizinini döndüren
getCharIndexAtPoint() ve bir paragraftaki birinci karakterin dizinini döndüren getFirstCharInParagraph()
yer alır. Satır düzeyindeki yöntemler arasında, belirtilen bir metin satırındaki karakterlerin sayısını döndüren
getLineLength() ve belirtilen satırın metnini döndüren getLineText() yer alır. Yeni bir Font sınıfı, SWF
dosyalarındaki gömülü fontların yönetilmesi için araçlar sağlar.
Önceki sürümlerle uyumluluk
Flash Player her zamanki gibi, önceden yayınlanmış içerikle geriye doğru tam uyumluluk sağlar. Önceki Flash Player
sürümlerinde çalışan tüm içerikler Flash Player 9 ve sonrasında da çalışır. Ancak Flash Player 9'da ActionScript 3.0'ın
bulunması, eski içerik ile Flash Player 9'da çalışan yeni içerik arasında birlikte çalışılabilirlik konusunda zorluklara yol
açabilir. Uyumluluk sorunları arasında şunlar yer alır:
• Tek bir SWF dosyası, ActionScript 1.0 veya 2.0 kodunu ActionScript 3.0 koduyla birleştiremez.
• ActionScript 3.0 kodu, ActionScript 1.0 veya 2.0'da yazılmış bir SWF dosyasını yükleyebilir ancak SWF dosyasının
değişkenlerine ve işlevlerine erişemez.
• ActionScript 1.0 veya 2.0'da yazılmış SWF dosyaları, ActionScript 3.0'da yazılmış SWF dosyalarını yükleyemez. Bu
da, Flash 8 veya Flex Builder 1.5 ya da önceki sürümlerde yazılmış SWF dosyalarının ActionScript 3.0 SWF
dosyalarını yükleyemediği anlamına gelir.
Bu kuralın tek istisnası, ActionScript 2.0 SWF dosyası, düzeylerinden birine önceden herhangi bir şey yüklemediği
sürece, ActionScript 2.0 SWF dosyasının bir ActionScript 3.0 SWF dosyasıyla kendisini değiştirebilmesidir.
ActionScript 2.0 SWF dosyası, loadMovieNum() öğesine bir çağrı yapıp level parametresine 0 değerini ileterek
bunu yapabilir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 8
ActionScript 3.0'a giriş
• Genelde, ActionScript 3.0'da yazılmış SWF dosyalarıyla birlikte çalışacaksa, ActionScript 1.0 veya 2.0'da yazılmış
SWF dosyalarının alınması gerekir. Örneğin, ActionScript 2.0'ı kullanarak bir ortam oynatıcısı oluşturduğunuzu
varsayın. Ortam oynatıcısı, ayrıca ActionScript 2.0'da oluşturulmuş çeşitli içerikleri de yükler. ActionScript 3.0'da
yeni içerik oluşturup bu içeriği ortam oynatıcısına yükleyemezsiniz. Video oynatıcısını ActionScript 3.0'a almanız
gerekir.
Ancak ActionScript 3.0'da bir ortam oynatıcısı oluşturursanız, bu ortam oynatıcısı ActionScript 2.0 içeriğinizin
basit yüklemelerini gerçekleştirebilir.
Aşağıdaki tablolarda, önceki Flash Player sürümlerinin yeni içerik yüklenmesi ve kod çalıştırılmasıyla ilgili
sınırlamaları ve farklı ActionScript sürümlerinde yazılmış SWF dosyaları arasında çapraz komut dosyası oluşturma
sınırlamaları özetlenmektedir.
Desteklenen işlevler
Flash Player 7
Flash Player 8
Flash Player 9 ve 10
Şunlar için yayınlanmış SWF dosyalarını
yükleyebilir
7 ve öncesi
8 ve öncesi
9 (veya 10) ve öncesi
Bu AVM'yi içerir
AVM1
AVM1
AVM1 ve AVM2
Şu ActionScript sürümlerinde yazılmış
SWF'leri çalıştırır
1.0 ve 2.0
1.0 ve 2.0
1.0 ve 2.0 ve 3.0
Aşağıdaki tabloda yer alan “Desteklenen işlevler”, Flash Player 9 veya sonrasında çalıştırılan içerikleri ifade eder. Flash
Player 8 veya öncesinde çalışan içerikler yalnızca ActionScript 1.0 ve 2.0'da yüklenebilir, görüntülenebilir,
çalıştırılabilir ve bu içeriklerin çapraz komut dosyası oluşturulabilir.
Desteklenen işlevler
ActionScript 1.0 ve 2.0'da oluşturulan
içerik
ActionScript 3.0'da oluşturulan içerik
Şu sürümlerde oluşturulan içerik yüklenebilir
ve içerikteki kod çalıştırılabilir
yalnızca ActionScript 1.0 ve 2.0
ActionScript 1.0, 2.0 ve ActionScript 3.0
Şu sürümlerde oluşturulan içeriğin çapraz
komut dosyası oluşturulabilir
yalnızca ActionScript 1.0 ve 2.0 (Yerel Bağlantı Yerel Bağlantı üzerinden ActionScript 1.0 ve
üzerinden ActionScript 3.0)
2.0
ActionScript 3.0
9
Bölüm 3: ActionScript ile çalışmaya
başlama
Bu bölüm, ActionScript programlamaya başlamanız için tasarlanmış olup bu kılavuzun geri kalanında karşılaşacağınız
kavramları ve örnekleri anlamak için ihtiyaç duyacağınız arka planı size sağlar. ActionScript'te uygulanma şekli
kapsamında açıklanan temel programlama kavramlarıyla başlayacağız. Ayrıca ActionScript uygulamasının organize
edilmesi ve oluşturulması temellerini de ele alacağız.
Programlama temelleri
ActionScript bir programlama dili olduğundan, ilk önce birkaç genel bilgisayar programlama kavramını anlarsanız,
ActionScript'i öğrenmeniz kolaylaşacaktır.
Bilgisayar programları ne yapar
Öncelikle, bilgisayar programının ne olduğuna ve ne yaptığına dair kavramsal bir fikir edinilmesi yardımcı olacaktır.
Bilgisayar programının iki yönü vardır:
• Program, bilgisayarın gerçekleştirmesi için tasarlanmış talimatlar veya adımlar serisidir.
• Her adım bazı bilgi veya verilerin işlenmesini içerir.
Genel anlamda bilgisayar programı, bilgisayara verdiğiniz ve bilgisayar tarafından birer birer gerçekleştirilen adım
adım talimatlar listesidir. Talimatların her birine deyim denir. Bu kılavuzda da göreceğiniz gibi, ActionScript'te her
deyim, sonunda bir noktalı virgül olacak şekilde yazılır.
Temelde, bir programdaki talimatın yaptığı tüm şey, bilgisayarın belleğinde saklanan bazı veri bitlerini işlemekten
ibarettir. Basit bir örnek vermek gerekirse, bilgisayara iki sayı eklemesini ve sonucu belleğinde saklamasını talimat
olarak verebilirsiniz. Daha karmaşık bir örnek vermek gerekirse, ekranda çizili bir dikdörtgen olduğunu ve bu
dikdörtgeni başka bir yere taşımak için bir program yazmak istediğinizi varsayalım. Bilgisayar, dikdörtgenle ilgili
belirli bilgileri izler, örn. dikdörtgenin konumlandırıldığı x, y koordinatları, genişliği, uzunluğu, rengi, vb. Bu bilgi
bitlerinin her biri bilgisayarın belleğinde bir yerde saklanır. Dikdörtgeni farklı bir konuma taşıma programı, "x
koordinatını 200 olarak değiştir; y koordinatını 15 olarak değiştir" (başka bir deyişle, x ve y koordinatları için
kullanılacak yeni değerleri belirten) gibi adımlar içerecektir. Elbette bilgisayar bu sayıları gerçekten bilgisayar
ekranında görüntülenen görüntüye dönüştürmek için bu verilerle bir şeyler yapar; ancak şu an için bizi ilgilendiren
ayrıntı düzeyine göre, "ekrandaki dikdörtgeni taşıma" işleminin gerçekten bilgisayar belleğindeki veri bitlerinin
değiştirilmesiyle gerçekleştiğinin bilinmesi yeterlidir.
Değişkenler ve sabitler
Programlama temel olarak bilgisayar belleğindeki bilgilerin değiştirilmesini içerdiğinden, programda tek bir bilgiyi
temsil etmenin bir yolunun olması gerekir. Değişken, bilgisayar belleğindeki bir değeri temsil eden addır. Değerleri
işlemek için deyimler yazdığınızda, değerin yerine değişkenin adını yazarsınız; bilgisayar değişken adını
programınızda her gördüğünde, belleğine bakar ve orada bulduğu değeri kullanır. Örneğin, her biri bir sayı içeren,
value1 ve value2 adında iki değişkeniniz varsa, bu iki sayıyı eklemek için şu deyimi yazabilirsiniz:
value1 + value2
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 10
ActionScript ile çalışmaya başlama
Bilgisayar gerçekten adımları uygularken, her değişkendeki değerlere bakar ve bunları birbirine ekler.
ActionScript 3.0'da, bir değişken üç farklı bölümden oluşur:
• Değişkenin adı
• Değişkende saklanabilen veri türü
• Bilgisayarın belleğinde saklanan gerçek değer
Bilgisayarın, değerin yer tutucusu olarak adı nasıl kullandığını açıkladık. Veri türü de önemlidir. ActionScript'te bir
değişken oluşturduğunuzda, bu değişkenin barındıracağı belirli veri türünü belirtirsiniz; bu noktadan sonra,
programınızın talimatları değişkende yalnızca o veri türünü saklayabilir ve siz de o veri türüyle ilişkilendirilmiş belirli
özellikleri kullanarak değeri işleyebilirsiniz. ActionScript'te, bir değişken oluşturmak için (değişkeni bildirmek de
denilebilir), var deyimini kullanırsınız:
var value1:Number;
Bu durumda, bilgisayara yalnızca Number verilerini ("Number", ActionScript'te tanımlı belirli bir veri türüdür)
barındıracak value1 adında bir değişken oluşturması talimatını verdik. Değişkende hemen bir değeri de
saklayabilirsiniz:
var value2:Number = 17;
Adobe Flash CS4 Professional'da bir değişken bildirmenin başka bir yolu vardır. Sahne Alanı'na bir film klibi sembolü,
düğme sembolü veya metin alanı yerleştirdiğinizde, Özellik denetçisinde buna bir örnek adı verebilirsiniz. Flash
uygulaması, sahne alanının arkasında örnek adıyla aynı ada sahip bir değişken oluşturur ve bu Sahne Alanı öğesini
ifade etmek için ActionScript kodunuzda bu değişkeni kullanabilirsiniz. Böylece, örneğin Sahne Alanı'nda bir film
klibi sembolünüz olursa ve buna rocketShip örnek adını verirseniz, ActionScript kodunuzda rocketShip
değişkenini her kullandığınızda, aslında bu film klibini işliyor olursunuz.
Sabit, bilgisayarın belleğinde belirli bir veri türüyle bir değeri temsil eden bir ad olması açısından değişkene çok benzer.
Tek farkı, sabite bir ActionScript uygulaması sırasında yalnızca bir kere değer atanabilmesidir. Sabitin değeri
atandıktan sonra tüm uygulamada bu değer aynı kalır. Sabit bildirme sözdizimi, değişken bildirme sözdizimiyle
aynıdır, tek farkı, var anahtar sözcüğü yerine const anahtar sözcüğünün kullanılmasıdır:
const SALES_TAX_RATE:Number = 0.07;
Bir proje boyunca birden çok yerde kullanılan ve normal koşullarda değişmeyecek bir değeri tanımlamak için sabit
kullanışlıdır. Değişmez değer yerine bir sabit kullanılması, kodunuzu daha okunaklı hale getirir. Örneğin, bir fiyatı
SALES_TAX_RATE değeriyle çarpan bir kod satırının anlaşılması, fiyatı 0.07 değeriyle çarpan bir kod satırına göre daha
kolaydır. Ayrıca, bir sabit tarafından tanımlanan değerin değişmesi gerekmiyorsa, projeniz boyunca o değeri temsil
etmek için bir sabit kullanırsanız, sabit kodlu değişmez değerleri kullandığınızda yaptığınız gibi çeşitli yerlerde değeri
değiştirmek yerine yalnızca bir yerde (sabit bildiriminde) değeri değiştirmeniz gerekir.
Veri türleri
ActionScript'te, oluşturduğunuz değişkenlerin veri türü olarak kullanabileceğiniz birçok veri türü vardır. Bunlardan
bazıları "basit" veya "temel" veri türleri olarak değerlendirilebilir:
• Dize: bir ad veya kitabın bir bölümü gibi, metin değeri
• Sayısal: ActionScript 3.0, sayısal veriler için üç özel veri türü içerir:
• Sayı: kesirli veya kesirsiz sayılar da dahil olmak üzere herhangi bir sayısal değer
• int: bir tam sayı (kesirsiz bir tam sayı)
• uint: “işaretsiz” tam sayı, başka bir deyişle negatif olamayan bütün bir sayı
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 11
ActionScript ile çalışmaya başlama
• Boolean: bir düğmenin etkin olup olmadığı veya iki değerin eşit olup olmadığı gibi, doğru veya yanlış değeri
Basit veri türleri tek bir bilgiyi temsil eder: örneğin, tek bir sayı veya tek bir metin sırası Ancak, ActionScript'te tanımlı
veri türlerinin çoğunluğu, birlikte gruplandırılabilen değerler kümesini temsil ettiğinden, karmaşık veriler olarak
açıklanabilir. Örneğin, Date veri türüne sahip bir değişken, tek bir değeri (tek bir zamanı) temsil eder. Ancak, bu değer
gerçekte birçok değer olarak temsil edilir: gün, ay, yıl, saat, dakika, saniye, vb. ve bunların her biri ayrı ayrı bir sayıdır.
Böylece, biz tarihi tek bir değer olarak düşünürken (ve Date değişkenini oluşturarak tek bir değer olarak
değerlendirebilirken), bilgisayar dahili olarak bunu birçok değerden oluşan bir grup olarak değerlendirir, bir araya
getirir ve tek bir tarihi tanımlar.
Programcıların tanımladığı veri türlerinin yanı sıra, yerleşik veri türlerinin çoğu da karmaşık veri türleridir.
Tanıyabileceğiniz karmaşık veri türlerinden bazıları şunlardır:
• MovieClip: bir film klibi sembolü
• TextField: dinamik bir alan veya girdi metni alanı
• SimpleButton: bir düğme sembolü
• Date: tek bir zaman (tarih ve saat) hakkındaki bilgi
Sınıf ve nesne sözcükleri genellikle veri türü için eşanlamlı olarak kullanılır. Sınıf, veri türünün tanımıdır, veri türünün
tüm nesneleri için bir şablon gibidir, örn. "Example veri türünün tüm değişkenleri bu özelliklere sahiptir: A, B ve C."
söylemine benzer. Nesne ise sınıfın gerçek bir örneğidir; veri türü MovieClip olan bir değişken, MovieClip nesnesi
olarak açıklanabilir. Aşağıda, aynı şeyi söylemenin birkaç farklı yolu verilmiştir:
•
myVariable değişkeninin veri türü Number'dır.
•
myVariable değişkeni bir Number örneğidir.
•
myVariable değişkeni bir Number nesnesidir.
•
myVariable değişkeni, Number sınıfının bir örneğidir.
Nesnelerle çalışma
ActionScript, nesne odaklı programlama dili olarak bilinir. Nesne odaklı programlama, bir programlama yaklaşımı
olup nesneleri kullanarak bir programda kodu organize etme yolundan fazlasını ifade etmez.
Daha önce bilgisayar programını, bilgisayarın gerçekleştirdiği bir adımlar ve talimatlar serisi olarak tanımladık. Bu
durumda kavramsal olarak bilgisayarı tek bir uzun talimatlar listesi olarak düşünebiliriz. Ancak, nesne odaklı
programlamada, program talimatları farklı nesneler arasında bölünür—kod, işlev kümeleri olarak gruplandırılır,
böylece ilgili işlev türleri veya ilgili bilgiler tek bir konteynerde bir arada gruplandırılır.
Aslında, Flash uygulamasında sembollerle çalıştıysanız, nesnelerle de çalışmaya hazırsınız demektir. Bir film klibi
sembolü—örneğin bir dikdörtgen çizimi—tanımladığınızı ve bunun bir kopyasını Sahne Alanı'na yerleştirdiğinizi
varsayın. Bu film klibi aynı zamanda (gerçekten) ActionScript'te bir nesnedir; MovieClip sınıfının bir örneğidir.
Film klibinin değiştirebileceğiniz çeşitli özellikleri vardır. Örneğin, seçili olduğunda, Özellik denetçisinde
değiştirebileceğiniz değerler vardır, örn. x koordinatı, genişlik veya alfa (saydamlık) değiştirme ya da gölge filtresi
ekleme gibi çeşitli renk ayarlamaları. Dikdörtgeni döndürmek için Serbest Dönüştürme aracının kullanılması gibi,
diğer Flash araçları daha fazla değişiklik yapmanıza olanak sağlar. Flash geliştirme ortamında bir film klibi sembolünü
değiştirmek için kullanabildiğiniz tüm bu şeyleri aynı zamanda MovieClip nesnesi adındaki tek bir kümede bir araya
getirilmiş verileri değiştirerek ActionScript'te de yapabilirsiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 12
ActionScript ile çalışmaya başlama
ActionScript nesne odaklı programlamada, herhangi bir sınıfın içerebileceği üç özellik türü vardır:
• Özellikler
• Yöntemler
• Olaylar
Bu öğeler, program tarafından kullanılan verileri yönetmek ve hangi eylemlerin ne sırada yapılacağına karar vermek
için birlikte kullanılır.
Özellikler
Özellik, bir nesnede kümelenmiş olan verilerden birini temsil eder. Bir şarkı nesnesi, artist ve title adında
özelliklere sahip olabilir; MovieClip sınıfı rotation, x, width ve alpha gibi özelliklere sahiptir. Tek tek değişkenler
gibi özelliklerle çalışabilirsiniz—aslında özellikleri bir nesnede bulunan "alt" değişkenler olarak düşünebilirsiniz.
Aşağıda, özellik kullanan birkaç ActionScript kodu örnekleri verilmiştir. Bu kod satırı, square adındaki MovieClip
öğesini 100 piksel x koordinatına taşır:
square.x = 100;
Bu kod, triangle MovieClip öğesinin dönüşüyle eşleşecek şekilde square MovieClip öğesinin dönmesini sağlamak
için rotation özelliğini kullanır:
square.rotation = triangle.rotation;
Bu kod, square MovieClip öğesinin eski halinden bir buçuk kat daha geniş olmasını sağlayacak şekilde yatay ölçeğini
değiştirir:
square.scaleX = 1.5;
Ortak yapıya dikkat edin: nesnenin adı sırayla nesnenin adını (square, triangle), bir nokta işaretini (.) ve özelliğin
adını (x, rotation, scaleX) içerir. Nokta operatörü olarak da bilinen nokta işareti, bir nesnenin alt öğelerinden birine
erişmekte olduğunu belirtmek için kullanılır. Tüm yapı olduğu gibi "değişken adı-nokta-özellik adı", tek bir değişken
gibi, bilgisayar belleğindeki tek bir değerin adı olarak kullanılır.
Yöntemler
Yöntem, bir nesne tarafından gerçekleştirilebilen bir eylemdir. Örneğin, Flash uygulamasında, zaman çizelgesinde
birçok anahtar kare ve animasyonla bir film klibi sembolü oluşturduysanız, bu film klibi oynatılabilir veya
durdurulabilir ya da bu film klibine oynatma kafasını belirli bir kareye taşıması bildirilebilir.
Bu kod, shortFilm adındaki MovieClip öğesine oynatmayı başlatmasını bildirir:
shortFilm.play();
Bu satır, shortFilm adındaki MovieClip öğesinin oynatmayı durdurmasını sağlar (oynatma kafası, video
duraklatılmış gibi yerinde durdurulur):
shortFilm.stop();
Bu kod, shortFilm adındaki MovieClip öğesinin oynatma kafasını Kare 1'e taşıyıp oynatmayı durdurmasını sağlar
(videoyu geri sarmak gibi):
shortFilm.gotoAndStop(1);
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 13
ActionScript ile çalışmaya başlama
Gördüğünüz gibi, yöntemlere de, tıpkı özellikler gibi sırayla nesnenin adı (bir değişken), nokta işareti, yöntemin adı
ve parantez işaretleri yazılarak erişilebilir. Parantezler, yöntemi çağırdığınızı veya başka bir deyişle nesneye o eylemi
gerçekleştirmesini bildirdiğinizi belirtmenin yoludur. Bazen eylemi gerçekleştirmek için gerekli olan ek bilgileri
iletmenin bir yolu olarak, değerler (veya değişkenler) parantez içine yerleştirilir. Bu değerler, yöntem parametreleri
olarak bilinir. Örneğin, gotoAndStop() yönteminin hangi kareye gideceğini bilmesi gerekir, bu nedenle parantez için
tek bir parametre olması gereklidir. play() ve stop() gibi diğer yöntemler kendinden açıklayıcıdır ve bu nedenle de
fazladan bilgi gerektirmez. Ancak yine de parantez içinde yazılır.
Özelliklerden (ve değişkenlerden) farklı olarak, yöntemler değer yer tutucuları olarak kullanılmaz. Ancak bazı
yöntemler hesaplamalar gerçekleştirebilir ve bir değişken olarak kullanılabilecek bir sonuç döndürebilir. Örneğin,
Number sınıfının toString() yöntemi, sayısal değeri metin olarak temsil edilen haline dönüştürür:
var numericData:Number = 9;
var textData:String = numericData.toString();
Örneğin, Bir Number değişkeninin değerini ekranda bir metin alanında görüntülemek isterseniz, toString()
yöntemini kullanırsınız. TextField sınıfının text özelliği (ekranda görüntülenen gerçek metin içeriğini temsil eder),
String olarak tanımlanır, bu nedenle yalnızca metin değerlerini içerebilir. Bu kod satırı, numericData değişkenindeki
sayısal değeri metne dönüştürür ve sonra bu metnin ekranda calculatorDisplay adındaki TextField nesnesinde
gösterilmesini sağlar:
calculatorDisplay.text = numericData.toString();
Olaylar
Bilgisayar programını, bilgisayarın adım adım gerçekleştirdiği bir talimatlar dizisi olarak açıklamıştık. Bazı basit
bilgisayar programları, bilgisayarın gerçekleştirdiği ve programı sona erdiren birkaç adımdan fazlasını içermez.
Ancak, ActionScript programları sürekli çalışacak ve kullanıcı girdisinin veya başka şeylerin oluşmasını bekleyecek
şekilde tasarlanmıştır. Olaylar, bilgisayarın hangi talimatları ne zaman gerçekleştireceğini belirleyen mekanizmadır.
Temel olarak olaylar, ActionScript'in farkında olduğu ve yanıt verdiği, gerçekleşen şeylerdir. Kullanıcının bir düğmeyi
tıklatması veya klavyedeki bir tuşa basması gibi birçok olay kullanıcı etkileşimiyle ilgilidir ancak başka tür olaylar da
vardır. Örneğin, harici bir görüntüyü yüklemek için ActionScript'i kullanırsanız, görüntü yüklemesinin bittiğini size
bildiren bir olay vardır. Temelde, bir ActionScript programı çalışırken, Adobe Flash Player ve Adobe AIR durup belirli
şeylerin gerçekleşmesini bekler ve bu şeyler gerçekleştiğinde, bu olaylar için belirttiğiniz belirli bir ActionScript
kodunu çalıştırır.
Temel olay işleme
Belirli bir olaya yanıt olarak gerçekleştirilmesi gereken belirli eylemleri belirtme tekniği, olay işleme olarak bilinir. Olay
işleme gerçekleştirmek için ActionScript kodu yazarken tanımlamanız gereken üç önemli öğe vardır:
• Olay kaynağı: Olayın gerçekleşeceği nesne hangisidir? Örneğin, hangi düğme tıklatılacak veya hangi Loader nesnesi
görüntüyü yüklüyor? Olay kaynağı, Flash Player veya AIR tarafından olayın hedeflendiği (başka bir deyişle olayın
gerçekten gerçekleştiği) nesne olduğundan, ayrıca olay hedefi olarak da bilinir.
• Olay: Gerçekleşecek şey, yanıt vermek istediğiniz şey nedir? Birçok nesne çok sayıda olayı tetiklediğinden bunun
tanımlanması önemlidir.
• Yanıt: Olay gerçekleştiğinde hangi adımların gerçekleştirilmesini istiyorsunuz?
Olayları işlemek için her ActionScript kodu yazdığınızda, kodda bu üç öğe yer alır ve kod bu temel yapıya uyar (kalın
öğeler, belirli durumunuz için dolduracağınız yer tutuculardır):
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 14
ActionScript ile çalışmaya başlama
function eventResponse(eventObject:EventType):void
{
// Actions performed in response to the event go here.
}
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);
Bu kod iki şey gerçekleştirir. İlk olarak, olaya yanıt olarak gerçekleştirilmesini istediğiniz eylemleri belirtmenin bir yolu
olan bir işlevi tanımlar. Daha sonra, işlevin belirtilen olaya abone olmasının sonucu olarak bu, kaynak nesnenin
addEventListener() yöntemini çağırır, böylece olay gerçekleştiğinde işlevin eylemleri gerçekleştirilir. Bu parçaların
her birini daha ayrıntılı şekilde ele alacağız.
İşlev, eylemleri gerçekleştirmek üzere kısayol adı gibi tek bir ad ile eylemleri bir arada gruplandırmanız için bir yol
sağlar. İşlev, bir yönteme benzer, tek farkı, işlevin belirli bir sınıfla ilişkilendirilmek zorunda olmamasıdır. (Aslında
yöntem, belirli bir sınıfla ilişkilendirilmiş bir işlev olarak tanımlanabilir.) Olay işleme için bir işlev oluştururken, işlevin
adını seçmeniz gerekir (bu durumda eventResponse adında). Ayrıca tek bir parametre belirmeniz gerekir (bu örnekte
eventObject adında). İşlev parametresinin belirtilmesi bir değişkenin belirtilmesine benzer, bu nedenle
parametrenin veri türünü de belirtmeniz gerekir. (Bu örnekte, EventType parametrenin veri türüdür.)
Dinlemek istediğiniz her olay türünün kendisiyle ilişkilendirilmiş bir ActionScript sınıfı vardır. İşlev parametresi için
belirttiğiniz veri türü her zaman yanıt vermek istediğiniz belirli bir olayın ilişkilendirilmiş sınıfıdır. Örneğin, click
olayı (kullanıcı fareyle bir öğeyi tıklattığında tetiklenir), MouseEvent sınıfıyla ilişkilendirilir. click olayı için bir
dinleyici işlevi yazmak üzere, MouseEvent veri türüne sahip bir parametreyle dinleyici işlevini tanımlarsınız. Son
olarak, açma ve kapatma küme ayraçları arasına ({ ... }), olay gerçekleştiğinde bilgisayarın uygulamasını istediğiniz
talimatları yazarsınız.
Olay işleme işlevini yazdıktan sonra, olay kaynağı nesnesine (olayın gerçekleştiği nesne—örneğin, düğme) olay
gerçekleştiğinde işlevinizin çağrılmasını istediğinizi bildirmeniz gerekir. O nesnenin addEventListener()
yöntemini çağırarak bunu yaparsınız. (Olaylara sahip tüm nesneler aynı zamanda addEventListener() yöntemine
de sahiptir.) addEventListener() yöntemi iki parametre alır:
• İlk olarak, yanıt vermek istediğiniz belirli olayın adı. Yine her olay belirli bir sınıfa bağlıdır ve bu sınıfın her olay
için önceden tanımlı özel bir değeri olur—bu, birinci parametre için kullanmanız gereken olayın kendi benzersiz
adına benzer.
• İkinci olarak, olay yanıtı işlevinizin adı. İşlev adının parametre olarak iletildiğinde parantez olmadan yazıldığını
unutmayın.
Olay işleme işlemini inceleme
Aşağıda, bir olay dinleyicisi oluşturduğunuzda gerçekleşen işlemin adım adım bir açıklaması yer almaktadır. Bu
durumda, myButton adındaki bir nesne tıklatıldığında çağrılan bir dinleyici işlevinin oluşturulması örneği yer
almaktadır.
Programcı tarafından yazılan gerçek kod şu şekildedir:
function eventResponse(event:MouseEvent):void
{
// Actions performed in response to the event go here.
}
myButton.addEventListener(MouseEvent.CLICK, eventResponse);
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 15
ActionScript ile çalışmaya başlama
Flash Player'da çalışırken bu kodun gerçekten çalışma şekli şöyledir. (Bu davranış Adobe AIR için de aynıdır):
1 SWF dosyası yüklendiğinde, Flash Player, eventResponse() adında bir işlevin olduğunu not eder.
2 Daha sonra Flash Player, kodu (daha net olmak gerekirse, işlevde olmayan kod satırlarını) çalıştırır. Bu durumda
yalnızca bir kod satırı vardır: Olay kaynağı nesnesinde (myButton adında) addEventListener() yöntemini
çağırma ve parametre olarak eventResponse işlevini iletme.
a Dahili olarak myButton öğesi, olaylarının her birini dinleyen işlevlerin bir listesini içerir, böylece
addEventListener() yöntemi çağrıldığında, myButton öğesi olay dinleyicileri listesinde eventResponse()
işlevini saklar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 16
ActionScript ile çalışmaya başlama
3 Bir noktada kullanıcı myButton nesnesini tıklatarak click olayını tetikler. (Kodda MouseEvent.CLICK olarak
tanımlanmıştır.)
Bu noktada şunlar gerçekleşir:
a Flash Player bir nesneyi, söz konusu olayla ilişkilendirilmiş sınıfın bir örneğini (bu örnekte MouseEvent)
oluşturur. Birçok olay için bu Event sınıfının bir örneği olacaktır; fare olayları için MouseEvent örneği olurken
diğer olaylar için o olayla ilişkilendirilmiş sınıfın bir örneği olur. Oluşturulan nesne olay nesnesi olarak bilinir
ve gerçekleşen olayla ilgili belirli bilgiler içerir: ne tür olay olduğu, nerede gerçekleştiği ve varsa diğer olaya özgü
bilgiler.
b Daha sonra Flash Player, myButton tarafından saklanan olay dinleyicileri listesine bakar. Birer birer bu
işlevlerde dolaşarak işlevlerin her birini çağırır ve olay nesnesini parametre olarak işleve iletir.
eventResponse() işlevi, myButton öğesinin dinleyicilerinden biri olduğundan, bu işlemin bir parçası olarak
Flash Player uygulaması eventResponse() işlevini çağırır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 17
ActionScript ile çalışmaya başlama
c eventResponse() işlevi çağrıldığında, o işlevdeki kod çalıştırılır, böylece belirttiğiniz eylemler gerçekleştirilir.
Olay işleme örnekleri
Ortak olay öğelerinden bazıları ve olay işleme kodu yazılırken kullanılabilen olası değişimler hakkında size fikir
vermesi için birkaç tane daha somut olay örnekleri şunlardır:
• Geçerli film klibini oynatmaya başlamak için bir düğmeyi tıklatma. Aşağıdaki örnekte, playButton düğmenin
örnek adı ve this öğesi de "geçerli nesne" anlamına gelen özel bir addır:
this.stop();
function playMovie(event:MouseEvent):void
{
this.play();
}
playButton.addEventListener(MouseEvent.CLICK, playMovie);
• Metin alanındaki yazıyı algılama. Bu örnekte, entryText bir girdi metni alanı ve outputText ise bir dinamik
metin alanıdır:
function updateOutput(event:TextEvent):void
{
var pressedKey:String = event.text;
outputText.text = "You typed: " + pressedKey;
}
entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
• URL'ye gitmek için bir düğmeyi tıklatma. Bu durumda, linkButton düğmenin örnek adıdır:
function gotoAdobeSite(event:MouseEvent):void
{
var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/");
navigateToURL(adobeURL);
}
linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 18
ActionScript ile çalışmaya başlama
Nesne örnekleri oluşturma
Elbette ActionScript'te bir nesneyi kullanabilmeniz için öncelikle nesnenin varolması gerekir. Nesne oluşturma
işleminin bir bölümünü değişkenin bildirilmesi oluşturur; ancak bir değişken belirtildiğinde, bilgisayarın belleğinde
boş bir yer oluşturulur. Değişkeni kullanmadan veya işlemeden önce, değişkene gerçek bir değer atamanız—başka bir
deyişle bir nesne oluşturup bu nesneyi değişkende saklamanız—gerekir. Nesne oluşturma işlemi, nesneyi başlatmak—
başka bir deyişle, belirli bir sınıfın örneğini oluşturmak olarak bilinir.
Nesne örneği oluşturmanın basit bir yolunda ActionScript kullanılmaz. Flash'ta Sahne Alanına bir film klibi sembolü,
düğme sembolü veya metin alanı yerleştirdiğinizde ve Özellik denetçisinde buna bir örnek adı atadığınızda, Flash
otomatik olarak o örnek adıyla bir değişken bildirir ve bir nesne örneği oluşturup bu nesneyi değişkende saklar. Aynı
şekilde Adobe Flex Builder'da, MXML uygulamasında bir bileşen oluşturup (bir MXML etiketini kodlayarak veya
Tasarım modunda düzenleyiciye bileşeni yerleştirerek) bu bileşene bir kimlik atadığınızda (MXML işaretlemesinde ya
da Flex Özellikleri görünümünde), bu kimlik ActionScript değişkeninin adı olur ve bileşenin bir örneği oluşturulup
değişkende saklanır.
Ancak her zaman bir nesneyi görsel olarak oluşturmak istemezsiniz. Yalnızca ActionScript'i kullanarak nesne
örnekleri oluşturabilmenin birçok yolu vardır. İlk olarak, birçok ActionScript veri türüyle, bir değişmez ifade
(doğrudan ActionScript koduna yazılan bir değer) kullanarak bir örnek oluşturabilirsiniz. Aşağıda bazı örneklere yer
verilmiştir:
• Değişmez sayısal değer (doğrudan sayı girilir):
var someNumber:Number = 17.239;
var someNegativeInteger:int = -53;
var someUint:uint = 22;
• Değişmez String değeri (metin tırnak işareti içine alınır):
var firstName:String = "George";
var soliloquy:String = "To be or not to be, that is the question...";
• Değişmez Boolean değeri (true veya false değişmez değerleri kullanılır):
var niceWeather:Boolean = true;
var playingOutside:Boolean = false;
• Değişmez Array değeri (virgülle ayrılmış değerler listesi köşeli ayraç içine alınır):
var seasons:Array = ["spring", "summer", "autumn", "winter"];
• Değişmez XML değeri (doğrudan XML girilir):
var employee:XML = <employee>
<firstName>Harold</firstName>
<lastName>Webster</lastName>
</employee>;
ActionScript ayrıca Array, RegExp, Object ve Function veri türleri için değişmez ifadeleri de tanımlar. Bu sınıflarla
ilgili ayrıntılar için, bkz. “Dizilerle çalışma” sayfa 152, “Normal ifadeler kullanma” sayfa 202 ve “Object veri türü”
sayfa 58.
Diğer veri türleri için, bir nesne örneği oluşturmak amacıyla şu şekilde sınıf adıyla new operatörünü kullanırsınız:
var raceCar:MovieClip = new MovieClip();
var birthday:Date = new Date(2006, 7, 9);
new operatörü kullanılarak nesne oluşturulması genellikle "sınıfın yapıcısını çağırma" olarak ifade edilir. Yapıcı, bir
sınıf örneği oluşturma işleminin parçası olarak çağrılan özel bir yöntemdir. Bu şekilde bir örnek oluşturduğunuzda,
sınıf adından sonra parantez koyduğunuza ve bazen parametre değerleri belirttiğinize (yöntem çağırırken de
yaptığınız iki şey) dikkat edin.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 19
ActionScript ile çalışmaya başlama
Değişmez bir ifade kullanarak örnekler oluşturmanıza olanak sağlayan bu veri türleri için de bir nesne örneği
oluşturmak üzere new operatörünü kullanabilirsiniz. Örneğin, bu iki kod satırı tamamen aynı şeyi yapar:
var someNumber:Number = 6.33;
var someNumber:Number = new Number(6.33);
Nesne oluşturmanın new ClassName() yolunun bilinmesi önemlidir. Görsel temsili olmayan (dolayısıyla Flash Sahne
Alanı'na bir öğe yerleştirilerek veya Flex Builder’ın MXML düzenleyicisinin Tasarım moduyla oluşturulamayan)
herhangi bir ActionScript veri türünde örnek oluşturmanız gerekirse, new operatörünü kullanarak doğrudan
ActionScript'te nesneyi oluşturup bunu yapabilirsiniz.
Özellikle de Flash'ta new operatörü ayrıca Kütüphane'de tanımlanmış ancak Sahne Alanı'na yerleştirilmeyen bir film
klibi sembolü örneği oluşturmak için de kullanılabilir. Bununla ilgili daha fazla bilgi için, bkz. “ActionScript ile
MovieClip nesneleri oluşturma” sayfa 404.
Ortak program öğeleri
Değişkenleri bildirme, nesne örnekleri oluşturma ve özellik ve yöntemlerini kullanarak nesneleri işlemeye ek olarak,
bir ActionScript programı oluşturmak için kullandığınız başka birkaç bina bloğu daha vardır.
Operatörler
Operatörler, hesaplamaları gerçekleştirmek için kullanılan özel sembollerdir (veya rastgele sözcüklerdir). Bunlar daha
çok matematik işlemleri için kullanılır ve değerleri birbiriyle karşılaştırırken de kullanılabilir. Genel bir kural olarak,
bir operatör bir veya birkaç değer kullanır ve tek bir sonuç "üretir". Örneğin:
• Toplama operatörü (+), iki değerini birbirine ekleyerek tek bir sayı ortaya çıkarır:
var sum:Number = 23 + 32;
• Çarpma operatörü (*), bir değeri diğeriyle çarparak tek bir sayı ortaya çıkarır:
var energy:Number = mass * speedOfLight * speedOfLight;
• Eşitlik operatörü (==), iki değerin eşit olup olmadığını görmek için iki değeri karşılaştırarak tek bir doğru veya
yanlış (Boolean) değerini ortaya çıkarır:
if (dayOfWeek == "Wednesday")
{
takeOutTrash();
}
Burada gösterildiği gibi, eşitlik operatörü ve diğer "karşılaştırma" operatörleri, belirli talimatların uygulanıp
uygulanmayacağını belirlemek için en yayın şekilde if deyimiyle birlikte kullanılır.
Operatörlerin kullanımıyla ilgili daha fazla ayrıntı ve örnekler için bkz. “Operatörler” sayfa 68.
Yorumlar
ActionScript yazarken belki de belirli kod satırlarının nasıl çalıştığını ve neden bu seçimi yaptığınızı açıklayacak
şekilde genellikle kendinize not bırakmak istersiniz. Kod yorumları, bilgisayarınızın kodunuzda yoksayması gereken
metinleri yazmak için kullanabileceğiniz bir araçtır. ActionScript, iki tür yorum içerir:
• Tek satırlı yorum: Tek satırlı yorum, bir satırın herhangi bir yerine iki eğik çizgi yerleştirilerek belirlenir. Eğik
çizgilerden satırın sonuna kadar olan her şey bilgisayar tarafından yoksayılır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 20
ActionScript ile çalışmaya başlama
// This is a comment; it's ignored by the computer.
var age:Number = 10; // Set the age to 10 by default.
• Çok satırlı yorum: Çok satırlı yorum, bir yorum başlatma işaretçisini (/*), ardından yorum içeriğini ve sonra da
yorum bitirme işaretçisini (*/) içerir. Yorumun kaç satır genişlediğine bakılmaksızın, başlatma ve bitirme
işaretçileri arasındaki her şey bilgisayar tarafından yoksayılır:
/*
This might be a really long description, perhaps describing what
a particular function is used for or explaining a section of code.
In any case, these lines are all ignored by the computer.
*/
Yorumların başka bir yaygın kullanım amacı da kodun bir veya birkaç satırını geçici olarak "devre dışı bırakmaktır"—
örneğin, bir şeyi yapmanın başka bir yolunu deniyorsanız veya belirli bir ActionScript kodunun neden beklediğiniz
şekilde çalışmadığını anlamaya çalışıyorsanız.
Akış denetimi
Bir programda birçok defa belirli eylemleri yinelemek, yalnızca belirli eylemleri gerçekleştirirken diğer eylemleri
gerçekleştirmemek, belirli koşullara bağlı olarak alternatif eylemleri uygulamak, vb. istersiniz. Akış denetimi, hangi
eylemlerin gerçekleştirileceğiyle ilgili denetimdir. ActionScript'te birçok kullanılabilir akış denetimi öğesi türü vardır.
• İşlevler: İşlevler kısayollara benzer—tek bir ad altında bir eylemler dizisini gruplandırmanın bir yolunu sağlar ve
hesaplamaları gerçekleştirmek için kullanılabilir. İşlevler özellikle olayları işlemede önemlidir ancak talimatlar
dizisini gruplandırmak için genel bir araç olarak da kullanılabilir. İşlevlerle ilgili daha fazla bilgi için, bkz. “İşlevler”
sayfa 78.
• Döngüler: Döngü yapıları, bilgisayarın belirli sayıda veya bazı koşullar değişinceye kadar gerçekleştireceği bir
talimatlar dizisi belirlemenize olanak sağlar. Döngüler genellikle bilgisayar döngüde her çalıştığında değeri değişen
bir değişkeni kullanarak birçok ilgili öğeyi işlemek için kullanılır. Döngülerle ilgili daha fazla bilgi için, bkz.
“Döngü” sayfa 75.
• Koşul deyimleri: Koşul deyimleri, belirli koşullarda gerçekleştirilen belirli talimatları belirlemenin veya farklı
koşullar için alternatif talimatlar dizisi sağlamanın bir yolunu sağlar. En yaygın koşul deyimi türü if deyimidir. if
deyimi, parantezleri içindeki bir değeri veya ifadeyi kontrol eder. Değer true olursa, küme ayraçları içindeki kod
satırları gerçekleştirilir; aksi takdirde bunlar yoksayılır. Örneğin:
if (age < 20)
{
// show special teenager-targeted content
}
if deyiminin eşi olan else deyimi, koşul true olmadığında gerçekleştirilecek alternatif talimatları belirlemenize
olanak sağlar:
if (username == "admin")
{
// do some administrator-only things, like showing extra options
}
else
{
// do some non-administrator things
}
Koşul deyimleri hakkında daha fazla bilgi almak için, bkz. “Koşullar” sayfa 73.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 21
ActionScript ile çalışmaya başlama
Örnek: Animasyon portföy parçası
Bu örnek, ActionScript bit'lerini tam, ya da ActionScript yönünden ağır bir uygulamada nasıl bir araya getirebileceğini
görmeniz için size ilk fırsatı sunmak üzere tasarlanmıştır. Animasyon portföy parçası, varolan bir doğrusal
animasyonu (örneğin, istemci için oluşturulan bir parça) alıp bu animasyonu birleştirmek için uygun olan bazı küçük
etkileşimli öğeleri çevrimiçi bir portföye nasıl ekleyebileceğinizi gösteren bir örnektir. Animasyona ekleyeceğimiz
etkileşimli davranış, izleyenin tıklatabileceği iki düğmeyi içerir: bu düğmelerden biri animasyonu başlatmak ve biri de
ayrı bir URL'ye (örn. portföy menüsü veya yazarın ana sayfası) gitmek içindir.
Bu parçayı oluşturma işlemi şu ana bölümlere ayrılabilir:
1 ActionScript ve etkileşimli öğeler eklemek için FLA dosyasını hazırlama.
2 Düğme oluşturma ve ekleme.
3 ActionScript kodu yazma.
4 Uygulamayı test etme.
Etkileşim eklemeye hazırlama
Animasyonumuza etkileşimli öğeler ekleyebilmemiz için, öncelikle yeni içeriğimizin ekleneceği bazı yerler
oluşturularak FLA dosyasının ayarlanması yardımcı olacaktır. Bu işlem kapsamında, Sahne Alanı'nda düğmelerin
yerleştirilebileceği gerçek alanın oluşturulması ve FLA dosyasında farklı öğeleri ayrı tutmak için "boşluk"
oluşturulması yer alır.
Etkileşimli öğeler eklemek üzere FLA'nızı ayarlamak için:
1 Etkileşim ekleyeceğiniz doğrusal bir animasyonunuz yoksa, tek ara hareket veya şekil arası gibi tek bir animasyonlu
yeni bir FLA dosyası oluşturun. Aksi takdirde, projede sergilediğiniz animasyonu içeren FLA dosyasını açın ve yeni
bir çalışma dosyası oluşturmak için bu FLA dosyasını yeni bir adla kaydedin.
2 İki düğmenin (biri animasyonu başlatmak ve biri de yazar portföyüne ya da ana sayfaya bağlanmak için) ekranın
neresinde görüntülenmesini istediğinize karar verin. Gerekirse, bu yeni içerik için Sahne Alanı'nda bazı boşlukları
temizleyin veya Sahne Alanı'na bazı boşluklar ekleyin. Animasyonda yoksa, birinci karede bir karşılama ekranı
oluşturmak isteyebilirsiniz. (Büyük ihtimalle Kare 2 veya sonrasında başlatılması için animasyonu kaydırmak
istersiniz.)
3 Zaman Çizelgesi'nde diğer katmanların yukarısına yeni bir katman ekleyin ve bunu düğmeler olarak yeniden
adlandırın. Bu, düğmeleri ekleyeceğiniz katman olacaktır.
4 Düğmeler katmanının yukarısına yeni bir katman ekleyin ve bu katmana eylemler adını verin. Burası,
uygulamanıza ActionScript kodunu ekleyeceğiniz yer olacaktır.
Düğme oluşturma ve ekleme
Daha sonra, etkileşimli uygulamamızın merkezini oluşturacak düğmeleri gerçek anlamda oluşturup
konumlandırmamız gerekecektir.
Düğmeleri oluşturup FLA dosyasına eklemek için:
1 Çizim araçlarını kullanarak, düğmeler katmanındaki birinci düğmenizin ("oynat" düğmesi) görsel görünümünü
oluşturun. Örneğin, en üst kısmında metnin yer aldığı yatay bir oval çizebilirsiniz.
2 Seçim aracını kullanarak tek bir düğmenin tüm grafik parçalarını seçin.
3 Ana menüden Değiştir > Sembole Dönüştür seçeneklerini belirleyin.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 22
ActionScript ile çalışmaya başlama
4 İletişim kutusunda sembol türü olarak Düğme seçeneğini belirleyin ve sembole bir ad verip Tamam'ı tıklatın.
5 Düğme seçili durumdayken, Özellik denetçisinde düğmeye playButton örnek adını verin.
6 İzleyeni, yazarın ana sayfasına götürecek düğmeyi oluşturmak için 1 ile 5 arasındaki adımları yineleyin. Bu
düğmeye homeButton adını verin.
Kod yazma
Tümüne aynı yerden girilse de, bu uygulamanın ActionScript kodu, üç işlev kümesine ayrılabilir. Kodun yapması
gereken üç şey şunlardır:
• SWF dosyası yüklendiği anda (oynatma kafası Kare 1'e girdiğinde) oynatma kafasını durdurma.
• Kullanıcı oynatma düğmesini tıklattığında SWF dosyasının oynatılmaya başlaması için bir olayı dinleme.
• Kullanıcı yazarın ana sayfası düğmesini tıklattığında tarayıcıyı uygun URL'ye göndermek için bir olayı dinleme.
Kare 1'e girdiğinde oynatma kafasını durdurmak için kod oluşturma:
1 Eylemler katmanının Kare 1'inde anahtar kareyi seçme.
2 Eylemler panelini açmak için, ana menüden Pencere > Eylemler seçeneklerini belirleyin.
3 Komut Dosyası bölmesinde şu kod girin:
stop();
Oynatma düğmesi tıklatıldığında animasyonu başlatmak üzere kod yazmak için:
1 Önceki adımlarda girilen kodun sonuna iki boş satır ekleyin.
2 Komut dosyasının alt kısmına şu kodu girin:
function startMovie(event:MouseEvent):void
{
this.play();
}
Bu kod, startMovie() adında bir işlevi tanımlar. startMovie() çağrıldığında, ana zaman çizelgesinin oynatmayı
başlatmasını sağlar.
3 Önceki adımda eklenen kodun ardından gelen satıra bu kod satırını girin:
playButton.addEventListener(MouseEvent.CLICK, startMovie);
Bu kod satırı, playButton öğesinin click olayının dinleyicisi olarak startMovie() işlevini kaydeder. Başka bir
deyişle, playButton adındaki düğme her tıklatıldığında startMovie() işlevinin çağrılmasını sağlar.
Ana sayfa düğmesi tıklatıldığında tarayıcıyı bir URL'ye göndermek üzere kod yazmak için:
1 Önceki adımlarda girilen kodun sonuna iki boş satır ekleyin.
2 Komut dosyasının alt kısmına bu kodu girin:
function gotoAuthorPage(event:MouseEvent):void
{
var targetURL:URLRequest = new URLRequest("http://example.com/");
navigateToURL(targetURL);
}
Bu kod, gotoAuthorPage() adında bir işlevi tanımlar. Bu işlev öncelikle URL http://example.com/ adresini temsil
eden bir URLRequest örneği oluşturur ve daha sonra bu URL'yi navigateToURL() işlevine ileterek kullanıcının
tarayıcısının bu URL'yi açmasını sağlar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 23
ActionScript ile çalışmaya başlama
3 Önceki adımda eklenen kodun ardından gelen satıra bu kod satırını girin:
homeButton.addEventListener(MouseEvent.CLICK, gotoAuthorPage);
Bu kod satırı, homeButton öğesinin click olayının dinleyicisi olarak gotoAuthorPage() işlevini kaydeder. Başka
bir deyişle, homeButton adındaki düğme her tıklatıldığında gotoAuthorPage() işlevinin çağrılmasını sağlar.
Uygulamayı test etme
Bu noktada, uygulamanın tamamen işlevsel olması gerekir. Emin olmak için durumun böyle olup olmadığını test
edelim.
Uygulamayı test etmek için:
1 Ana menüden, Kontrol Et > Filmi Test Et seçeneklerini belirleyin. Flash SWF dosyasını oluşturur ve bir Flash
Player penceresinde açar.
2 Beklediğiniz işlemi yaptıklarından emin olmak için her iki düğmeyi de deneyin.
3 Düğmeler çalışmazsa, kontrol etmeniz gereken şeyler şunlardır:
• Düğmelerin belirgin örnek adları var mı?
•
addEventListener() yöntemi çağrıları, düğmelerin örnek adlarıyla aynı adları mı kullanıyor?
•
addEventListener() yöntemi çağrılarında doğru olay adları kullanılıyor mu?
• İşlevlerin her biri için doğru parametre belirtilmiş mi? (Her ikisi de MouseEvent veri türünde tek bir parametre
içermelidir.)
Bunların tümü ve diğer olası hataların çoğu, Filmi Test Et komutunu seçtiğinizde veya düğmeyi tıklattığınızda bir
hata mesajı vermelidir. Derleyici hataları (Filmi Test Et seçeneğini ilk belirlediğinizde gerçekleşen hatalar) için
Derleyici Hataları paneline bakın ve çalışma zamanı hataları (SWF oynatılırken gerçekleşen hatalar, örn. bir
düğmeyi tıklattığınızda) için Çıktı panelini kontrol edin.
ActionScript ile uygulamalar oluşturma
Uygulama oluşturmak için ActionScript yazma işlemi, sözdiziminin ve kullanacağınız sınıfların adlarının
bilinmesinden daha fazlasını içerir. Bu kılavuzdaki bilgilerin çoğu bu iki konuyla (sözdizimi ve ActionScript sınıflarını
kullanma) ilgili olarak verilmiş olsa da, ActionScript yazmak için hangi programların kullanılabileceği, ActionScript
kodunun nasıl organize edilip bir uygulamaya dahil edilebileceği ve ActionScript uygulamasının geliştirilmesinde
hangi adımları izlemeniz gerektiği gibi bazı bilgileri bilmek istersiniz.
Kodunuzu organize etme seçenekleri
Basit grafik animasyonlarından karmaşık istemci-sunucu işlemi işleme sistemlerine kadar her şeyi desteklemek için
ActionScript 3.0'ı kullanabilirsiniz. Oluşturduğunuz uygulama türüne bağlı olarak, projenize ActionScript dahil
etmenin bu farklı yollarından birini veya birkaçını kullanmayı tercih edebilirsiniz.
Flash zaman çizelgesinde karelere kod saklama
Flash geliştirme ortamında, zaman çizelgesindeki herhangi bir kareye ActionScript kodu ekleyebilirsiniz. Film
oynatılırken, oynatma kafası bu kareye girdiğinde bu kod çalıştırılır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 24
ActionScript ile çalışmaya başlama
ActionScript kodunun karelere yerleştirilmesi, Flash geliştirme aracında yerleşik olan uygulamalara davranış
eklemenin basit bir yolunu sağlar. Ana zaman çizelgesinde herhangi bir kareye veya herhangi bir MovieClip
sembolünün zaman çizelgesinde herhangi bir kareye kod ekleyebilirsiniz. Ancak bu esneklik bir maliyete de yol açar.
Daha büyük uygulamalar oluşturduğunuzda, hangi karelerin hangi komut dosyalarını içerdiğinin takibini kaybetmek
kolaylaşır. Bu, uygulamanın zamanla korunmasını güçleştirebilir.
Geliştiricilerin çoğu, zaman çizelgesinin yalnızca birinci karesine veya Flash belgesindeki belirli bir katmana kod
yerleştirerek Flash geliştirme aracında ActionScript kodunun organize edilmesini basitleştirir. Bu da Flash FLA
dosyalarınızda kodun bulunmasını ve korunmasını kolaylaştırır. Ancak aynı kodu başka bir Flash projesinde
kullanmak için, kodu kopyalayıp yeni dosyaya yapıştırmanız gerekir.
ActionScript kodunuzu gelecekte diğer Flash projelerinde kullanabilmek istiyorsanız, kodunuzu harici ActionScript
dosyalarında (.as uzantısına sahip metin dosyaları) saklamak istersiniz.
ActionScript dosyalarında kod saklama
Projenizde önemli ActionScript kodu varsa, kodunuz en iyi şekilde ayrı ActionScript kaynak dosyalarında (.as
uzantısına sahip metin dosyaları) organize edilir. ActionScript dosyası, uygulamanızda kullanılma amacına bağlı
olarak, iki yoldan biri kullanılarak yapılandırılabilir.
• Yapılandırılmamış ActionScript kodu: Doğrudan bir zaman çizelgesi komut dosyasına, MXML dosyasına, vb.'ye
girilmiş gibi yazılmış olan ve deyimleri ya da işlev tanımlarını içeren ActionScript kodu satırları.
ActionScript'te include deyimi veya Adobe Flex MXML'de <mx:Script> etiketi kullanılarak bu şekilde yazılmış
ActionScript'e erişilebilir. ActionScript include deyimi, harici bir ActionScript dosyasının içeriklerinin sanki
doğrudan girilmiş gibi, belirli bir konuma ve bir komut dosyasındaki belirli bir kapsama eklenmesini sağlar. Flex
MXML dilinde, <mx:Script> etiketi, uygulamadaki o noktada yüklenecek harici bir ActionScript dosyasını
tanımlayan bir kaynak niteliği belirmenize olanak sağlar. Örneğin, aşağıdaki etiket, Box.as adında harici bir
ActionScript dosyası yükler:
<mx:Script source="Box.as" />
• ActionScript sınıfı tanımı: ActionScript sınıfının yöntemini ve özellik tanımlarını içeren bir tanımı.
Bir sınıfı tanımladığınızda, herhangi bir yerleşik ActionScript sınıfıyla da olduğu gibi, sınıfın bir örneğini oluşturup
özelliklerini, yöntemlerini ve olaylarını kullanarak sınıftaki ActionScript koduna erişebilirsiniz. Bunun için iki şey
gereklidir:
• ActionScript derleyicisinin nerede bulacağını bilmesi için, sınıfın tam adını belirtmek amacıyla import
deyimini kullanın. Örneğin, ActionScript'te MovieClip sınıfını kullanmak istiyorsanız, öncelikle paket ve sınıf
da dahil olmak üzere, tam adını kullanarak bu sınıfı içe aktarmanız gerekir:
import flash.display.MovieClip;
Alternatif olarak, MovieClip sınıfını içeren paketi içe aktarabilirsiniz, bu işlem paketteki her sınıf için ayrı
import deyimleri yazılmasına eşdeğerdir:
import flash.display.*;
Kodunuzda bir sınıfı ifade ediyorsanız, o sınıfın içe aktarılması gerektiği kuralının tek istisnası, üst düzey sınıflar
olup bunlar bir pakette açıklanmaz.
Not: Flash'ta Zaman Çizelgesi'nde karelere eklenen komut dosyaları için, yerleşik sınıflar (flash.* paketleri)
otomatik olarak içe aktarılır. Ancak kendi sınıflarınızı yazdığınızda veya Flash geliştirme bileşenleriyle (fl.*
paketleri) çalışıyorsanız ya da Flex'te çalışıyorsanız, bir sınıfın örneklerini oluşturan kodu yazmak için o sınıfı
açıkça içe aktarmanız gerekir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 25
ActionScript ile çalışmaya başlama
• Özel olarak sınıf adını ifade eden kodu yazın (genellikle o sınıfın bulunduğu bir değişkeni veri türü olarak
belirtip daha sonra değişkende saklamak için sınıfın bir örneğini oluşturarak). ActionScript kodunda başka bir
sınıf adını ifade ederek derleyiciye o sınıfın tanımını yüklemesini bildirirsiniz. Örneğin, Box adında harici bir
sınıf verildiğinde, bu deyim Box sınıfının yeni bir örneğinin oluşturulmasını sağlar:
var smallBox:Box = new Box(10,20);
Derleyici ilk defa Box sınıfının başvurusuyla karşılaştığında, Box sınıfı tanımını bulmak için yüklenen kaynak
kodunu arar.
Doğru aracı seçme
Projenizin gereksinimlerine ve sahip olduğunuz kaynaklara bağlı olarak, ActionScript kodunuzu yazmaya ve
düzenlemeye yönelik birçok araçtan birini (veya birden çok aracı birlikte) kullanmak isteyebilirsiniz.
Flash geliştirme aracı
Grafik ve animasyon oluşturma yeteneklerine ek olarak, Adobe Flash CS4 Professional, FLA dosyasındaki veya harici
yalnızca ActionScript dosyalarındaki öğelere eklenmiş olan ActionScript koduyla çalışma araçlarını içerir. Flash
geliştirme aracı, önemli miktarda animasyon veya video içeren ya da grafik varlıklarının çoğunu kendi başınıza
oluşturmak istediğiniz projeler için, özellikle de ActionScript gerektiren minimum kullanıcı etkileşimi veya
işlevselliğin yer aldığı projelerde idealdir. ActionScript projenizi geliştirmek için Flash geliştirme aracını kullanmayı
seçmenizin başka bir nedeni de, aynı uygulamada görsel varlıklar oluşturmayı ve kod yazmayı istemeniz olabilir.
Ayrıca önceden oluşturulmuş kullanıcı arabirimi bileşenlerini kullanmak istiyorsanız ancak projenizde önem verilen
öncelikler küçük SWF boyutu ve daha kolay bir görsel kaplama olduğunda da Flash geliştirme aracını kullanmak
isteyebilirsiniz.
Adobe Flash CS4 Professional, ActionScript kodunun yazılması için iki araç içerir:
• Eylemler paneli: FLA dosyasında çalışılırken kullanılabilir olan bu panel, zaman çizelgesinde karelere eklenmiş
ActionScript kodu yazmanıza olanak sağlar.
• Komut dosyası penceresi: Komut dosyası penceresi, ActionScript (.as) kod dosyalarıyla çalışmak için adanmış bir
metin düzenleyicisidir.
Flex Builder
Adobe Flex Builder, Flex çerçevesiyle projeler oluşturulmasına yönelik birincil araçtır. Flex Builder, görsel mizanpaj
ve MXML düzenleme araçlarına ek olarak, Flex veya yalnızca ActionScript projeleri oluşturmak için de
kullanılabilmesi için tam özellikli bir ActionScript düzenleyicisi de içerir. Flex uygulamalarının birçok avantajı vardır,
bu avantajlar arasında, zengin bir önceden oluşturulmuş kullanıcı arabirimi denetimleri kümesi, esnek dinamik
mizanpaj denetimleri ve harici veri kaynaklarıyla çalışılması ve harici verilerin kullanıcı arabirimi öğelerine
bağlanmasına yönelik yerleşik mekanizmalar yer alır. Ancak bu özellikleri sağlamak için ek kod gerekli olduğundan,
Flex uygulamaları daha büyük bir SWF dosyası boyutuna sahip olabilir ve Flash eşdeğerleri kadar kolay şekilde
tamamen yeniden kaplanamayabilir.
Flex ile tam özellikli, veri tabanlı zengin Internet uygulamaları oluşturuyorsanız ve ActionScript kodunu düzenleme,
MXML kodunu düzenleme ve uygulamanızı görsel olarak düzenleme işlemlerinin tümünü tek bir araç içinde yapmak
istiyorsanız Flex Builder'ı kullanın.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 26
ActionScript ile çalışmaya başlama
Üçüncü taraf ActionScript düzenleyici
ActionScript (.as) dosyaları basit metin dosyaları olarak saklandığından, düz metin dosyalarını düzenleme yeteneğine
sahip herhangi bir program ActionScript dosyaları yazmak için kullanılabilir. Adobe’nin ActionScript ürünlerine ek
olarak, ActionScript'e özgü yetenekler içeren birçok üçüncü taraf metin düzenleme programları da oluşturulmuştur.
Herhangi bir metin düzenleyici programı kullanarak bir MXML dosyası veya ActionScript sınıfları yazabilirsiniz.
Daha sonra, Flex derleyicisinin yanı sıra Flex çerçevesi sınıflarını da içeren Flex SDK öğesini kullanarak bu dosyalarda
bir SWF uygulaması (Flex ya da yalnızca ActionScript uygulaması) oluşturabilirsiniz. Alternatif olarak birçok
geliştirici, grafiksel içerik oluşturmaya yönelik Flash geliştirme aracıyla birlikte ActionScript sınıfları yazmaya yönelik
üçüncü taraf bir ActionScript düzenleyicisi de kullanır.
Şu durumlarda üçüncü taraf bir ActionScript düzenleyicisi kullanmayı seçebilirsiniz:
• Flash uygulamasında görsel öğelerin tasarlanmasıyla birlikte ActionScript kodunu ayrı bir programda yazmayı
tercih ederseniz.
• ActionScript olmayan programlama (örn. HTML sayfaları oluşturma veya başka bir programlama dilinde
uygulamalar oluşturma) için bir uygulama kullanıyorsanız ve ActionScript kodlamanız için de aynı uygulamayı
kullanmak istiyorsanız.
• Flash veya Flex Builder olmadan Flex SDK kullanarak yalnızca ActionScript veya Flex projeleri oluşturmak
istiyorsanız.
ActionScript'e özgü destek sağlayan dikkate değer kod düzenleyicilerinden bazıları şunlardır:
• Adobe Dreamweaver® CS4
• ASDT
• FDT
• FlashDevelop
• PrimalScript
• SE|PY
ActionScript geliştirme işlemi
ActionScript projeniz ister büyük isterse küçük olsun, uygulamanızı tasarlayıp geliştirme işleminin kullanılması daha
etkili ve verimli şekilde çalışmanıza katkıda bulunur. Aşağıdaki adımlar, ActionScript 3.0'ı kullanan bir uygulamanın
oluşturulmasına yönelik temel bir geliştirme işlemini açıklamaktadır:
1 Uygulamanızı tasarlayın.
Uygulamanızı oluşturmaya başlamadan önce bir şekilde açıklamanız gerekir.
2 ActionScript 3.0 kodunuzu oluşturun.
Flash, Flex Builder, Dreamweaver veya bir metin düzenleyicisi kullanarak ActionScript kodu oluşturabilirsiniz.
3 Kodunuzu çalıştırmak için bir Flash veya Flex uygulama dosyası oluşturun.
Flash geliştirme aracında bu, yeni bir FLA dosyasının oluşturulmasını, yayınlama ayarlarınızın yapılmasını,
kullanıcı arabirimi bileşenlerinin uygulamaya eklenmesini ve ActionScript koduna başvurulmasını içerir. Flex
geliştirme ortamında, yeni bir uygulama dosyasının oluşturulması işlemi kapsamında, uygulamanın tanımlanması
ve MXML kullanılarak kullanıcı arabirimi bileşenlerinin eklenmesi ve ActionScript koduna başvurulması yer alır.
4 ActionScript uygulamanızı yayınlayın ve test edin.
Bu, Flash geliştirme veya Flex geliştirme ortamından uygulamanızın çalıştırılmasını ve uygulamanızın her şeyi
tasarlandığı şekilde yaptığından emin olunmasını içerir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 27
ActionScript ile çalışmaya başlama
Bu adımları aynı sırayla izlemek veya bir adım üzerinde çalışmadan önce bir önceki adımı tamamen bitirmek zorunda
olmadığınızı unutmayın. Örneğin uygulamanızın bir ekranını tasarlayabilir (adım 1) ve daha sonra ActionScript kodu
yazmadan (adım 2) ve test işlemini yapmadan (adım 4) önce, grafik düğmeleri, vb. oluşturabilirsiniz (adım 3). Ya da bir
kısmını tasarlayabilir ve sonra aynı anda tek bir düğme veya arabirim öğesi ekleyebilir ve her biri için ActionScript yazıp
bu öğeler oluşturulduğunda da öğeleri test edebilirsiniz. Geliştirme işleminin bu dört aşamasının hatırlanması yardımcı
olsa da, gerçek dünyadaki geliştirmede aşamalar arasında olabildiğince ileri geri hareket edilmesi daha etkili olur.
Kendi sınıflarınızı oluşturma
Projelerinizde kullanılmak üzere sınıf oluşturulması işlemi yorucu görünebilir. Ancak sınıf oluşturulmasının daha zor
bir kısmını, sınıfın tasarlanması, başka bir deyişle sınıfın içereceği yöntemlerin, özelliklerin ve olayların tanımlanması
görevi oluşturur.
Sınıf tasarlama stratejileri
Nesne tabanlı tasarım konusu karmaşıktır; tüm kariyerler, bu disiplinin akademik çalışmalarına ve profesyonel
uygulamasına adanmıştır. Ancak yine de başlangıç aşamasında yardımcı olabilecek birkaç önerilen yaklaşım şunlardır.
1 Bu sınıfın örneklerinin uygulamada oynayacağı rolü düşünün. Genellikle nesneler bu üç rolden biri görevini görür:
• Değer nesnesi: Bu nesneler birincil olarak veri konteynerleri görevi görür, başka bir deyişle, daha çok özellik ve
daha az yöntem içerir (veya bazen hiç yöntem içermez). Bunlar genellikle müzik çalar uygulamasındaki Song
sınıfı (tek bir gerçek dünya şarkısını temsil eden) veya Playlist sınıfı (şarkıların kavramsal bir grubunu temsil
eden) gibi açıkça tanımlanmış öğelerin kod temsilleridir.
• Görüntüleme nesnesi: Bunlar gerçekten ekranda görüntülenen nesnelerdir. Bu nesnelerin örnekleri arasında,
açılır liste veya durum gösterimi gibi kullanıcı arabirimi öğeleri, video oyunundaki yaratıklar gibi grafiksel
öğeler, vb. yer alır.
• Uygulama yapısı: Bu nesneler, uygulamalar tarafından gerçekleştirilen mantık veya işlemede çok sayıda
destekleyici rol oynar. Bunun örnekleri arasında, biyoloji simülasyonunda belirli hesaplamaları gerçekleştiren
bir nesne; müzik çalar uygulamasında kadran denetimi ile ses düzeyi gösterimi arasında değerlerin senkronize
edilmesinden sorumlu bir nesne; video oyunundaki kuralları yöneten bir nesne ya da çizim uygulamasında
kaydedilmiş bir resmi yükleyen bir nesne yer alır.
2 Sınıfın ihtiyaç duyacağı belirli işlevleri belirleyin. Farklı işlev türleri genellikle sınıfın yöntemleri olur.
3 Sınıf bir değer nesnesi görevi görecek şekilde tasarlanmışsa, örneklerin içereceği verileri belirleyin. Bu öğeler, iyi
özellik adaylarıdır.
4 Sınıfınız projeniz için özel olarak tasarlandığından, en önemli şey, uygulamanızın ihtiyaç duyduğu işlevselliği
sağlamaktır. Bu, bu soruları kendi başınıza yanıtlamanıza yardımcı olabilir:
• Uygulamanız hangi bilgileri saklayacak, izleyecek ve işleyecek? Bunun belirlenmesi, isteyebileceğiniz değer
nesnelerini ve özelliklerini tanımlamanıza yardımcı olur.
• Örneğin uygulama ilk yüklendiğinde, belirli bir düğme tıklatıldığında, filmin oynatılması durdurulduğunda, vb.
durumlarda hangi eylem kümelerinin gerçekleştirilmesi gerekecek? Bunlar iyi yöntem adaylarıdır (veya
"eylemler" yalnızca tek tek değerlerin değiştirilmesini içeriyorsa, özellik adaylarıdır).
• Belirli bir eylem söz konusu olduğunda, sınıfın o eylemi gerçekleştirmesi için hangi bilgileri bilmesi gerekir? Bu
bilgiler yöntemin parametresi olur.
• Uygulama işini yapmak için ilerledikçe, sınıfınızda, uygulamanızın diğer bölümlerinin de bilmesi gereken hangi
şeyler değişir? Bunlar iyi olay adaylarıdır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 28
ActionScript ile çalışmaya başlama
5 Eklemek istediğiniz bazı ek işlevlerin bulunmaması dışında, ihtiyaç duyduğunuz nesneye benzer bir nesne varsa,
bir alt sınıf (kendi işlevselliğinin tümünü tanımlamak yerine, varolan bir sınıfın işlevselliğine dayanan bir sınıf)
oluşturun. Örneğin, ekranda görsel nesne olacak bir sınıf oluşturmak istiyorsanız, varolan görüntüleme
nesnelerinden birinin (örn. Sprite veya MovieClip) davranışını sınıfınız için temel olarak kullanmak istersiniz. Bu
durumda, MovieClip (veya Sprite) temel sınıf olur ve sınıfınız bu sınıfı genişletir. Alt sınıf oluşturulmasıyla ilgili
daha fazla bilgi için, bkz. “Miras” sayfa 106.
Sınıf için kod yazma
Sınıfınız için bir tasarım planına sahip olduktan veya en azından sınıfın hangi bilgileri izlemesi gerekeceği ve hangi
eylemleri gerçekleştirmesi gerekeceği konusunda biraz fikir sahibi olduktan sonra, sınıf yazmanın gerçek sözdizimi
daha kolay ve anlaşılır olur.
Aşağıda, kendi ActionScript sınıfınızı oluşturmanız için minimum adımlar verilmiştir:
1 Dreamweaver gibi genel bir programlama aracında veya düz metin belgeleriyle çalışmanıza olanak sağlayan
herhangi bir programda, Flex Builder veya Flash gibi ActionScript'e özgü bir programda yeni bir belge açın.
2 Sınıfın adını tanımlamak için bir class deyimi girin. Bunu yapmak için, sırayla public class sözcüklerini,
ardından sınıfın adını ve sonra sınıfın içeriklerini (yöntem ve özellik tanımlarını) barındıran bir açma ve kapatma
küme ayraçlarını girin. Örneğin:
public class MyClass
{
}
public sözcüğü, sınıfa herhangi bir başka koddan erişilebildiğini belirtir. Diğer alternatifler için, bkz. “Erişim
denetimi ad alanı nitelikleri” sayfa 93.
3 Sınıfınızın bulunacağı paketin adını belirtmek için bir package deyimi yazın. Sözdizimi, sırayla package
sözcüğünü, ardından tam paket adını ve sonra açma ve kapatma küme ayraçlarını (class deyim bloğunu
kapsayan) içerir. Örneğin, bunu yapmak için önceki adımdaki kodu değiştiririz:
package mypackage
{
public class MyClass
{
}
}
4 Sınıf gövdesinin içinde var deyimini kullanarak sınıfta özelliklerin her birini tanımlayın; sözdizimi, herhangi bir
değişkeni bildirmek için kullandığınız sözdizimiyle aynıdır. (public değiştiricisi eklenir.) Örneğin, sınıf tanımının
açma ve kapatma küme ayraçlarının arasına bu satırlar eklendiğinde, textVariable, numericVariable ve
dateVariable adında özellikler oluşturulur:
public var textVariable:String = "some default value";
public var numericVariable:Number = 17;
public var dateVariable:Date;
5 İşlev tanımlamak için kullanılan aynı sözdizimini kullanarak sınıfta her bir yöntemi tanımlayın. Örneğin:
•
myMethod() yöntemi oluşturmak için şunu girin:
public function myMethod(param1:String, param2:Number):void
{
// do something with parameters
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 29
ActionScript ile çalışmaya başlama
• Yapıcı (sınıf örneği oluşturma işleminin bir parçası olarak çağrılan özel yöntem) oluşturmak için, adı sınıfın
adıyla tamamen eşleşen bir yöntem oluşturun:
public function MyClass()
{
// do stuff to set initial values for properties
// and otherwise set up the object
textVariable = "Hello there!";
dateVariable = new Date(2001, 5, 11);
}
Sınıfınıza bir yapıcı yöntemini dahil etmezseniz, derleyici sınıfınızda otomatik olarak boş bir yapıcı (herhangi
bir parametre ve deyim içermeyen) oluşturur.
Tanımlayabileceğiniz birkaç tane daha sınıf öğesi vardır. Bu öğeler daha karmaşıktır.
• Erişimciler, bir yöntem ile özellik arasında özel bir köprüdür. Sınıfı tanımlamak için kodu yazdığınızda, birden
çok eylem gerçekleştirebilmeniz için (bir özelliği tanımladığınızda tek yapabildiğiniz şey olan yalnızca bir değer
okuma veya atama yerine) erişimciyi bir yöntem gibi yazarsınız. Ancak sınıfınızın bir örneğini
oluşturduğunuzda, değeri okumak veya atamak için yalnızca adı kullanarak erişimciyi bir özellik gibi
değerlendirirsiniz. Daha fazla bilgi için, bkz. “Erişimci yöntemlerini alma ve ayarlama” sayfa 99.
• ActionScript'teki olaylar, belirli bir sözdizimi kullanılarak tanımlanmaz. Bunun yerine, olay dinleyicilerini
izlemek ve bunlara olayları bildirmek için EventDispatcher sınıfının işlevselliğini kullanarak sınıfınızda olayları
tanımlarsınız. Kendi sınıflarınızda olayların oluşturulmasıyla ilgili daha fazla bilgi için, bkz. “Olayları işleme”
sayfa 243.
Örnek: Temel bir uygulama oluşturma
Flash, Flex Builder, Dreamweaver veya herhangi bir metin düzenleyicisi kullanarak .as uzantısına sahip harici
ActionScript kaynak dosyaları oluşturabilirsiniz.
Flash geliştirme ve Flex Builder araçları da dahil olmak üzere, birçok uygulama geliştirme ortamında ActionScript 3.0
kullanılabilir.
Bu bölümde, Flash geliştirme aracı veya Flex Builder kullanılarak basit bir ActionScript 3.0 uygulamasının oluşturulup
geliştirilmesine yönelik adımlar açıklanmaktadır. Oluşturacağınız uygulama, Flash ve Flex uygulamalarında harici
ActionScript 3.0 sınıfı dosyalarının kullanılmasına yönelik basit bir desen sunar. Bu desen, bu kılavuzdaki diğer örnek
uygulamalarının tümü için geçerli olacaktır.
ActionScript uygulamanızı tasarlama
Uygulamayı oluşturmaya başlamadan önce, oluşturmak istediğiniz uygulama hakkında biraz fikir sahibi olmanız
gerekir.
Tasarımınızın temsili, uygulamanın adı ve uygulama amacının kısa bir ifadesi gibi basit olabileceği gibi, çok sayıda
Birleşik Modelleme Dili (UML) diyagramları içeren bir gereksinim kümesi belgeleri gibi karmaşık da olabilir. Bu
kılavuzda, yazılım tasarımı disiplinini ayrıntılı şekilde ele alınmaz ancak uygulama tasarımının, ActionScript
uygulamalarının geliştirilmesinde önemli bir adım olduğunun bilinmesi önemlidir.
Birinci ActionScript uygulaması örneğimiz, standart bir “Hello World” uygulaması olacaktır, bu nedenle tasarımı
oldukça kolaydır:
• Bu uygulamaya HelloWorld adı verilecektir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 30
ActionScript ile çalışmaya başlama
• Söz konusu uygulama, “Hello World!”sözcüklerini içeren tek bir metin alanını görüntüleyecektir.
• Kolayca yeniden kullanılması için, bir Flash belgesi veya Flex uygulaması içinden kullanılabilen Greeter adında tek
bir nesne tabanlı sınıfı kullanacaktır.
• Uygulamanın temel bir sürümünü oluşturduktan sonra, kullanıcının bir kullanıcı adı girmesini ve uygulamanın
bilinen kullanıcıların listesinde adı kontrol etmesini sağlamak için yeni işlevsellik eklersiniz.
Bu kısa tanımın yerinde olmasıyla, uygulamayı oluşturmaya başlayabilirsiniz.
HelloWorld projesini ve Greeter sınıfını oluşturma
Hello World uygulamasının tasarım deyimi, uygulama kodunun kolayca yeniden kullanılabilmesi gerektiğini belirtti.
Bu hedefi dikkate alarak uygulama, Flex Builder veya Flash geliştirme aracında oluşturduğunuz bir uygulamadan
kullanılan Greeter adında tek bir nesne tabanlı sınıfı kullanır.
Flash geliştirme aracında Greeter sınıfını oluşturmak için:
1 Flash geliştirme aracında, Dosya > Yeni seçeneklerini belirleyin.
2 Yeni Belge iletişim kutusunda ActionScript dosyasını seçip Tamam'ı tıklatın.
Yeni bir ActionScript düzenleme penceresi görüntülenir.
3 Dosya > Kaydet seçeneklerini belirleyin. Uygulamanızı içerecek bir klasörü seçin, ActionScript dosyasına
Greeter.as adını verin ve Tamam'ı tıklatın.
“Greeter sınıfına kod ekleme” sayfa 30 bölümünden devam edin.
Greeter sınıfına kod ekleme
Greeter sınıfı, HelloWorld uygulamanızda kullanabileceğiniz bir nesneyi (Greeter) tanımlar.
Greeter sınıfına kod eklemek için:
1 Aşağıdaki kodu yeni dosyaya yazın:
package
{
public class Greeter
{
public function sayHello():String
{
var greeting:String;
greeting = "Hello World!";
return greeting;
}
}
}
Greeter sınıfı, “Hello World!” dizesini döndüren tek bir sayHello() yöntemini içerir.
2 Bu ActionScript dosyasını kaydetmek için Dosya > Kaydet seçeneklerini belirleyin.
Greeter sınıfı şimdi bir uygulamada kullanılmaya hazırdır.
ActionScript kodunuzu kullanan bir uygulama oluşturma
Oluşturduğunuz Greeter sınıfı, kendiliğinden bulunan bir yazılım işlevleri kümesini tanımlar ancak tam bir
uygulamayı temsil etmez. Sınıfı kullanmak için, bir Flash belgesi veya Flex uygulaması oluşturmanız gerekir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 31
ActionScript ile çalışmaya başlama
HelloWorld uygulaması, Greeter sınıfının yeni bir örneğini oluşturur. Greeter sınıfını uygulamanıza şu şekilde
ekleyebilirsiniz.
Flash geliştirme aracını kullanarak bir ActionScript uygulaması oluşturmak için:
1 Dosya > Yeni seçeneklerini belirleyin.
2 Yeni Belge iletişim kutusunda Flash Belgesi seçeneğini belirleyip Tamam'ı tıklatın.
Yeni bir Flash penceresi görüntülenir.
3 Dosya > Kaydet seçeneklerini belirleyin. Greeter.as sınıf dosyasını içeren aynı klasörü seçin, Flash belgesine
HelloWorld.fla adını verin ve Tamam'ı tıklatın.
4 Flash Araçları paletinde, Metin aracını seçin ve yaklaşık 300 piksel genişliğinde ve 100 piksel yüksekliğinde yeni bir
metin alanını tanımlamak için Sahne Alanı üzerinde Metin aracını sürükleyin.
5 Özellikler panelinde, metin alanı halen Sahne Alanı'nda seçili durumdayken, metin türünü“Dinamik Metin” olarak
ayarlayın ve metin alanının örnek adı olarak mainText yazın.
6 Ana zaman çizelgesinin birinci karesini tıklatın.
7 Eylemler paneline şu komut dosyasını yazın:
var myGreeter:Greeter = new Greeter();
mainText.text = myGreeter.sayHello();
8 Dosyayı kaydedin.
“ActionScript uygulamanızı yayınlama ve test etme” sayfa 31 bölümünden devam edin.
ActionScript uygulamanızı yayınlama ve test etme
Yazılım geliştirme yinelemeli bir işlemdir Kod yazarsınız, yazdığınız kodları derlersiniz ve düzgün şekilde
derleninceye kadar kodu düzenlersiniz. Derlenen uygulamayı çalıştırırsınız, tasarlanan amacını yerine getirip
getirmediğini görmek için uygulamayı test edersiniz ve amacını yerine getirmiyorsa, amacını yerine getirinceye kadar
kodu düzenlersiniz. Flash ve Flex Builder geliştirme ortamları, uygulamalarınızın yayınlanması, test edilmesi ve
hatalarının ayıklanması için birçok yol sunar.
Her bir ortamda HelloWorld uygulamasının test edilmesine yönelik temel adımlar şunlardır.
Flash geliştirme aracını kullanarak bir ActionScript uygulamasını yayınlamak ve test etmek için:
1 Uygulamanızı yayınlayın ve derleme hatası olup olmadığına bakın. Flash geliştirme aracında, ActionScript
kodunuzu derlemek ve HelloWorld uygulamasını çalıştırmak için, Kontrol Et > Filmi Test Et seçeneklerini
belirleyin.
2 Uygulamanızı test ederken, Çıktı penceresinde herhangi bir hata veya uyarı görüntülenirse, HelloWorld.fla ya da
HelloWorld.as dosyalarında bu hataların nedenlerini giderip uygulamayı yeniden test etmeyi deneyin.
3 Herhangi bir derleme hatası yoksa, Hello World uygulamasını gösteren bir Flash Player penceresi görüntülenir.
Şimdi ActionScript 3.0'ı kullanan basit ancak tam bir nesne tabanlı uygulama oluşturdunuz. “HelloWorld
uygulamasını geliştirme” sayfa 31 bölümünden devam edin.
HelloWorld uygulamasını geliştirme
Uygulamayı daha ilgi çekici hale getirmek için şimdi uygulamanın bir kullanıcı adı istemesini ve bu kullanıcı adını
önceden tanımlı bir adlar listesine göre doğrulamasını sağlayacaksınız.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 32
ActionScript ile çalışmaya başlama
İlk olarak, yeni işlevselliği eklemek için Greeter sınıfını güncelleyeceksiniz. Ardından yeni işlevselliği kullanmak için
uygulamayı güncelleyeceksiniz.
Greeter.as dosyasını güncellemek için:
1 Greeter.as dosyasını açın.
2 Dosyanın içeriklerini şunlarla değiştirin (yeni ve değiştirilen satırlar kalın yazı tipiyle gösterilmektedir):
package
{
public class Greeter
{
/**
* Defines the names that should receive a proper greeting.
*/
public static var validNames:Array = ["Sammy", "Frank", "Dean"];
/**
* Builds a greeting string using the given name.
*/
public function sayHello(userName:String = ""):String
{
var greeting:String;
if (userName == "")
{
greeting = "Hello. Please type your user name, and then press
the Enter key.";
}
else if (validName(userName))
{
greeting = "Hello, " + userName + ".";
}
else
{
greeting = "Sorry " + userName + ", you are not on the list.";
}
return greeting;
}
/**
* Checks whether a name is in the validNames list.
*/
public static function validName(inputName:String = ""):Boolean
{
if (validNames.indexOf(inputName) > -1)
{
return true;
}
else
{
return false;
}
}
}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 33
ActionScript ile çalışmaya başlama
Greeter sınıfı şimdi birkaç yeni özelliğe sahiptir:
•
validNames dizisi geçerli kullanıcı adlarını listeler. Greeter sınıfı yüklendiğinde bu dizi üç addan oluşan bir liste
şeklinde başlatılır.
•
sayHello() yöntemi şimdi bir kullanıcı adını kabul eder ve bazı koşulları esas alarak selamlamayı değiştirir.
userName boş bir dize ("") olursa, greeting özelliği, kullanıcıdan bir ad isteyecek şekilde ayarlanır. Kullanıcı adı
geçerliyse, selamlama şöyle olur: "Hello, userName." Son olarak, bu iki koşuldan herhangi biri karşılanmazsa,
greeting değişkeni "Sorry userName, you are not on the list." olarak ayarlanır.
•
inputName öğesi validNames dizisinde bulunuyorsa, validName() yöntemi true değerini döndürür,
bulunmuyorsa, false değerini döndürür. validNames.indexOf(inputName) deyimi, validNames dizisindeki
dizelerin her birini inputName dizesinde kontrol eder. Array.indexOf() yöntemi, dizideki bir nesnenin birinci
örneğinin dizin konumunu döndürür veya nesne dizide bulunmazsa -1 değerini döndürür.
Daha sonra bu ActionScript sınıfına başvuran Flash veya Flex dosyasını düzenleyeceksiniz.
Flash geliştirme aracını kullanarak uygulamayı değiştirmek için:
1 HelloWorld.fla dosyasını açın.
2 Greeter sınıfının sayHello() yöntemine boş bir dize ("") iletilecek şekilde Kare 1'de komut dosyasını değiştirin:
var myGreeter:Greeter = new Greeter();
mainText.text = myGreeter.sayHello("");
3 Araçlar paletinde Metin aracını seçin ve Sahne Alanı'nda, varolan mainText metin alanının doğrudan altında yan
yana iki yeni metin alanı oluşturun.
4 Birinci yeni metin alanına, etiket görevi görecek Kullanıcı Adı: metnini yazın.
5 Diğer yeni metin alanını seçin ve Özellik denetçisinde metin alanı türü olarak InputText seçeneğini belirleyin. Satır
türü olarak Tek satır seçin. Örnek adı olarak textIn yazın.
6 Ana zaman çizelgesinin birinci karesini tıklatın.
7 Eylemler panelinde, varolan komut dosyasının sonuna şu satırları ekleyin:
mainText.border = true;
textIn.border = true;
textIn.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
function keyPressed(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.ENTER)
{
mainText.text = myGreeter.sayHello(textIn.text);
}
}
Yeni kod şu işlevselliği ekler:
• İlk iki satır, iki metin alanının kenarlıklarını tanımlar.
•
textIn alanı gibi bir girdi metni alanı, gönderebileceği olayların bir kümesini içerir. addEventListener()
yöntemi, bir olay türü gerçekleştiğinde çalıştırılan bir işlevi tanımlamanıza olanak sağlar. Bu durumda, söz
konusu olay klavyedeki bir tuşa basılmasıdır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 34
ActionScript ile çalışmaya başlama
•
keyPressed() özel işlevi, basılan tuşun Enter tuşu olup olmadığını kontrol eder. Basılan tuş Enter ise,
myGreeter nesnesinin sayHello() yöntemini çağırarak textIn metin alanındaki metni parametre olarak
iletir. Bu yöntem, iletilen değeri esas alarak bir selamlama dizesi döndürür. Döndürülen dize daha sonra
mainText metin alanının text özelliğine atanır.
Kare 1'in tam komut dosyası şudur:
var myGreeter:Greeter = new Greeter();
mainText.text = myGreeter.sayHello("");
mainText.border = true;
textIn.border = true;
textIn.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
function keyPressed(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.ENTER)
{
mainText.text = myGreeter.sayHello(textIn.text);
}
}
8 Dosyayı kaydedin.
9 Uygulamayı çalıştırmak için Kontrol Et > Filmi Test Et seçeneklerini belirleyin.
Uygulamayı çalıştırdığınızda, bir kullanıcı adı girmeniz istenecektir. Kullanıcı adı geçerliyse (Sami, Ferdi veya
Deniz), uygulama "hello" onaylama mesajını görüntüler.
Sonraki örnekleri çalıştırma
“Hello World” ActionScript 3.0 uygulamasını geliştirip çalıştırdığınıza göre, bu kılavuzda sunulan diğer kod
örneklerini çalıştırmak için ihtiyacınız olan temel bilgiye sahip olmuş olmanız gerekir.
Bölüm içi örnek kod listelerini test etme
Bu kılavuz üzerinde çalıştıkça, çeşitli konuları göstermek için kullanılan örnek kod listelerini denemek isteyebilirsiniz.
Test işlemi, programdaki belirli noktalarda değişkenlerin değerinin görüntülenmesini veya ekran içeriklerinin
görüntülenmesini ya da bu içeriklerle etkileşim kurulmasını içerebilir. Görsel içeriğin veya etkileşimin test edilmesi
için, gerekli öğeler kod listelerinin öncesinde veya içinde açıklanacaktır—yalnızca kodu test etmek için açıklandığı gibi
öğeleri içeren bir belge oluşturmanız gerekecektir. Programda belirli bir noktada değişkenin değerini görüntülemek
istemeniz durumunda, bunu gerçekleştirebilmenizin birkaç yolu vardır. Bunlardan biri, Flex Builder ve Flash
uygulamasında yerleşik bulunanlar gibi bir hata ayıklayıcısı kullanmaktır. Basit test işlemi içinse, değişken değerlerini
görebileceğiniz bir yere yazdırmanız en kolay yöntem olabilir.
Aşağıdaki adımlar, bir kod listesini test etmek ve değişken değerlerini görüntülemek için kullanabileceğiniz bir Flash
dosyası oluşturmanıza yardımcı olacaktır:
Bölüm içi örnekleri test etmek üzere bir Flash belgesi oluşturmak için:
1 Yeni bir Flash belgesi oluşturun ve bu belgeyi sabit sürücünüze kaydedin.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 35
ActionScript ile çalışmaya başlama
2 Test değerlerini Sahne Alanı'ndaki bir metin alanında görüntülemek için, Metin aracını etkinleştirin ve Sahne
Alanı'nda yeni bir Dinamik metin alanı oluşturun. Satır türü Çok Satırlı olarak ayarlanmış ve kenarlığı
etkinleştirilmiş geniş ve uzun bir metin alanı en kullanışlısı olacaktır. Özellik denetçisinde metin alanına bir örnek
adı (örneğin, “outputText”) verin. Metin alanına değerler yazmak için, örnek koduna (aşağıda açıklanmaktadır)
appendText() yöntemini çağıran kodu eklersiniz.
3 Alternatif olarak, örneğin sonuçlarını görüntülemek için, kod listesine (aşağıda açıklandığı gibi) bir trace() işlev
çağrısı ekleyebilirsiniz.
4 Belirli bir örneği test etmek için, kod listesini Eylemler paneline kopyalayın; gerekirse trace() işlevini ekleyin veya
appendText() yöntemini kullanarak metin alanına bir değer ekleyin.
5 Bir SWF dosyası oluşturup sonuçları görüntülemek için ana menüden, Kontrol Et > Filmi Test Et seçeneklerini
belirleyin.
Bu yaklaşım değişkenlerin değerlerini görüntülemeye yönelik olduğundan, örnekleri denerken değişkenlerin
değerlerini kolayca görüntüleyebilmenizin iki yolu vardır: Sahne Alanı'nda bir metin alanı örneğine değerleri yazma
veya Çıktı panelinde·değerleri·yazdırmak·için·trace() işlevini kullanma.
•
trace() işlevi: ActionScript trace() işlevi, kendisine iletilen herhangi bir parametre değerini (değişken veya
değişmez ifade) Çıktı paneline yazar. Bu kılavuzdaki örnek listelerin çoğu, bir trace() işlev çağrısı içerir,
dolayısıyla bu listeler için yalnızca kodu belgenize kopyalamanız ve projeyi test etmeniz gerekir. Henüz değişkenin
değerinin içinde bulunmadığı bir kod listesinde bir değişkenin değerini test etmek için trace() öğesini kullanmak
isterseniz, kod listesine bir trace() çağrısı ekleyip değişkeni bir parametre olarak iletin. Örneğin, bu bölümdeki
gibi bir kod listesiyle karşılaştıysanız,
var albumName:String = "Three for the money";
kodu Eylemler paneline kopyalayıp daha sonra kod listesinin sonucunu test etmek için bunun gibi bir trace()
işlevine çağrı ekleyebilirsiniz:
var albumName:String = "Three for the money";
trace("albumName =", albumName);
Programı çalıştırdığınızda bu satır yazdırılır:
albumName = Three for the money
Her trace() işlev çağrısı, tamamı yazdırılmış tek bir satır olarak birleştirilmiş birden çok parametreyi alabilir. Her
trace() işlev çağrısının sonuna bir satır kesmesi eklenir, böylece ayrı trace() çağrıları ayrı satırlarda yazdırılır.
• Sahne Alanı'ndaki bir metin alanı: trace() işlevini kullanmamayı tercih ediyorsanız, Metin aracını kullanarak
Sahne Alanı'na bir Dinamik metin alanı ekleyebilir ve kod listesinin sonuçlarını görüntülemek için bu metin
alanına değerleri yazabilirsiniz. Metin alanının içeriklerinin sonuna bir String değeri eklemek için, TextField
sınıfının appendText() yöntemi kullanılabilir. ActionScript kullanarak metin alanına erişmek için, Özellik
denetçisinde metin alanına bir örnek adı vermeniz gerekir. Örneğin, metin alanınız outputText örnek adına
sahipse, albumName değişkeninin değerini kontrol etmek için şu kod kullanılabilir:
var albumName:String = "Three for the money";
outputText.appendText("albumName = ");
outputText.appendText(albumName);
Bu kod, outputText adındaki metin alanına şu metni yazar:
albumName = Three for the money
Örnekte de gösterildiği gibi, appendText() yöntemi, metni önceki içeriklerle aynı satıra ekler, böylece birden çok
appendText() çağrısı kullanılarak aynı metin satırına birden çok değer eklenebilir. Metni sonraki satıra zorlamak
için, yeni satır karakteri ("\n") ekleyebilirsiniz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 36
ActionScript ile çalışmaya başlama
outputText.appendText("\n"); // adds a line break to the text field
trace() işlevinden farklı olarak appendText() yöntemi, yalnızca tek bir değeri parametre olarak kabul eder. Bu
değerin bir dize (bir String örneği veya değişmez bir dize) olması gerekir. Dize olmayan bir değişkenin değerini
yazdırmak için öncelikle değeri bir String öğesine dönüştürmeniz gerekir. Bunu yapmanın en kolay yolu, nesnenin
toString() yönteminin çağrılmasıdır:
var albumYear:int = 1999;
outputText.appendText("albumYear = ");
outputText.appendText(albumYear.toString());
Bölüm sonu örnekleriyle çalışma
Bu bölümde olduğu gibi, bu kılavuzda bulunan çoğu bölümde, bölümde ele alınan kavramların bir çoğunu birbirine
bağlayan önemli bir bölüm sonu örneği yer alır. Ancak bu bölümdeki Hello World örneğinden farklı olarak, bu
örnekler adım adım öğretici formatında sunulmamaktadır. Her örnekte ilgili ActionScript 3.0 kodu vurgulanıp ele
alınmakta ancak belirli geliştirme ortamlarında örneklerin çalıştırılmasıyla ilgili talimatlar sağlanmamaktadır. Ne var
ki, bu kılavuzla birlikte verilen örnek dosyalar, seçtiğiniz geliştirme ortamında kolayca örnekleri derleyip çalıştırmanız
için ihtiyaç duyduğunuz tüm dosyaları içermektedir.
37
Bölüm 4: ActionScript dili ve sözdizimi
ActionScript 3.0, hem ActionScript dilini hem de Adobe Flash Player Uygulaması Programlama Arabirimi'ni (API)
içerir. Çekirdek dil, ActionScript'in dil sözdizimini ve üst düzey veri türlerini tanımlayan bölümüdür. ActionScript 3.0,
Flash Player'a programlama yoluyla erişilmesini sağlar.
Bu bölümde, çekirdek ActionScript dili ve sözdizimine giriş sağlanmıştır. Bu bölümü okuduktan sonra, veri türleri ve
değişkenlerle nasıl çalışıldığı, düzgün sözdiziminin nasıl kullanıldığı ve programınızda veri akışının nasıl denetlendiği
konusunda temel bilgi sahibi olacaksınız.
Dile genel bakış
ActionScript 3.0 dilinin temelini nesneler oluşturur, bunlar temel bina bloklarıdır. Bildirdiğiniz her değişken,
yazdığınız her işlev ve oluşturduğunuz her sınıf örneği bir nesnedir. ActionScript 3.0 programını, görevleri
gerçekleştiren, olayları yanıtlayan ve birbiriyle iletişim kuran bir nesne grubu olarak düşünebilirsiniz.
Java veya C++ uygulamasında nesne tabanlı programlamayı (OOP) bilen programcılar, nesneleri, iki tür üye içeren
modüller olarak düşünebilir: üye değişkenlerde veya özelliklerde saklanan veriler ve yöntemler üzerinden erişilebilir
davranış. ActionScript 3.0, nesneleri benzer ancak biraz daha farklı bir şekilde tanımlar. ActionScript 3.0'da nesneler
yalnızca özellikler koleksiyonudur. Bu özellikler, yalnızca verileri değil aynı zamanda işlevleri veya diğer nesneleri de
içeren konteynerlerdir. Bir işlev bir nesneye bu şekilde eklenirse, buna yöntem denir.
ActionScript 3.0 tanımı, Java veya C++ arka planına sahip programcılar için biraz garip görünse de, uygulamada,
ActionScript 3.0 sınıflarıyla nesne türlerinin tanımlanması, Java ya da C++ uygulamalarında sınıfların
tanımlanmasına çok benzer. ActionScript nesne modeli ile diğer gelişmiş konular ele alınırken, iki nesne tanımı
arasındaki fark önemlidir ancak diğer durumların çoğunda, özellikler terimi, yöntemlerin tersine, sınıf üyesi
değişkenler anlamına gelir. Örneğin, ActionScript 3.0 Dil ve Bileşenler Başvurusu, değişkenleri veya alıcı ayarlayıcı
özelliklerini ifade etmek için özellikler terimini kullanır. Bir sınıfın parçası olan işlevleri ifade etmek için yöntemler
terimini kullanır.
ActionScript'teki sınıflar ile Java veya C++ uygulamalarındaki sınıflar arasındaki bir fark, ActionScript'te sınıfların
yalnızca soyut varlıklar olmamasıdır. ActionScript sınıfları, sınıfın özelliklerini ve yöntemlerini saklayan sınıf nesneleri
ile temsil edilir. Bu da, bir sınıfın veya paketin üst düzeyine deyimler ya da çalıştırılabilir kod dahil etmek gibi Java ve
C++ programcılarına yabancı görünebilecek tekniklere olanak sağlar.
ActionScript sınıfları ile Java veya C++ sınıfları arasındaki diğer bir fark, her ActionScript sınıfında prototipnesnesi
adında bir şeyin olmasıdır. Önceki ActionScript sürümlerinde, prototip zincirleri içinde bağlanan prototip nesneleri,
topluca tüm sınıf mirası hiyerarşisinin temeli görevini görürdü. ActionScript 3.0'da ise prototip nesneleri miras
sisteminde yalnızca küçük bir rol oynar. Ancak bir özelliği ve o özelliğin değerini bir sınıfın tüm örnekleri arasında
paylaşmak istiyorsanız, prototip nesnesi, statik özellik ve yöntemler için alternatif olarak yine kullanışlı olabilir.
Geçmişte, ileri düzey ActionScript programcıları, özel yerleşik dil öğeleriyle prototip zincirini doğrudan işleyebilirdi.
Şimdi dil, sınıf tabanlı programlama arabiriminin daha olgun bir uygulamasını sağladığından, __proto__ ve
__resolve gibi bu özel dil öğelerinin çoğu, artık dilin bir parçası değildir. Üstelik, Flash Player ve Adobe AIR
uygulamasının performansında önemli ölçüde artış sağlayacak şekilde dahili miras mekanizmalarının
eniyileştirilmesi, miras mekanizmasına doğrudan erişilmesini önler.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 38
ActionScript dili ve sözdizimi
Nesneler ve sınıflar
ActionScript 3.0'da, her nesne bir sınıf tarafından tanımlanır. Sınıf, bir nesne türünün şablonu veya şeması olarak
düşünülebilir. Sınıf tanımları, sınıfa bağlı davranışı kapsayan işlevler niteliğindeki veri değerlerini ve yöntemlerini
barındıran değişkenleri ve sabitleri içerebilir. Özelliklerde saklanan değerler, ilkel değerler veya başka nesneler olabilir.
İlkel değerler, sayılar, dizeler veya Boolean değerleridir.
ActionScript, çekirdek dilin parçası olan birçok yerleşik sınıfı içerir. Number, Boolean ve String gibi bu yerleşik
sınıflardan bazıları, ActionScript'te kullanılabilir olan ilkel değerleri temsil eder. Array, Math ve XML sınıfları gibi
diğer sınıflar daha karmaşık nesneleri tanımlar.
Yerleşik veya kullanıcı tanımlı tüm sınıflar, Object sınıfından türetilir. Önceki ActionScript sürümlerinde deneyimli
programcılar için, diğer tüm sınıflar Object veri türünden türetilse de, Object veri türünün artık varsayılan veri türü
olmadığının unutulmaması önemlidir. ActionScript 2.0'da, tür ek açıklamasının olmaması değişkenin Object türünde
olduğu anlamına geldiğinden, şu iki kod satırı eşdeğerdir:
var someObj:Object;
var someObj;
Ancak ActionScript 3.0, şu iki yöntemle belirlenebilen türlenmemiş değişken kavramını getirmiştir:
var someObj:*;
var someObj;
Türlenmemiş bir değişken, Object türünde bir değişkenle aynı değildir. Önemli olan fark, Object türündeki bir
değişken undefined özel değerini barındıramazken, türlenmemiş değişkenlerin bu değeri barındırabilmesidir.
class anahtar sözcüğünü kullanarak kendi sınıflarınızı tanımlayabilirsiniz. Sınıf özelliklerini üç şekilde
bildirebilirsiniz: bir yöntem bildiriminde const anahtar sözcüğüyle sabitler tanımlanabilir, var anahtar sözcüğüyle
değişkenler tanımlanabilir ve get ve set nitelikleriyle alıcı ve ayarlayıcı özellikleri tanımlanır. function anahtar
sözcüğüyle yöntemler bildirebilirsiniz.
new operatörünü kullanarak bir sınıfın örneğini oluşturursunuz. Aşağıdaki örnek, myBirthday adında bir Date sınıfı
örneğini oluşturur.
var myBirthday:Date = new Date();
Paketler ve ad alanları
Paketler ve ad alanları ilişkili kavramlardır. Paketler, kod paylaşımını kolaylaştıracak ve adlandırma çakışmalarını en
düşük düzeye indirecek şekilde sınıf tanımlarını bir arada paketlemenize olanak sağlar. Ad alanları, özellik ve yöntem
adları gibi tanımlayıcıların görünürlüğünü denetlemenize olanak sağlar ve bir paketin içinde veya dışında da kalsa,
koda uygulanabilir. Paketler, sınıf dosyalarınızı organize etmenize olanak sağlarken, ad alanları, tek tek özelliklerin ve
yöntemlerin görünürlüğünü yönetmenizi sağlar.
Paketler
ActionScript 3.0'daki paketler, ad alanları ile uygulanır ancak bunlarla eşanlamlı değildir. Bir paket bildirdiğinizde,
derleme zamanında bilinmesi garantilenen özel bir ad alanı türünü açıkça oluşturursunuz. Ad alanları açıkça
oluşturulduğunda derleme zamanında mutlaka bilinmek zorunda değildir.
Aşağıdaki örnek, tek bir sınıf içeren basit bir paket oluşturmak için package direktifini kullanır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 39
ActionScript dili ve sözdizimi
package samples
{
public class SampleCode
{
public var sampleGreeting:String;
public function sampleFunction()
{
trace(sampleGreeting + " from sampleFunction()");
}
}
}
Bu örnekteki sınıfın adı SampleCode'dur. Sınıf, samples paketinin içinde olduğundan, derleyici otomatik olarak
derleme zamanında sınıf adını samples.SampleCode tam nitelendirilmiş adıyla niteler. Derleyici de, sampleGreeting
ve sampleFunction() öğeleri sırayla samples.SampleCode.sampleGreeting ve
samples.SampleCode.sampleFunction() olacak şekilde özelliklerin veya yöntemlerin adlarını niteler.
Geliştiricilerin çoğu, özellikle de Java programlama arka planına sahip olanlar, bir paketin üst düzeyine yalnızca
sınıfları yerleştirmeyi seçebilir. Ancak ActionScript 3.0, bir paketin üst düzeyinde yalnızca sınıfları değil, değişkenleri,
işlevleri ve deyimleri de destekler. Bu özelliğin gelişmiş bir kullanımı, bir paketin üst düzeyinde bir ad alanını,
paketteki tüm sınıflar için kullanılabilir olacak şekilde tanımlamaktır. Ancak bir paketin üst düzeyinde public ve
internal olmak üzere iki erişim belirticisine de izin verildiğini unutmayın. Yuvalanmış sınıfları özel olarak
bildirmenize olanak sağlayan Java'dan farklı olarak ActionScript 3.0, yuvalanmış veya özel sınıfları desteklemez.
Ancak ActionScript 3.0 paketleri, diğer birçok yönden Java programlama dilindeki paketlere benzer. Önceki örnekte
görebildiğiniz gibi, tam nitelendirilmiş paket başvuruları, tıpkı Java'daki gibi nokta operatörü (.) kullanılarak ifade
edilir. Kodunuzu diğer programcıların da kullanması için sezgisel bir hiyerarşik yapıda organize etmek üzere paketleri
kullanabilirsiniz. Bu, kod paylaşımını kolaylaştırır ve böylece kendi paketinizi oluşturup başkalarıyla paylaşmanıza ve
başkaları tarafından oluşturulan paketleri kodunuzda kullanmanıza olanak sağlar.
Ayrıca, paketlerin kullanılması, kullandığınız tanımlayıcı adlarının benzersiz olmasının ve diğer tanımlayıcı adlarıyla
çakışmamasının sağlanmasına yardımcı olur. Aslında bazılarına göre, paketlerin birincil avantajı budur. Örneğin,
kodlarını birbiriyle paylaşmak isteyen iki programcı da, SampleCode adında bir sınıf oluşturabilir. Paketler olmadan
bu bir ad çakışması oluşturur ve bunun tek çözümü sınıflardan birinin yeniden adlandırılmasıdır. Ancak paketler
sayesinde, paketlerdeki sınıflardan biri veya tercihen ikisi benzersiz adlarla yerleştirilerek ad çakışması kolayca önlenir.
Yuvalanmış paketler oluşturmak için paket adınıza gömülü noktalar da dahil edebilirsiniz. Bu, paketlerin hiyerarşik
organizasyonunu oluşturmanıza olanak sağlar. Buna iyi bir örnek, ActionScript 3.0 tarafından sağlanan flash.xml
paketidir. flash.xml paketi, flash paketinin içinde yuvalanmıştır.
flash.xml paketi, önceki ActionScript sürümlerinde kullanılan eski XML ayrıştırıcısını içerir. Bunun şimdi flash.xml
paketinde kalmasının nedenlerinden biri, eski XML sınıfının adının, ActionScript 3.0'da kullanılabilir olan
ECMAScript için XML (E4X) belirtimi işlevselliğini uygulayan yeni XML sınıfının adıyla çakışmasıdır.
Eski XML sınıfının bir pakete taşınması iyi bir birinci adım olsa da, eski XML sınıflarının kullanıcılarının çoğu
flash.xml paketini içe aktarır ve bu da eski XML sınıfının tam nitelendirilmiş adını (flash.xml.XML) kullanmayı her
zaman hatırlamazsanız aynı ad çakışmasını oluşturur. Bu durumu önlemek için şimdi aşağıdaki örnekte gösterildiği
gibi, eski XML sınıfı XMLDocument olarak adlandırılmıştır:
package flash.xml
{
class XMLDocument {}
class XMLNode {}
class XMLSocket {}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 40
ActionScript dili ve sözdizimi
ActionScript 3.0'ın çoğu, flash paketi altında organize edilir. Örneğin, flash.display paketi, görüntüleme listesi API'sini
içerirken, flash.events paketi de yeni olay modelini içerir.
Paketler oluşturma
ActionScript 3.0, paketlerinizi, sınıflarınızı ve kaynak dosyalarınızı organize etme şeklinizde önemli ölçüde esneklik
sağlar. Önceki ActionScript sürümleri, her kaynak dosyası için yalnızca bir sınıfa izin verirdi ve kaynak dosyasının
adının, sınıfın adıyla eşleşmesini gerektirirdi. ActionScript 3.0, tek bir kaynak dosyasına birden çok sınıf dahil
etmenize olanak sağlar ancak her dosyadaki yalnızca bir sınıf o dosyaya harici olan kod için kullanılabilir duruma
getirilebilir. Başka bir deyişle, her dosyadaki yalnızca bir sınıf, paket bildiriminde bildirilebilir. Ek sınıfları paket
tanımınızın dışında bildirmeniz gerekir ve böylece bu sınıflar, o kaynak dosyasının dışındaki kod için görünmez olur.
Paket tanımının içinde bildirilen sınıfın adı, kaynak dosyasının adıyla eşleşmelidir.
ActionScript 3.0, ayrıca paketleri bildirme şeklinizde de daha fazla esneklik sağlar. Önceki ActionScript sürümlerinde,
paketler yalnızca kaynak dosyalarını yerleştirdiğiniz dizinleri temsil ederdi ve siz package deyimiyle paketleri
bildirmez, bunun yerine sınıf bildiriminize tam nitelendirilmiş sınıf adının parçası olarak paket adını dahil ederdiniz.
Paketler halen ActionScript 3.0'da dizinleri temsil etmeye devam etse de, yalnızca sınıfları değil, daha fazlasını da
içerebilir. ActionScript 3.0'da, bir paketi bildirmek için package deyimini kullanırsınız, başka bir deyişle, bir paketin
üst düzeyinde değişkenleri, işlevleri ve ad alanlarını da bildirebilirsiniz. Paketin üst düzeyine çalıştırılabilir deyimler
de dahil edebilirsiniz. Bir paketin üst düzeyinde değişkenler, işlevler veya ad alanları bildirirseniz, o düzeyde
kullanılabilir olan nitelikler yalnızca public ve internal olur ve bildirim bir sınıf, değişken, işlev ya da ad alanı olsa
da, her dosya için yalnızca bir paket düzeyi bildirimi, public niteliğini kullanabilir.
Paketler, kodunuzun organize edilmesinde ve ad çakışmalarının önlenmesinde kullanışlıdır. Paket kavramlarını, ilgili
olmayan sınıf mirası kavramıyla karıştırmamalısınız. Aynı pakette kalan iki sınıf ortak bir ad alanına sahip olur ancak
bu iki sınıfın mutlaka herhangi bir şekilde birbiriyle ilgili olması gerekmez. Aynı şekilde, yuvalanmış bir paketin, üst
paketiyle herhangi bir anlamsal ilişkisi olmayabilir.
Paketleri içe aktarma
Bir paketin içindeki sınıfı kullanmak istiyorsanız, paketi veya belirli sınıfı içe aktarmanız gerekir. Bu, sınıfların içe
aktarılmasının isteğe bağlı olduğu ActionScript 2.0'dan farklılık gösterir.
Örneğini bu bölümün başlarındaki SampleCode sınıfı örneğini göz önünde bulundurun. Sınıf, samples adında bir
pakette kalıyorsa, SampleCode sınıfını kullanmadan önce aşağıdaki içe aktarma deyimlerinden birini kullanmanız
gerekir:
import samples.*;
veya
import samples.SampleCode;
Genelde, import deyimleri olabildiğince belirli olmalıdır. samplespaketinden yalnızca SampleCode sınıfını
kullanmayı planlıyorsanız, sınıfın ait olduğu paketin tamamını değil, yalnızca SampleCode sınıfını içe aktarmanız
gerekir. Paketin tamamının içe aktarılması, beklenmeyen ad çakışmalarına yol açabilir.
Sınıf yolunuzun içine, paketi veya sınıfı tanımlayan kaynak kodunu da yerleştirmeniz gerekir. Sınıf yolu, derleyicinin
içe aktarılan paketleri ve sınıfları nerede arayacağını belirleyen yerel dizin yollarının kullanıcı tanımlı bir listesidir.
Sınıf yolu bazen oluşturma yolu veya kaynak yolu olarak da adlandırılır.
Sınıfı veya paketi düzgün şekilde içe aktardıktan sonra, sınıfın tam nitelendirilmiş adını (samples.SampleCode) veya
yalnızca sınıf adını (SampleCode) kullanabilirsiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 41
ActionScript dili ve sözdizimi
Tam nitelendirilmiş adlar, aynı ada sahip sınıflar, yöntemler veya özellikler belirsiz koda neden olduğunda
kullanışlıdır ancak tüm tanımlayıcılar için kullanıldığında yönetimleri zor olabilir. Örneğin, bir SampleCode sınıf
örneğini başlattığınızda, tam nitelendirilmiş ad kullanılması, ayrıntılı bir kod verir:
var mySample:samples.SampleCode = new samples.SampleCode();
Yuvalanmış paketlerin düzeyleri arttıkça, kodunuzun okunabilirliği de azalır. Belirsiz tanımlayıcıların sorun
yaratmayacağından emin olduğunuz durumlarda basit tanımlayıcıları kullanarak kodunuzun okunmasını
kolaylaştırabilirsiniz. Örneğin, yeni bir SampleCode sınıf örneğinin başlatılması, yalnızca sınıf tanımlayıcısının
kullanılmasına göre daha az ayrıntılıdır.
var mySample:SampleCode = new SampleCode();
Önce uygun paketi veya sınıfı içe aktarmadan tanımlayıcı adlarını kullanmayı denerseniz, derleyici sınıf tanımlarını
bulamaz. Diğer yandan, paketi veya sınıfı içe aktarırsanız, içe aktarılmış bir adla çakışan bir adı tanımlama girişiminde
bulunulduğunda bir hata oluşur.
Bir paket oluşturulduğunda, o paketin tüm üyeleri için varsayılan erişim belirticisi internal olur, başka bir deyişle,
varsayılan olarak paket üyeleri yalnızca o paketin diğer üyelerine görünür. Bir sınıfın, paket dışındaki kod için
kullanılabilir olmasını istiyorsanız, o sınıfın public olduğunu bildirmeniz gerekir. Örneğin, aşağıdaki paket iki sınıf
içerir: SampleCode ve CodeFormatter:
// SampleCode.as file
package samples
{
public class SampleCode {}
}
// CodeFormatter.as file
package samples
{
class CodeFormatter {}
}
SampleCode sınıfı, public sınıfı olarak bildirildiğinden, paket dışında da görünebilir. CodeFormatter sınıfı ise
yalnızca samples paketinin içinde görünebilir. CodeFormatter sınıfına samples paketinin dışında erişmeye çalışırsanız,
aşağıdaki örnekte gösterildiği gibi bir hata oluşturursunuz:
import samples.SampleCode;
import samples.CodeFormatter;
var mySample:SampleCode = new SampleCode(); // okay, public class
var myFormatter:CodeFormatter = new CodeFormatter(); // error
Her iki sınıfın da paket dışında kullanılabilir olmasını istiyorsanız, her iki sınıfın public olduğunu bildirmeniz
gerekir. Paket bildirimine public niteliğini uygulayamazsınız.
Tam nitelendirilmiş adlar, paketler kullanılırken oluşabilecek ad çakışmalarının çözümlenmesinde kullanışlıdır.
Sınıfları aynı tanımlayıcı ile tanımlayan iki paketi içe aktarırsanız böyle bir senaryo gerçekleşebilir. Örneğin, ayrıca
SampleCode adında bir sınıfa sahip olan şu paketi göz önünde bulundurun:
package langref.samples
{
public class SampleCode {}
}
Aşağıdaki gibi, her iki sınıfı da içe aktarırsanız, SampleCode sınıfını ifade ederken bir ad çakışması olur:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 42
ActionScript dili ve sözdizimi
import samples.SampleCode;
import langref.samples.SampleCode;
var mySample:SampleCode = new SampleCode(); // name conflict
Derleyici, hangi SampleCode sınıfının kullanılacağını bilemez. Bu çakışmayı çözümlemek için, aşağıdaki gibi her
sınıfın tam nitelendirilmiş adını kullanmanız gerekir:
var sample1:samples.SampleCode = new samples.SampleCode();
var sample2:langref.samples.SampleCode = new langref.samples.SampleCode();
Not: C++ arka planına sahip programcılar genellikle import deyimini #include deyimiyle karıştırır. C++ derleyicileri
aynı anda tek bir dosya işlediğinden ve açıkça bir başlık dosyası dahil edilmediyse, sınıf tanımları için diğer dosyalara
bakmadığından, #include direktifi C++ uygulamasında gereklidir. ActionScript 3.0, bir include direktifine sahiptir
ancak bu direktif, sınıfları ve paketleri içe aktarmak için tasarlanmamıştır. ActionScript 3.0'da sınıfları veya paketleri
içe aktarmak için, import deyimini kullanmanız ve paketi içeren kaynak dosyasını sınıf yoluna yerleştirmeniz gerekir.
Ad alanları
Ad alanları, oluşturduğunuz özellik ve yöntemlerin görünürlüğü üzerinde denetim elde etmenizi sağlar. public,
private, protected ve internal erişim denetimi belirticilerini, yerleşik ad alanları olarak düşünün. Bu önceden
tanımlı erişim denetimi belirticileri ihtiyaçlarınıza uymuyorsa, kendi ad alanlarınızı oluşturabilirsiniz.
XML ad alanları hakkında bilginiz varsa, ActionScript uygulamasının sözdizimi ve ayrıntıları XML'dekinden biraz
daha farklı olsa da, burada ele alınan konuların çoğu size yabancı gelmeyecektir. Daha önce hiç ad alanlarıyla
çalışmadıysanız, kavramın kendisi oldukça anlaşılırdır ancak uygulama için öğrenmeniz gereken belirli terminolojiler
vardır.
Ad alanlarının nasıl çalıştığını anlamak için, özellik veya yöntem adının her zaman tanımlayıcı ve ad alanı olmak üzere
iki bölüm içerdiğinin bilinmesi yardımcı olacaktır. Tanımlayıcı, genellikle ad olarak düşündüğünüz şeydir. Örneğin,
aşağıdaki sınıf tanımında bulunan tanımlayıcılar sampleGreeting ve sampleFunction() şeklindedir:
class SampleCode
{
var sampleGreeting:String;
function sampleFunction () {
trace(sampleGreeting + " from sampleFunction()");
}
}
Tanımların önünde bir ad alanı niteliği olmadığında, tanımların adları varsayılan olarak internal ad alanı şeklinde
nitelendirilir, başka bir deyişle bunlar yalnızca aynı paketteki çağıranlara görünür. Derleyici katı moda ayarlanırsa,
derleyici, ad alanı niteliği olmayan tüm tanımlayıcılara internal ad alanının uygulandığına dair bir uyarı yayınlar. Bir
tanımlayıcının her yerde kullanılabilir olmasını sağlamak için, tanımlayıcı adının başına özel olarak public niteliğini
getirmeniz gerekir. Önceki örnek kodda, hem sampleGreeting hem de sampleFunction(), internal ad alanı
değerine sahiptir.
Ad alanları kullanılırken izlenmesi gereken üç temel adım vardır. İlk olarak, namespace anahtar sözcüğünü kullanarak
ad alanını tanımlamanız gerekir. Örneğin, aşağıdaki kod version1 ad alanını tanımlar:
namespace version1;
İkinci olarak, ad alanınızı bir özellik veya yöntem bildiriminde erişim denetimi belirticisinin yerine kullanarak
uygularsınız. Aşağıdaki örnek, version1 ad alanına myFunction() adında bir işlev yerleştirir:
version1 function myFunction() {}
Üçüncü olarak, ad alanını uyguladıktan sonra, use direktifiyle veya bir tanımlayıcının adını bir ad alanıyla niteleyerek
bu ad alanına başvurabilirsiniz. Aşağıdaki örnek, use direktifi yoluyla myFunction() işlevine başvurur:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 43
ActionScript dili ve sözdizimi
use namespace version1;
myFunction();
Aşağıdaki örnekte gösterildiği gibi, myFunction() işlevine başvurmak için nitelendirilmiş bir ad da kullanabilirsiniz:
version1::myFunction();
Ad alanlarını tanımlama
Ad alanları, bazen ad alanı adı olarak da adlandırılan tek bir değer (Uniform Resource Identifier (URI)) içerir. URI,
ad alanı tanımınızın benzersiz olmasını sağlamanıza yardımcı olur.
İki yöntemden birini kullanarak bir ad alanı tanımı bildirip bir ad alanı oluşturursunuz. Bir XML ad alanı
tanımlayacağınızdan, açık bir URI ile bir ad alanını tanımlayabilir veya URI'yi atabilirsiniz. Aşağıdaki örnek, URI
kullanılarak bir ad alanının nasıl tanımlanabildiğini gösterir:
namespace flash_proxy = "http://www.adobe.com/flash/proxy";
URI, o ad alanı için benzersiz bir kimlik dizesi görevi görür. Aşağıdaki örnekteki gibi, URI'yi atarsanız, derleyici URI
yerine benzersiz bir dahili kimlik dizesi oluşturur. Bu dahili kimlik dizesine erişiminiz olmaz.
namespace flash_proxy;
Siz URI ile veya URI olmadan bir ad alanını tanımladıktan sonra, o ad alanı aynı kapsamda yeniden tanımlanamaz.
Aynı kapsamda önceden tanımlanmış bir ad alanını tanımlama girişimi, bir derleyici hatasına yol açar.
Bir paket veya sınıf içinde bir ad alanı tanımlanırsa, uygun erişim denetimi belirticileri kullanılmadığı sürece, söz
konusu ad alanı, o paket veya sınıf dışındaki koda görünmeyebilir. Örneğin, aşağıdaki kod, flash.utils paketinde
tanımlanan flash_proxy ad alanını gösterir. Aşağıdaki örnekte, erişim denetimi belirticisinin olmaması,
flash_proxy ad alanının yalnızca flash.utils paketindeki koda görüneceği ve bu paket dışındaki kodlara
görünmeyeceği anlamına gelir:
package flash.utils
{
namespace flash_proxy;
}
Aşağıdaki kod, flash_proxy ad alanını paket dışındaki kodlara görünür duruma getirmek için public niteliğini
kullanır:
package flash.utils
{
public namespace flash_proxy;
}
Ad alanlarını uygulama
Ad alanı uygulanması, bir ad alanına bir tanımın yerleştirilmesi anlamına gelir. Ad alanlarına yerleştirilebilen tanımlar
arasında, işlevler, değişkenler ve sabitler yer alır. (Özel bir ad alanına sınıf yerleştiremezsiniz.)
Örneğin, public erişim denetimi ad alanı kullanılarak bildirilen bir işlevi göz önünde bulundurun. Bir işlev tanımında
public niteliği kullanıldığında, o işlev genel ad alanına yerleştirilir ve böylece işlev, tüm kod için kullanılabilir olur.
Bir ad alanını tanımladıktan sonra, tanımladığınız ad alanını public niteliğiyle aynı şekilde kullanabilirsiniz ve tanım
da özel ad alanınıza başvurabilen kod için kullanılabilir olur. Örneğin, bir example1 ad alanını tanımlarsanız,
aşağıdaki örnekte gösterildiği gibi, nitelik olarak example1 öğesini kullanıp myFunction() adında bir yöntemi
ekleyebilirsiniz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 44
ActionScript dili ve sözdizimi
namespace example1;
class someClass
{
example1 myFunction() {}
}
Nitelik olarak example1 ad alanı kullanılarak myFunction() yönteminin bildirilmesi, yöntemin example1 ad alanına
ait olduğu anlamına gelir.
Ad alanlarını uygularken aşağıdakileri göz önünde bulundurmanız gerekir:
• Her bildirime yalnızca bir ad alanı uygulayabilirsiniz.
• Aynı anda birden çok tanıma bir ad alanı niteliği uygulanamaz. Başka bir deyişle, ad alanınızı on farklı işleve
uygulamak istiyorsanız, on işlev tanımının her birine nitelik olarak ad alanınızı eklemeniz gerekir.
• Ad alanları ve erişim denetimi belirticileri birbirini dışladığından, bir ad alanı uygularsanız, bir erişim denetimi
belirticisi de belirtemezsiniz. Başka bir deyişle, bir işlevi veya özelliği ad alanınıza uygulamanın yanı sıra public,
private, protected ya da internal olarak bildiremezsiniz.
Ad alanlarına başvurma
public, private, protected ve internal gibi herhangi bir erişim denetimi ad alanıyla bildirilmiş bir yöntem veya
özellik kullandığınızda, ad alanına açıkça başvurulmasına gerek yoktur. Bunun nedeni, bu özel ad alanlarına erişimin
bağlama göre denetlenmesidir. Örneğin, private ad alanına yerleştirilen tanımlar, aynı sınıf içindeki kod için
otomatik olarak kullanılabilir olur. Ancak tanımladığınız ad alanları için böyle bir bağlam duyarlılığı yoktur. Özel bir
ad alanına yerleştirdiğiniz bir yöntem veya özelliği kullanmak için, ad alanına başvurmanız gerekir.
use namespace direktifiyle ad alanlarına başvurabilir veya ad niteleyicisi (::) işaretini kullanarak ad alanıyla adı
niteleyebilirsiniz. use namespace direktifiyle bir ad alanına başvurulması, ad alanını “açar”, böylece ad alanı
nitelendirilmiş olmayan herhangi bir tanımlayıcıya uygulanabilir. Örneğin, example1 ad alanını tanımladıysanız, use
namespace example1 direktifini kullanarak o ad alanındaki adlara erişebilirsiniz:
use namespace example1;
myFunction();
Aynı anda birden çok ad alanı açabilirsiniz. Siz use namespace direktifiyle bir ad alanını açtıktan sonra, bu ad alanı,
açıldığı kod bloğu boyunca açık kalır. Ad alanını açıkça kapatmanın bir yolu yoktur.
Ancak birden çok ad alanının açılması, ad çakışması olma olasılığını artırır. Bir ad alanını açmamayı tercih derseniz,
yöntem veya özellik adını ad alanı ve ad niteleyicisi işaretiyle niteleyerek use namespace direktifini önleyebilirsiniz.
Örneğin, aşağıdaki kod, myFunction() adını example1 ad alanıyla nasıl niteleyebileceğinizi gösterir:
example1::myFunction();
Ad alanlarını kullanma
ActionScript 3.0'ın parçası olan flash.utils.Proxy sınıfında ad çakışmalarını önlemek için kullanılan bir gerçek ad alanı
örneğini bulabilirsiniz. ActionScript 2.0'daki Object.__resolve özelliğinin yerini alan Proxy sınıfı, bir hata
oluşmadan önce tanımsız özellik veya yöntemlere yapılan başvuruları önlemenize yardımcı olur. Ad çakışmalarını
önlemek için, Proxy sınıfının tüm yöntemleri, flash_proxy ad alanında bulunur.
flash_proxy ad alanının nasıl kullanıldığını daha iyi anlamak için, Proxy sınıfının nasıl kullanıldığını anlamanız
gerekir. Proxy sınıfının işlevselliği, yalnızca Proxy sınıfından miras alan sınıflar için kullanılabilir durumdadır. Başka
bir deyişle, bir nesnede Proxy sınıfının yöntemlerini kullanmak isterseniz, nesnenin sınıf tanımının, Proxy sınıfını
genişletmesi gerekir. Örneğin, tanımsız bir yöntemi çağırma girişimlerinin tümünü önlemek istiyorsanız, Proxy
sınıfını genişletir ve daha sonra Proxy sınıfının callProperty() yöntemini geçersiz kılarsınız.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 45
ActionScript dili ve sözdizimi
Ad alanlarının uygulanmasının genellikle ad alanını tanımlama, uygulama ve ad alanına başvurma olmak üzere üç
adımlık bir işlem olduğunu hatırlayabilirsiniz. Ancak, Proxy sınıfı yöntemlerinden herhangi birini asla açıkça
çağırmadığınızdan, flash_proxy ad alanı yalnızca tanımlanır ve uygulanır fakat bu ad alanına asla başvurulmaz.
ActionScript 3.0, flash_proxy ad alanını tanımlar ve bunu Proxy sınıfında uygular. Kodunuzun yalnızca Proxy
sınıfını genişleten sınıflara flash_proxy ad alanını uygulaması gerekir.
flash_proxy ad alanı, flash.utils paketinde aşağıdakine benzer şekilde tanımlanır:
package flash.utils
{
public namespace flash_proxy;
}
Aşağıdaki Proxy sınıfı alıntısında gösterildiği gibi, ad alanı, Proxy sınıfının yöntemlerine uygulanır:
public class Proxy
{
flash_proxy function callProperty(name:*, ... rest):*
flash_proxy function deleteProperty(name:*):Boolean
...
}
Aşağıdaki kodda gösterildiği gibi, ilk olarak hem Proxy sınıfını hem de flash_proxy ad alanını içe aktarmanız gerekir.
Daha sonra, Proxy sınıfını genişletecek şekilde sınıfınızı bildirmeniz gerekir. (Katı modda derleme yapıyorsanız, ayrıca
dynamic niteliğini de eklemeniz gerekir.) callProperty() yöntemini geçersiz kıldığınızda, flash_proxy ad alanını
kullanmanız gerekir.
package
{
import flash.utils.Proxy;
import flash.utils.flash_proxy;
dynamic class MyProxy extends Proxy
{
flash_proxy override function callProperty(name:*, ...rest):*
{
trace("method call intercepted: " + name);
}
}
}
MyProxy sınıfının bir örneğini oluşturur ve aşağıdaki örnekte çağrılan testing() yöntemi gibi tanımsız bir yöntem
çağırırsanız, Proxy nesneniz yöntem çağrısını önler ve geçersiz kılınan callProperty() yönteminin içinde deyimleri
çalıştırır (bu durumda, basit bir trace() deyimi).
var mySample:MyProxy = new MyProxy();
mySample.testing(); // method call intercepted: testing
flash_proxy ad alanının içinde Proxy sınıfı yöntemlerinden birinin bulunmasının iki avantajı vardır. İlk olarak, ayrı
bir ad alanının bulunması, Proxy sınıfını genişleten herhangi bir sınıfın genel arabiriminde karmaşıklığı azaltır. (Proxy
sınıfında, geçersiz kılabileceğiniz yaklaşık bir düzine yöntem vardır ve bunların hiçbiri doğrudan çağrılmak üzere
tasarlanmamıştır. Bunların tümünün genel ad alanına yerleştirilmesi kafa karıştırıcı olabilir.) İkinci olarak,
flash_proxy ad alanının kullanılması, Proxy alt sınıfınızın herhangi bir Proxy sınıfı yöntemiyle eşleşen adlara sahip
örnek yöntemler içermesi durumunda ad çakışmalarını önler. Örneğin, kendi yöntemlerinizden birine
callProperty() adını vermek isteyebilirsiniz. callProperty() yöntemi sürümünüz farklı bir ad alanında
olduğundan, aşağıdaki kod kabul edilebilir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 46
ActionScript dili ve sözdizimi
dynamic class MyProxy extends Proxy
{
public function callProperty() {}
flash_proxy override function callProperty(name:*, ...rest):*
{
trace("method call intercepted: " + name);
}
}
Dört erişim denetimi belirticisiyle (public, private, internal ve protected) gerçekleştirilemeyecek şekilde
yöntemlere veya özelliklere erişim sağlamak istediğinizde de ad alanları yardımcı olabilir. Örneğin, birçok pakete
yayılmış birkaç yardımcı program yönteminiz olabilir. Bu yöntemlerin, tüm paketleriniz için kullanılabilir olmasını
ancak genel olarak herkese açık olmamasını istersiniz. Bunu yapmak için, yeni bir ad alanı oluşturabilir ve bunu kendi
özel erişim denetimi belirticiniz olarak kullanabilirsiniz.
Aşağıdaki örnek, farklı paketlerde bulunan iki işlevi birlikte gruplandırmak için kullanıcı tanımlı bir ad alanı kullanır.
Bunları aynı ad alanında gruplandırarak tek bir use namespace deyimini kullanıp her iki işlevi bir sınıf veya paket
için görünebilir duruma getirebilirsiniz.
Bu örnekte tekniği göstermek için dört dosya kullanılmaktadır. Tüm dosyaların sınıf yolunuzda yazılması gerekir.
Birinci dosya olan myInternal.as, myInternal ad alanını tanımlamak için kullanılır. Dosya, example adındaki bir
pakette bulunduğundan, dosyayı example adındaki bir klasöre yerleştirmeniz gerekir. Ad alanı, diğer paketlere içe
aktarılabilmesi için public olarak işaretlenir.
// myInternal.as in folder example
package example
{
public namespace myInternal = "http://www.adobe.com/2006/actionscript/examples";
}
İkinci ve üçüncü dosyalar olan Utility.as ve Helper.as, diğer paketler için kullanılabilir olması gereken yöntemlerin
bulunduğu sınıfları tanımlar. Utility sınıfı, example.alpha paketindedir, başka bir deyişle, example klasörünün alt
klasörü olan alpha adında bir klasörün içine dosyanın yerleştirilmesi gerekir. Helper sınıfı, example.beta paketindedir,
başka bir deyişle, example klasörünün alt klasörü olan beta adında bir klasörün içine dosyanın yerleştirilmesi gerekir.
Bu her iki example.alpha ve example.beta paketinin de ad alanını kullanmadan önce içe aktarması gerekir.
// Utility.as in the example/alpha folder
package example.alpha
{
import example.myInternal;
public class Utility
{
private static var _taskCounter:int = 0;
public static function someTask()
{
_taskCounter++;
}
myInternal static function get taskCounter():int
{
return _taskCounter;
}
}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 47
ActionScript dili ve sözdizimi
// Helper.as in the example/beta folder
package example.beta
{
import example.myInternal;
public class Helper
{
private static var _timeStamp:Date;
public static function someTask()
{
_timeStamp = new Date();
}
myInternal static function get lastCalled():Date
{
return _timeStamp;
}
}
}
Dördüncü dosya olan NamespaceUseCase.as, ana uygulama sınıfı olup example klasörünün bir eşdüzeyi olması
gerekir. Adobe Flash CS4 Professional'da bu sınıf, FLA'nın belge sınıfı olarak kullanılır. NamespaceUseCase sınıfı
ayrıca myInternal ad alanını içe aktarır ve diğer paketlerde bulunan iki statik yöntemi çağırmak için bu ad alanını
kullanır. Bu örnek yalnızca kodu basitleştirmek için statik yöntemleri kullanır. myInternal ad alanına hem statik
yöntemler hem de örnek yöntemleri yerleştirilebilir.
// NamespaceUseCase.as
package
{
import flash.display.MovieClip;
import example.myInternal; // import namespace
import example.alpha.Utility;// import Utility class
import example.beta.Helper;// import Helper class
public class NamespaceUseCase extends MovieClip
{
public function NamespaceUseCase()
{
use namespace myInternal;
Utility.someTask();
Utility.someTask();
trace(Utility.taskCounter); // 2
Helper.someTask();
trace(Helper.lastCalled); // [time someTask() was last called]
}
}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 48
ActionScript dili ve sözdizimi
Değişkenler
Değişkenler, programınızda kullandığınız değerleri saklamanıza olanak sağlar. Bir değişken bildirmek için, değişken
adıyla var deyimini kullanmanız gerekir. ActionScript 2.0'da, yalnızca tür ek açıklamalarını kullanıyorsanız var
deyiminin kullanılması gerekir. ActionScript 3.0'da ise var deyiminin kullanılması her zaman gerekir. Örneğin,
aşağıdaki ActionScript satırı, i adında bir değişken bildirir:
var i;
Bir değişkeni bildirirken var deyimini atarsanız, katı modda bir derleyici hatası ve standart modda bir çalışma zamanı
hatası alırsınız. Örneğin, i değişkeni önceden tanımlanmadıysa, aşağıdaki kod satırı bir hataya yol açar:
i; // error if i was not previously defined
Bir değişkeni bir veri türüyle ilişkilendirmek için, değişkeni bildirdiğinizde bunu yapmanız gerekir. Değişken türü
belirlenmeden bir değişkenin belirtilmesi geçerlidir ancak bu, katı modda bir derleyici uyarısına yol açar. Değişkenin
adının sonuna iki nokta (:) ve ardından da değişkenin türünü ekleyerek bir değişken türü belirlersiniz. Örneğin,
aşağıdaki kod, int türünde bir i değişkenini bildirir:
var i:int;
Atama operatörünü (=) kullanarak bir değişkene bir değer atayabilirsiniz. Örneğin, aşağıdaki kod bir i değişkenini
bildirir ve bu değişkene 20 değerini atar:
var i:int;
i = 20;
Aşağıdaki örnekte olduğu gibi, değişkeni bildirdiğiniz anda değişkene bir değer atamak daha kullanışlı olabilir:
var i:int = 20;
Bildirildiği anda bir değişkene değer atama tekniği yalnızca tam sayı ve dizeler gibi ilkel değerler atanırken değil, bir
dizi oluşturulurken veya bir sınıfın örneği başlatılırken de yaygın olarak kullanılır. Aşağıdaki örnek, bir kod satırı
kullanılarak bildirilen ve değer atanan bir diziyi gösterir.
var numArray:Array = ["zero", "one", "two"];
new operatörünü kullanarak bir sınıfın örneğini oluşturabilirsiniz. Aşağıdaki örnek, CustomClass adında bir sınıfın
örneğini oluşturur ve yeni oluşturulan sınıf örneği başvurusunu customItem adındaki değişkene atar:
var customItem:CustomClass = new CustomClass();
Bildirilecek birden çok değişkeniniz varsa, değişkenleri ayırmak için virgül operatörünü (,) kullanarak bunların
tümünü tek bir kod satırında bildirebilirsiniz. Örneğin, aşağıdaki kod, tek bir kod satırında üç değişken bildirir:
var a:int, b:int, c:int;
Ayrıca aynı kod satırındaki değişkenlerin her birine değer atayabilirsiniz. Örneğin, aşağıdaki kod üç değişken (a, b ve
c) bildirir ve her birine bir değer atar:
var a:int = 10, b:int = 20, c:int = 30;
Değişken bildirimlerini tek bir deyimde gruplandırmak için virgül operatörünü kullanabilseniz de, bunun yapılması
kodunuzun okunabilirliğini azaltabilir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 49
ActionScript dili ve sözdizimi
Değişken kapsamını anlama
Bir değişkenin kapsamı, sözlü bir başvuruyla değişkene erişilebilen kod alanıdır. Genel değişken, kodunuzun tüm
alanlarında tanımlı değişkenken, yerel değişken ise kodunuzun yalnızca bir bölümünde tanımlı değişkendir.
ActionScript 3.0'da değişkenlere her zaman bildirildikleri işlev veya sınıf kapsamı atanır. Genel bir değişken, herhangi
bir işlev veya sınıf tanımı dışında tanımladığınız bir değişkendir. Örneğin, aşağıdaki kod, herhangi bir işlevin dışında
genel işlevi bildirerek strGlobal genel işlevini oluşturur. Bu örnek, genel bir değişkenin, işlev tanımının içinde ve
dışında kullanılabilir olduğunu gösterir.
var strGlobal:String = "Global";
function scopeTest()
{
trace(strGlobal); // Global
}
scopeTest();
trace(strGlobal); // Global
Bir işlev tanımı içindeki değişkeni bildirerek yerel bir değişkeni bildirmiş olursunuz. Yerel değişkeni
tanımlayabileceğiniz en küçük kod alanı, işlev tanımıdır. Bir işlev içinde bildirilen yerel değişken yalnızca o işlev içinde
varolur. Örneğin, localScope() adındaki bir işlevin içinde str2 adında bir değişkeni bildirirseniz, bu değişken söz
konusu işlevin dışında kullanılamaz.
function localScope()
{
var strLocal:String = "local";
}
localScope();
trace(strLocal); // error because strLocal is not defined globally
Yerel değişkeniniz için kullandığınız değişken adı önceden genel değişken olarak bildirilmişse, yerel değişken
kapsamdayken, yerel tanım genel tanımı gizler (veya gölgeler). Genel değişken, işlev dışında varolmaya devam eder.
Örneğin, aşağıdaki kod, str1 adında genel bir dize değişkeni oluşturur ve sonra scopeTest() işlevinin içinde aynı
adda yerel bir değişken oluşturur. İşlevin içindeki trace deyimi, değişkenin yerel değerini verirken, işlevin dışındaki
trace deyimi de değişkenin genel değerini verir.
var str1:String = "Global";
function scopeTest ()
{
var str1:String = "Local";
trace(str1); // Local
}
scopeTest();
trace(str1); // Global
ActionScript değişkenleri, C++ ve Java uygulamalarındaki değişkenlerden farklı olarak, blok düzeyi kapsamına sahip
değildir. Kod bloğu, açma küme ayracı ( { ) ile kapatma küme ayracı( } ) arasındaki herhangi bir deyim grubudur. C++
ve Java gibi bazı programlama dillerinde, kod bloğu içinde bildirilen değişkenler o kod bloğunun dışında kullanılamaz.
Bu kapsam sınırlamasına blok düzeyi kapsamı denir ve bu kapsam sınırlaması ActionScript'te bulunmaz. Bir kod
bloğu içinde bir değişken bildirirseniz, bu değişken yalnızca o kod bloğunda değil, kod bloğunun ait olduğu diğer işlev
parçalarında da kullanılabilir. Örneğin, aşağıdaki işlev, çeşitli blok kapsamlarında tanımlanmış değişkenleri içerir.
Tüm değişkenler, işlev boyunca kullanılabilir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 50
ActionScript dili ve sözdizimi
function blockTest (testArray:Array)
{
var numElements:int = testArray.length;
if (numElements > 0)
{
var elemStr:String = "Element #";
for (var i:int = 0; i < numElements; i++)
{
var valueStr:String = i + ": " + testArray[i];
trace(elemStr + valueStr);
}
trace(elemStr, valueStr, i); // all still defined
}
trace(elemStr, valueStr, i); // all defined if numElements > 0
}
blockTest(["Earth", "Moon", "Sun"]);
Blok düzeyi kapsamı olmamasının işaret ettiği ilginç bir nokta, işlev sona ermeden değişken bildirildiği sürece, bir
değişken bildirilmeden o değişkene okuma ve yazma işlemi yapabilmenizdir. Bunun nedeni, derleyicinin tüm
değişken bildirimlerini işlevin en üstüne taşıdığını belirten, kaldırma adındaki bir tekniktir. Örneğin, num
değişkeninin ilk trace() işlevi, num değişkeni bildirilmeden önce olsa da, aşağıdaki kod derleme yapar:
trace(num); // NaN
var num:Number = 10;
trace(num); // 10
Ancak derleyici, atama deyimlerini kaldırmaz. Bu da, num değişkeninin ilk trace() işlevinin neden Number veri türü
için varsayılan değişken değeri olan NaN (sayı değil) sonucunu verdiğini açıklar. Başka bir deyişle, aşağıdaki örnekte
gösterildiği gibi, değişkenler bildirilmeden değişkenlere değer atayabilirsiniz:
num = 5;
trace(num); // 5
var num:Number = 10;
trace(num); // 10
Varsayılan değerler
Varsayılan değer, siz değerini ayarlamadan önce bir değişkenin içerdiği değerdir. Bir değişkenin ilk defa değerini
ayarladığınızda o değişkeni başlatırsınız. Bir değişkeni bildirir ancak değişkenin değerini ayarlamazsanız, o değişken
başlatılmamış olur. Başlatılmamış değişkenin değeri, veri türüne bağlıdır. Aşağıdaki tabloda, veri türüne göre organize
edilmiş şekilde değişkenlerin varsayılan değerleri açıklanmaktadır:
Veri türü
Varsayılan değer
Boolean
false
int
0
Number
NaN
Object
null
String
null
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 51
ActionScript dili ve sözdizimi
Veri türü
Varsayılan değer
uint
0
Bildirilmemiş (tür ek açıklamasına eşit *)
undefined
Kullanıcı tanımlı sınıflar da dahil olmak üzere diğer tüm sınıflar.
null
Number türündeki değişkenler için varsayılan değer NaN (sayı değil) olup bu değer, bir değerin sayıyı temsil
etmediğini belirtmek için IEEE-754 standardı tarafından tanımlanmış özel bir değerdir.
Bir değişkeni bildirir ancak değişkenin veri türünü bildirmezseniz, gerçekten değişkenin türlenmemiş olduğunu
belirten varsayılan veri türü * uygulanır. Türlenmemiş bir değişkeni bir değerle de başlatmazsanız, değişkenin
varsayılan değeri undefined olur.
Boolean, Number, int ve uint dışındaki veri türleri için, başlatılmamış bir değişkenin varsayılan değeri null olur. Bu,
ActionScript 3.0 tarafından tanımlanmış tüm sınıfların yanı sıra sizin oluşturduğunuz özel sınıflar için de geçerlidir.
null değeri, Boolean, Number, int veya uint türündeki değişkenler için geçerli bir değer değildir. Bu tür bir değişkene
null değeri atamayı denerseniz, değer o veri türünün varsayılan değerine dönüştürülür. Object türündeki değişkenler
için bir null değeri atayabilirsiniz. Object türündeki bir değişkene undefined değerini atamayı denerseniz, değer
null değerine dönüştürülür.
Number türündeki değişkenler için, değişken bir sayı olmadığında true, aksi takdirde false Boolean değerini
döndüren isNaN() adında özel bir üst düzey işlevi vardır.
Veri türleri
Veri türü, bir değerler kümesini tanımlar. Örneğin, Boolean veri türü tam olarak iki değerden oluşan bir kümedir:
true ve false. ActionScript 3.0, Boolean veri türüne ek olarak, String, Number ve Array gibi birkaç tane daha yaygın
kullanılan veri türünü tanımlar. Özel bir değer kümesini tanımlamak için sınıfları veya arabirimleri kullanarak kendi
veri türlerinizi tanımlayabilirsiniz. İlkel veya karmaşık olsun, ActionScript 3.0'daki tüm değerler, nesnedir.
İlkel değer, şu veri türlerinden birine ait olan bir değerdir: Boolean, int, Number, String ve uint. ActionScript, bellek ve
hız eniyileştirmesini olanaklı kılacak şekilde ilkel değerleri sakladığından, ilkel değerlerle çalışılması genellikle
karmaşık değerlerle çalışılmasından daha hızlıdır.
Not: ActionScript, teknik ayrıntılara ilgi duyan okuyucular için ilkel değerleri sabit nesneler şeklinde dahili olarak
saklar. Bunların sabit nesneler olarak saklanması, başvuruya göre iletmenin değere göre iletme kadar etkili olduğu
anlamına gelir. Başvurular genellikle değerlerin kendisinden çok daha küçük olduğundan bu, bellek kullanımını azaltıp
çalıştırma hızını da artırır.
Karmaşık değer, ilkel olmayan bir değerdir. Karmaşık değerler kümesini tanımlayan veri türleri arasında, Array, Date,
Error, Function, RegExp, XML ve XMLList yer alır.
Çoğu programlama dili, ilkel değerler ile bunların sarıcı değerleri arasında ayrım yapar. Örneğin, Java, bir int ilkel
değerine ve bunu saran java.lang.Integer sınıfına sahiptir. Java ilkel değerleri nesne değildir ancak bunların sarıcıları
nesnedir ve bu da bazı işlemler için ilkel değerleri, bazı işlemler için de sarıcı nesneleri daha uygun hale getirir.
ActionScript 3.0'da ilkel değerler ve bunların sarıcı nesneleri pratik amaçlar için birbirinden ayırt edilemez. İlkel
değerler de dahil olmak üzere tüm değerler nesnedir. Flash Player ve Adobe AIR, bu ilkel türleri, nesne gibi davranan
ancak nesne oluşturulmasıyla ilişkilendirilmiş normal yükü gerektirmeyen özel durumlar olarak değerlendirir. Başka
bir deyişle, aşağıdaki iki kod satırı eşdeğerdir:
var someInt:int = 3;
var someInt:int = new int(3);
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 52
ActionScript dili ve sözdizimi
Yukarıda listelenen tüm ilkel ve karmaşık veri türleri, ActionScript 3.0 çekirdek sınıfları tarafından tanımlanır.
Çekirdek sınıflar, new operatörü yerine değişmez değerler kullanarak nesneler oluşturmanıza olanak sağlar. Örneğin,
aşağıdaki gibi, değişmez bir değer veya Array sınıfı yapıcısını kullanarak bir dizi oluşturabilirsiniz:
var someArray:Array = [1, 2, 3]; // literal value
var someArray:Array = new Array(1,2,3); // Array constructor
Tür denetleme
Tür denetleme, derleme zamanında veya çalışma zamanında gerçekleşebilir. C++ ve Java gibi statik olarak türlenmiş
diller, tür denetlemesini derleme zamanında yapar. Smalltalk ve Python gibi dinamik olarak türlenmiş diller, tür
denetlemesini çalışma zamanında işler. ActionScript 3.0, dinamik olarak türlenmiş bir dil olarak çalışma zamanı tür
denetlemesi yapar ancak katı mod adı verilen özel bir derleyici moduyla da derleme zamanı tür denetlemesini
destekler. Katı modda tür denetlemesi hem derleme zamanında hem de çalışma zamanında gerçekleşir ancak standart
modda, tür denetlemesi yalnızca çalışma zamanında gerçekleşir.
Dinamik olarak türlenmiş diller, siz kodunuzu yapılandırırken çok yüksek esneklik sunar ancak bu, çalışma
zamanında tür hatalarının verilmesine neden olur. Statik olarak türlenmiş diller, tür hatalarını derleme zamanında
bildirir ancak bu da tür bilgilerinin derleme zamanında bilinmesini gerektirir.
Derleme zamanı tür denetlemesi
Proje boyutu arttıkça, olabildiğince erkenden tür hatalarının yakalanmasının önemi artıp veri türü esnekliğinin önemi
azaldığından, derleme zamanı tür denetlemesi genellikle daha büyük projelerde kullanışlıdır. Bu nedenle de Adobe
Flash CS4 Professional ve Adobe Flex Builder uygulamalarında ActionScript derleyicisi varsayılan olarak katı modda
çalışacak şekilde ayarlanmıştır.
Derleme zamanı tür denetlemesi sağlamak için, derleyicinin kodunuzdaki değişkenlerin veya ifadelerin veri türü
bilgilerini bilmesi gerekir. Bir değişkenin veri türünü açıkça bildirmek için, değişken adına son ek olarak iki nokta
operatörünü (:) ve ardından veri türünü ekleyin. Veri türünü bir parametreyle ilişkilendirmek için, iki nokta
operatörünü ve ardından da veri türünü kullanın. Örneğin, aşağıdaki kod, xParam parametresine veri türü bilgilerini
ekler ve açık bir veri türüyle bir değişkeni myParam bildirir:
function runtimeTest(xParam:String)
{
trace(xParam);
}
var myParam:String = "hello";
runtimeTest(myParam);
ActionScript derleyicisi, katı modda tür uyuşmazlıklarını derleyici hataları olarak bildirir. Örneğin, aşağıdaki kod,
Object türünde bir xParam işlev parametresini bildirir ancak daha sonra bu parametreye String ve Number türünde
değerler atamayı dener. Bu da katı modda bir derleyici hatası oluşturur.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 53
ActionScript dili ve sözdizimi
function dynamicTest(xParam:Object)
{
if (xParam is String)
{
var myStr:String = xParam; // compiler error in strict mode
trace("String: " + myStr);
}
else if (xParam is Number)
{
var myNum:Number = xParam; // compiler error in strict mode
trace("Number: " + myNum);
}
}
Ancak katı modda da, atama deyiminin sağ tarafını türlenmemiş şekilde bırakarak derleme zamanı tür denetlemesini
seçerek devre dışı bırakabilirsiniz. Bir tür ek açıklamasını çıkararak veya özel yıldız (*) tür ek açıklamasını kullanarak
bir değişkeni ya da ifadeyi türlenmemiş olarak işaretleyebilirsiniz. Örneğin, önceki örnekte yer alan xParam
parametresi, artık tür ek açıklaması içermeyecek şekilde değiştirilirse, kod katı modda derlenir:
function dynamicTest(xParam)
{
if (xParam is String)
{
var myStr:String = xParam;
trace("String: " + myStr);
}
else if (xParam is Number)
{
var myNum:Number = xParam;
trace("Number: " + myNum);
}
}
dynamicTest(100)
dynamicTest("one hundred");
Çalışma zamanı tür denetlemesi
Katı modda da, standart modda da derleme yapsanız, ActionScript 3.0'da, çalışma zamanı tür denetlemesi gerçekleşir.
Bir dizi bekleyen bir işleve argüman olarak 3 değerinin iletildiği bir durumu göz önünde bulundurun. 3 değeri, Array
veri türüyle uyumlu olmadığından, katı modda derleyici bir hata oluşturur. Katı modu devre dışı bırakıp standart
modda çalışırsanız, derleyici tür uyuşmazlığını şikayet etmez ancak Flash Player ve Adobe AIR tarafından yapılan
çalışma zamanı tür denetlemesi bir çalışma zamanı hatası verir.
Aşağıdaki örnek, bir Array argümanı bekleyen ancak kendisine 3 değeri iletilen typeTest() adındaki bir işlevi
gösterir. 3 değeri, parametrenin bildirilen veri türünün (Array) bir üyesi olmadığından bu, standart modda bir çalışma
zamanı hatasına yol açar.
function typeTest(xParam:Array)
{
trace(xParam);
}
var myNum:Number = 3;
typeTest(myNum);
// run-time error in ActionScript 3.0 standard mode
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 54
ActionScript dili ve sözdizimi
Katı modda çalıştığınız halde çalışma zamanı tür hatası aldığınız durumlar da olabilir. Katı modu kullanırken
türlenmemiş bir değişken kullanarak derleme zamanı tür denetlemesini devre dışı bırakırsanız bu mümkün olur.
Türlenmemiş bir değişken kullandığınızda, tür denetlemesini ortadan kaldırmış olmazsınız yalnızca çalışma zamanına
ertelemiş olursunuz. Örneğin, önceki örnekte yer alan myNum değişkeninin bildirilmiş bir veri türü yoksa, derleyici tür
uyuşmazlığını algılayamaz ancak Flash Player ve Adobe AIR uygulaması, atama deyiminin sonucu olarak 3 değerine
ayarlanan myNum çalışma zamanı değerini Array veri türüne ayarlanmış xParam türüyle karşılaştırdığından, bir çalışma
zamanı hatası oluşturur.
function typeTest(xParam:Array)
{
trace(xParam);
}
var myNum = 3;
typeTest(myNum);
// run-time error in ActionScript 3.0
Çalışma zamanı tür denetlemesi ayrıca derleme zamanı tür denetlemesine göre mirasın daha esnek kullanılmasını
sağlar. Standart mod, tür denetlemesini çalışma zamanına erteleyerek, yukarı çevrim de yapsanız bir alt sınıfın
özelliklerine başvurmanıza olanak sağlar. Bir sınıf örneğinin türünü belirtmek için temel sınıf kullandığınızda ancak
bu sınıf türü örneğini başlatmak için bir alt sınıf kullandığınızda yukarı çevrim gerçekleşir. Örneğin, genişletilebilen
ClassBase adında bir sınıf oluşturabilirsiniz (final niteliğine sahip sınıflar genişletilemez):
class ClassBase
{
}
Daha sonra aşağıdaki gibi, ClassExtender adında olan ve someString adında bir özellik içeren, ClassBase sınıfının bir
alt sınıfını oluşturabilirsiniz:
class ClassExtender extends ClassBase
{
var someString:String;
}
Her iki sınıfı da kullanıp ClassBase veri türü kullanılarak bildirilen ancak ClassExtender yapıcısı kullanılarak başlatılan
bir sınıf örneği oluşturabilirsiniz. Temel sınıf, alt sınıfta bulunmayan özellikleri veya yöntemleri içermediğinden,
yukarı çevrim güvenli bir işlem olarak değerlendirilir.
var myClass:ClassBase = new ClassExtender();
Ancak bir alt sınıf, temel sınıfının içermediği özellikleri veya yöntemleri içermez. Örneğin, ClassExtender sınıfı,
ClassBase sınıfında varolmayan someString özelliğini içerir. ActionScript 3.0 standart modunda, aşağıdaki örnekte
gösterildiği gibi, bir derleme zamanı hatası oluşturmadan myClass örneğini kullanarak bu özelliğe başvurabilirsiniz:
var myClass:ClassBase = new ClassExtender();
myClass.someString = "hello";
// no error in ActionScript 3.0 standard mode
is operatörü
ActionScript 3.0'da yeni olan is operatörü, bir değişkenin veya ifadenin belirli bir veri türünün üyesi olup olmadığını
test etmenize olanak sağlar. Önceki ActionScript sürümlerinde, instanceof operatörü bu işlevselliği sağlamıştır
ancak ActionScript 3.0'da instanceof operatörü, veri türü üyeliğini test etmek için kullanılmamalıdır. x instanceof
y ifadesi yalnızca y varlığı için x prototip zincirini denetlediğinden, elle tür denetleme için instanceof operatörü
yerine is operatörü kullanılmalıdır. (Ayrıca ActionScript 3.0'da prototip zinciri, miras hiyerarşisinin tam resmini
sağlamaz.)
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 55
ActionScript dili ve sözdizimi
is operatörü uygun miras hiyerarşisini inceler ve yalnızca bir nesnenin belirli bir sınıfın örneği olup olmadığını
denetlemek için değil, bir nesnenin belirli bir arabirimi uygulayan bir sınıf örneği olup olmadığını denetlemek için de
kullanılabilir. Aşağıdaki örnek, mySprite adında bir Sprite sınıfı örneği oluşturur ve mySprite öğesinin Sprite ve
DisplayObject sınıflarının bir örneği olup olmadığını ve IEventDispatcher arabirimini uygulayıp uygulamadığını test
etmek için is operatörünü kullanır:
var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite); // true
trace(mySprite is DisplayObject);// true
trace(mySprite is IEventDispatcher); // true
is operatörü, miras hiyerarşisini denetler ve mySprite örneğinin Sprite ve DisplayObject sınıflarıyla uyumlu
olduğunu düzgün şekilde bildirir. (Sprite sınıfı, DisplayObject sınıfının bir alt sınıfıdır.) is operatörü ayrıca mySprite
öğesinin IEventDispatcher arabirimini uygulayan herhangi bir sınıftan miras alıp almadığını da denetler. Sprite sınıfı,
IEventDispatcher arabirimini uygulayan IEventDispatcher sınıfından miras aldığından, is operatörü, mySprite
öğesinin aynı arabirimini uyguladığını doğru şekilde bildirir.
Aşağıdaki örnek, is operatörü yerine instanceof operatörünü kullanarak önceki örnekteki testlerin aynısını gösterir.
instanceof operatörü, mySprite öğesinin Sprite veya DisplayObject öğesinin bir örneği olduğunu doğru şekilde
tanımlar ancak mySprite öğesinin IEventDispatcher arabirimini uygulayıp uygulamadığını test etmek için
kullanıldığında false değerini döndürür.
trace(mySprite instanceof Sprite); // true
trace(mySprite instanceof DisplayObject);// true
trace(mySprite instanceof IEventDispatcher); // false
as operatörü
ActionScript 3.0'da yeni olan as operatörü, bir ifadenin belirli bir veri türünün üyesi olup olmadığını denetlemenize
olanak sağlar. Ancak is operatöründen farklı olarak as operatörü bir Boolean değeri döndürmez. as operatörü, true
yerine ifadenin değerini ve false yerine de null değerini döndürür. Aşağıdaki örnek, Sprite örneğinin DisplayObject,
IEventDispatcher ve Number veri türlerinden hangisinin üyesi olduğunu denetleme gibi basit bir durumda is
operatörü yerine as operatörü kullanılmasının sonuçlarını gösterir.
var mySprite:Sprite = new Sprite();
trace(mySprite as Sprite); // [object Sprite]
trace(mySprite as DisplayObject); // [object Sprite]
trace(mySprite as IEventDispatcher); // [object Sprite]
trace(mySprite as Number);
// null
as operatörünü kullandığınızda, sağdaki işlenenin bir veri türü olması gerekir. Sağdaki işlenen olarak veri türü dışında
bir ifade kullanma girişimi hataya yol açar.
Dinamik sınıflar
Dinamik sınıf, özellikler ve yöntemler eklenerek veya değiştirilerek çalışma zamanında değiştirilebilen bir nesneyi
tanımlar. String sınıfı gibi, dinamik olmayan bir sınıf mühürlenmiş bir sınıftır. Mühürlenmiş bir sınıfa çalışma
zamanında özellikler veya yöntemler ekleyemezsiniz.
Bir sınıfı bildirirken, dynamic niteliğini kullanarak dinamik sınıflar oluşturursunuz. Örneğin, aşağıdaki kod, Protean
adında dinamik bir sınıf oluşturur:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 56
ActionScript dili ve sözdizimi
dynamic class Protean
{
private var privateGreeting:String = "hi";
public var publicGreeting:String = "hello";
function Protean()
{
trace("Protean instance created");
}
}
Daha sonra Protean sınıfının bir örneğini başlatırsanız, sınıf tanımının dışında buna özellikler veya yöntemler
ekleyebilirsiniz. Örneğin, aşağıdaki kod, Protean sınıfının bir örneğini oluşturur ve örneğe aString adında bir özellik
ve aNumber adında bir özellik ekler:
var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
trace(myProtean.aString, myProtean.aNumber); // testing 3
Dinamik sınıf örneğine eklediğiniz özellikler çalışma zamanı varlıklardır, bu nedenle tüm denetlemeleri çalışma
zamanında yapılır. Bu şekilde eklediğiniz bir özelliğe tür ek açıklaması ekleyemezsiniz.
Ayrıca bir işlev tanımlayıp bu işlevi myProtean örneğinin bir özelliğine ekleyerek myProtean örneğine bir yöntem
ekleyebilirsiniz. Aşağıdaki kod, izleme deyimini traceProtean() adındaki bir yönteme taşır:
var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
myProtean.traceProtean = function ()
{
trace(this.aString, this.aNumber);
};
myProtean.traceProtean(); // testing 3
Ancak bu şekilde oluşturulan yöntemlerin, Protean sınıfının özel özelliklerine veya yöntemlerine erişimi yoktur.
Ayrıca, Protean sınıfının genel özelliklerine veya yöntemlerine başvuruların da this anahtar sözcüğüyle ya da sınıf
adıyla nitelenmesi gerekir. Aşağıdaki örnek, Protean sınıfının özel ve genel değişkenlerine erişmeye çalışan
traceProtean() yöntemini gösterir.
myProtean.traceProtean = function ()
{
trace(myProtean.privateGreeting); // undefined
trace(myProtean.publicGreeting); // hello
};
myProtean.traceProtean();
Veri türleri açıklamaları
İlkel veri türleri arasında Boolean, int, Null, Number, String, uint ve void yer alır. ActionScript çekirdek sınıfları ayrıca
şu karmaşık veri türlerini de tanımlar: Object, Array, Date, Error, Function, RegExp, XML ve XMLList.
Boolean veri türü
Boolean veri türü iki değer içerir: true ve false. Boolean türündeki değişkenler için diğer değerler geçerli değildir.
Bildirilmiş ancak başlatılmamış bir Boolean değişkeninin varsayılan değeri false olur.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 57
ActionScript dili ve sözdizimi
int veri türü
int veri türü, dahili şekilde 32-bit tam sayı olarak saklanır ve
-2.147.483.648 (-231) ile 2.147.483.647 (231 - 1) (dahil) arasındaki tam sayılar kümesini kapsar. Önceki ActionScript
sürümleri yalnızca hem tam sayı hem de kayan nokta sayıları için kullanılan Number veri türünü sunardı. ActionScript
3.0'da şimdi 32-bit işaretli ve işaretsiz tam sayılar için düşük düzeyli makine türlerine erişiminiz vardır. Değişkeniniz
kayan nokta sayılarını kullanmayacaksa, Number veri türü yerine int veri türünün kullanılması hem daha hızlı hem
de daha etkili olur.
Minimum ve maksimum int değerleri aralığı dışında kalan tam sayı değerleri için, pozitif ve negatif
9.007.199.254.740.992 arasındaki değerleri (53-bit tam sayı değerleri) işleyebilen Number veri türünü kullanın. int veri
türündeki değişkenler için varsayılan değer 0'dır.
Null veri türü
Null veri türü yalnızca bir değer içerir, null. Bu, String veri türü için ve Object sınıfı da dahil olmak üzere karmaşık
veri türlerini tanımlayan tüm sınıflar için varsayılan değerdir. Boolean, Number, int ve uint gibi diğer ilkel veri
türlerinin hiçbiri null değerini içermez. null değerini, Boolean, Number, int veya uint türündeki değişkenlere
atamaya çalıştığınızda, Flash Player ve Adobe AIR, null değerini uygun varsayılan değere dönüştürür. Bu veri türünü
tür ek açıklaması olarak kullanamazsınız.
Number veri türü
ActionScript 3.0'da Number veri türü, tam sayıları, işaretsiz tam sayıları ve kayan nokta sayılarını temsil edebilir.
Ancak, performansı en üst düzeye çıkarmak için, Number veri türünü yalnızca 32-bit int ve uint türlerinin
saklayamayacağı kadar büyük tam sayı değerleri için ve kayan nokta sayıları için kullanmanız gerekir. Bir kayan nokta
sayısını saklamak için, sayıya bir ondalık işareti dahil edin. Ondalık işaretini çıkarırsanız, sayı bir tam sayı olarak
saklanır.
Number veri türü, İkili Kayan Nokta Aritmetiği için IEEE Standardı (IEEE-754) tarafından belirtilen 64-bit çift
kesinlikli formatı kullanır. Bu standart, kayan nokta sayılarının mevcut 64 bit kullanılarak nasıl saklanacağını dikte
eder Sayının pozitif veya negatif olduğunu belirlemek için tek bir bit kullanılır. Taban 2 olarak saklanan üs için on bir
bit kullanılır. Kalan 52 bit, üssün belirttiği kuvvete yükseltilen sayı olan significand öğesini (mantissa olarak da
adlandırılır) saklamak için kullanılır.
Number veri türü, bir üssü saklamak için bit'lerinden bir kısmını kullanarak, significand için tüm bit'leri kullandığında
saklayabildiğinden çok daha büyük kayan nokta sayılarını saklayabilir. Örneğin, Number veri türü, significand öğesini
saklamak için tüm 64 bit'i de kullansaydı, 265 - 1 büyüklüğünde bir sayıyı saklayabilirdi. Number veri türü bir üssü
saklamak için 11 bit kullanarak, significand öğesini 21023 kuvvetine yükseltebilir.
Number türünün temsil edebildiği maksimum ve minimum değerler, Number sınıfının Number.MAX_VALUE ve
Number.MIN_VALUE adındaki statik özelliklerinde saklanır.
Number.MAX_VALUE == 1.79769313486231e+308
Number.MIN_VALUE == 4.940656458412467e-324
Bu sayı aralığı büyük olsa da, bu geniş aralık kesinlik düzeyini azaltır. Number veri türü, significand öğesini saklamak
için 52 bit kullanır ve bu da, kesin şekilde temsil edilecek 52 bit'ten fazlasını gerektiren sayıların (örn. 1/3 kesiri)
yalnızca yaklaşık değerler olmasına neden olur. Uygulamanız için ondalık sayılarda mutlak kesinlik gerekiyorsa, ikili
kayan nokta aritmetiğinin tersine ondalık kayan nokta aritmetiğini uygulayan bir yazılım kullanmanız gerekir.
Number veri türünde tam sayı değerlerini sakladığınızda, significand öğesinin yalnızca 52 bit'i kullanılır. Number veri
türü, -9.007.199.254.740.992 (-253) ile 9.007.199.254.740.992 (253) arasındaki tam sayıları temsil etmek için bu 52 bit'i
ve özel gizlenmiş bit'i kullanır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 58
ActionScript dili ve sözdizimi
Flash Player ve Adobe AIR, NaN değerini yalnızca Number türündeki değişkenler için varsayılan değer olarak değil, aynı
zamanda bir sayı döndürmesi gerektiği halde sayı döndürmeyen herhangi bir işlemin sonucu olarak da kullanır.
Örneğin, negatif bir sayının kare kökünü hesaplamayı denerseniz, sonuç NaN olur. Diğer özel Number değerleri
arasında pozitif sonsuzluk ve negatif sonsuzluk yer alır.
Not: 0 değerine bölme işleminin sonucu, yalnızca bölen de 0 olduğunda NaN değerini verir. 0 değerine bölme işlemi,
bölen pozitif olduğunda infinity değerini, bölen negatif olduğunda ise -infinity değerini verir.
String veri türü
String veri türü, 16-bit karakterlerin bir sırasını temsil eder. Dizeler, UTF-16 formatı kullanılarak dahili şekilde
Unicode karakterleri olarak saklanır. Dizeler, Java programlama dilinde olduğu gibi, sabit değerlerdir. String
değerindeki bir işlem, yeni bir dize örneği döndürür. String veri türüyle bildirilen bir değişkenin varsayılan değeri,
null şeklindedir. null değeri de boş dize ("") gibi herhangi bir karakter olmadığını temsil etse de, bunun ikisi aynı
değildir.
uint veri türü
uint veri türü, dahili şekilde 32-bit işaretsiz tam sayı olarak saklanır ve 0 ile 4.294.967.295 (232 - 1) arasındaki tam
sayıların kümesini kapsar. Negatif olmayan tam sayıları çağıran özel koşullar için uint veri türünü kullanın. Örneğin,
int veri türü, renk değerlerinin işlenmesi için uygun olmayan dahili bir işaret bit'i içerdiğinden, piksel rengi değerlerini
temsil etmek için uint veri türünü kullanmanız gerekir. Maksimum uint değerinden büyük tam sayı değerleri için, 53bit tam sayı değerlerini işleyebilen Number veri türünü kullanın. uint veri türündeki değişkenler için varsayılan değer
0'dır.
void veri türü
Void veri türü yalnızca bir değer içerir, undefined. Önceki ActionScript sürümlerinde undefined, Object sınıfının
örnekleri için varsayılan değerdi. ActionScript 3.0'da, Object örneklerinin varsayılan değeri null şeklindedir. Object
sınıfının bir örneğine undefined değerini atamaya çalışırsanız, Flash Player veya Adobe AIR, bu değeri null değerine
dönüştürür. Türlenmemiş değişkenlere yalnızca undefined değerini atayabilirsiniz. Türlenmemiş değişkenler, tür ek
açıklaması içermeyen veya tür ek açıklaması için yıldız (*) sembolünü kullanan değişkenlerdir. Döndürme tür ek
açıklaması olarak yalnızca void öğesini kullanabilirsiniz.
Object veri türü
Object veri türü, Object sınıfı tarafından tanımlanır. Object sınıfı, ActionScript'teki tüm sınıf tanımlamaları için temel
sınıf görevi görür. Object veri türünün ActionScript 3.0 sürümü, önceki sürümlerden üç şekilde farklılık gösterir. İlk
olarak, Object veri türü artık tür ek açıklaması içermeyen değişkenlere atanan varsayılan veri türü değildir. İkinci
olarak, Object veri türü, Object örneklerinin varsayılan değeri olarak kullanılan undefined değerini artık içermez.
Üçüncü olarak, ActionScript 3.0'da, Object sınıfının örnekleri için varsayılan değer null şeklindedir.
Önceki ActionScript sürümlerinde, Object veri türüne tür ek açıklaması içermeyen bir değişken otomatik olarak
atanırdı. Artık türlenmemiş değişken kavramını içeren ActionScript 3.0'da bu geçerli değildir. Tür ek açıklaması
içermeyen değişkenler artık türlenmemiş olarak değerlendirilir. Kod okuyucularınıza, amacınızın bir değişkeni
türlenmemiş şekilde bırakmak olduğunu açıkça belirtmek isterseniz, tür ek açıklamasının çıkarılmasına eşdeğer
şekilde, tür ek açıklaması için yeni yıldız (*) sembolünü kullanabilirsiniz. Aşağıdaki örnekte, her ikisi de x türlenmemiş
değişkenini bildiren iki eşdeğer deyim gösterilmektedir:
var x
var x:*
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 59
ActionScript dili ve sözdizimi
Yalnızca türlenmemiş değişkenler undefined değerini barındırabilir. Bir veri türüne sahip değişkene undefined
değerini atamaya çalışırsanız, Flash Player veya Adobe AIR uygulaması, undefined değerini o veri türünün varsayılan
değerine dönüştürür. Object veri türünün örnekleri için varsayılan değer null olup bu, bir Object örneğine
undefined değerini atamaya çalışırsanız Flash Player veya Adobe AIR uygulamasının undefined değerini null
değerine dönüştüreceği anlamına gelir.
Tür dönüştürmeleri
Bir değer farklı veri türünde bir değere dönüştürüldüğünde, tür dönüştürmesi gerçekleştirilmiş olur. Tür
dönüştürmeleri örtük veya açıkça olabilir. Zorlama olarak da adlandırılan örtük dönüştürme, bazen Flash Player veya
Adobe AIR uygulaması tarafından çalışma zamanında gerçekleştirilir. Örneğin, Boolean veri türündeki bir değişkene
2 değeri atanırsa, Flash Player veya Adobe AIR uygulaması, değeri değişkene atamadan önce 2 değerini true Boolean
değerine dönüştürür. Çevrim olarak da adlandırılan açıkça dönüştürme, kodunuz derleyiciye bir veri türündeki
değişkeni farklı bir veri türüne aitmiş gibi değerlendirmesini bildirdiğinde gerçekleşir. İlkel değerler bulunduğunda,
çevrim gerçek anlamda değerleri bir veri türünden diğerine dönüştürür. Bir nesneyi farklı bir türe çevirmek için, nesne
adını parantez içine alıp ve bunun başına yeni türün adını getirirsiniz. Örneğin, aşağıdaki kod bir Boolean değerini alıp
tam sayıya çevirir:
var myBoolean:Boolean = true;
var myINT:int = int(myBoolean);
trace(myINT); // 1
Örtük dönüştürmeler
Örtük dönüştürmeler, birçok bağlamda çalışma zamanında gerçekleşir:
• Atama deyimlerinde
• Değerler işlev argümanları olarak iletildiğinde
• Değerler işlevlerden döndürüldüğünde
• Toplama (+) operatörü gibi belirli operatörleri kullanan ifadelerde
Kullanıcı tanımlı türler için örtük dönüştürmeler, dönüştürülecek değer hedef sınıfın bir örneği veya hedef sınıftan
türetilmiş bir sınıf olduğunda gerçekleşir. Örtük dönüştürme başarısız olursa bir hata oluşur. Örneğin, aşağıdaki
kod başarılı bir örtük dönüştürme ve başarısız bir örtük dönüştürme içerir:
class A {}
class B extends A {}
var objA:A = new A();
var objB:B = new B();
var arr:Array = new Array();
objA = objB; // Conversion succeeds.
objB = arr; // Conversion fails.
İlkel türler için örtük dönüştürmeler, açıkça dönüştürme işlevleri tarafından çağrılan aynı dahili dönüştürme
algoritmaları çağrılarak işlenir. İlerleyen bölümlerde bu ilkel tür dönüştürmeleri ayrıntılı şekilde ele alınmıştır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 60
ActionScript dili ve sözdizimi
Açıkça dönüştürmeler
Derleme zamanı hatası oluşturacak bir tür uyuşmazlığı istemediğiniz zamanlar olabileceğinden, katı modda derleme
yaparken açıkça dönüştürmeleri veya çevrimi kullanmanız yararlı olur. Zorlamanın değerlerinizi çalışma zamanında
doğru şekilde dönüştüreceğini bildiğinizde bu durum geçerli olabilir. Örneğin, bir formdan alınan verilerle
çalıştığınızda, belirli dize değerlerini sayısal değerlere dönüştürmek için zorlamayı uygulamak isteyebilirsiniz.
Aşağıdaki kod, standart modda doğru şekilde de çalışsa, bir derleme zamanı hatası oluşturur:
var quantityField:String = "3";
var quantity:int = quantityField; // compile time error in strict mode
Katı modu kullanmaya devam etmek ancak bir yandan da dizenin bir tam sayıya dönüştürülmesini istiyorsanız,
aşağıdaki gibi açıkça dönüştürmeyi kullanabilirsiniz:
var quantityField:String = "3";
var quantity:int = int(quantityField); // Explicit conversion succeeds.
int, uint ve Number türlerine çevrim
Herhangi bir veri türünü üç sayı türünden birine çevirebilirsiniz: int, uint ve Number. Flash Player veya Adobe AIR
uygulaması herhangi bir nedenle sayıyı dönüştüremezse, int ve uint veri türleri için 0 varsayılan değeri atanır ve
Number veri türü için de NaN varsayılan değeri atanır. Bir Boolean değerini bir sayıya dönüştürürseniz, true değeri 1
ve false değeri de 0 olur.
var myBoolean:Boolean = true;
var myUINT:uint = uint(myBoolean);
var myINT:int = int(myBoolean);
var myNum:Number = Number(myBoolean);
trace(myUINT, myINT, myNum); // 1 1 1
myBoolean = false;
myUINT = uint(myBoolean);
myINT = int(myBoolean);
myNum = Number(myBoolean);
trace(myUINT, myINT, myNum); // 0 0 0
Yalnızca rakam içeren dize değerleri, sayı türlerinden birine başarıyla dönüştürülebilir. Sayı türleri ayrıca negatif sayı
gibi görünen dizeleri veya onaltılık bir değeri (örneğin, 0x1A) temsil eden dizeleri dönüştürebilir. Dönüştürme işlemi,
dize değerinin başındaki ve sonundaki boşluk karakterlerini yoksayar. Ayrıca Number() öğesini kullanarak kayan
nokta sayısı gibi görünen dizeleri de çevirebilirsiniz. Ondalık işareti eklenmesi, uint() ve int() öğelerinin, ondalık
işaretini ve bu işareti takip eden karakterleri kırparak bir tam sayı döndürmesine neden olur. Örneğin, aşağıdaki dize
değerleri sayılara çevrilebilir:
trace(uint("5")); // 5
trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUE
trace(uint(" 27 ")); // 27
trace(uint("3.7")); // 3
trace(int("3.7")); // 3
trace(int("0x1A")); // 26
trace(Number("3.7")); // 3.7
Sayısal olmayan karakterler içeren dize değerleri, int() veya uint() ile çevrildiğinde 0 değerini; Number() ile
çevrildiğinde ise NaN değerini döndürür. Dönüştürme işlemi, baştaki ve sondaki boşlukları yoksayar ancak dizede iki
sayıyı ayıran bir boşluk varsa, 0 veya NaN değerini döndürür.
trace(uint("5a")); // 0
trace(uint("ten")); // 0
trace(uint("17 63")); // 0
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 61
ActionScript dili ve sözdizimi
ActionScript 3.0'da, Number() işlevi artık sekizlik veya 8 tabanlı sayıları desteklemez. ActionScript 2.0 Number()
işlevine başında sıfır bulunan bir dize sağlarsanız, sayı sekizlik bir sayı olarak yorumlanır ve ondalık eşdeğerine
dönüştürülür. ActionScript 3.0'daki Number() işlevinde ise bu geçerli değildir, burada baştaki sıfır yoksayılır. Örneğin,
aşağıdaki kod, farklı ActionScript sürümleri kullanılarak derlendiğinde farklı çıktı oluşturur:
trace(Number("044"));
// ActionScript 3.0 44
// ActionScript 2.0 36
Bir sayısal türdeki değer, farklı bir sayısal türdeki değişkene atandığında çevrim gerekmez. Katı modda da sayısal türler
örtük olarak başka sayısal türlere dönüştürülür. Başka bir deyişle, bazı durumlarda bir tür aralığı aşıldığında
beklenmeyen değerler ortaya çıkabilir. Aşağıdaki değerlerin bazıları beklenmeyen değerler oluştursa da, tümü katı
modda derlenir:
var myUInt:uint = -3; // Assign int/Number value to uint variable
trace(myUInt); // 4294967293
var myNum:Number = sampleUINT; // Assign int/uint value to Number variable
trace(myNum) // 4294967293
var myInt:int = uint.MAX_VALUE + 1; // Assign Number value to uint variable
trace(myInt); // 0
myInt = int.MAX_VALUE + 1; // Assign uint/Number value to int variable
trace(myInt); // -2147483648
Aşağıdaki tabloda, başka veri türlerinden Number, int veya uint veri türüne çevrim sonuçları özetlenmektedir.
Veri türü veya değeri
Number, int veya uint türüne dönüştürme sonucu
Boolean
Değer true olursa, 1; aksi takdirde, 0.
Date
Date nesnesinin dahili temsili; bu, 1 Ocak 1970, gece yarısı evrensel saatinden bu yana geçen milisaniye
sayısıdır.
null
0
Object
Örnek null olursa ve Number türüne dönüştürülürse, NaN; aksi takdirde, 0.
String
Flash Player veya Adobe AIR uygulaması dizeyi bir sayıya dönüştürebilirse bir sayı; aksi takdirde Number türüne
dönüştürülürse, NaN veya int ya da uint türüne dönüştürülürse 0.
undefined
Number türüne dönüştürülürse, NaN; int veya uint türüne dönüştürülürse, 0.
Boolean değerine çevrim
Herhangi bir sayısal veri türünden (uint, int ve Number) Boolean değerine çevrim, sayısal değer 0 olursa false, aksi
takdirde true değerini verir. Number veri türü için, NaN değeri de false değerini verir. Aşağıdaki örnek, -1, 0 ve 1
sayılarının çevrim sonuçlarını gösterir:
var myNum:Number;
for (myNum = -1; myNum<2; myNum++)
{
trace("Boolean(" + myNum +") is " + Boolean(myNum));
}
Örnekten elde edilen çıktı, üç sayıdan yalnızca 0 sayısının false değeri döndürdüğünü gösterir:
Boolean(-1) is true
Boolean(0) is false
Boolean(1) is true
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 62
ActionScript dili ve sözdizimi
Bir String değerinden Boolean değerine çevrim, dize null veya boş dize ("") olduğunda false değerini döndürür.
Aksi takdirde, true değerini döndürür.
var str1:String; // Uninitialized string is null.
trace(Boolean(str1)); // false
var str2:String = ""; // empty string
trace(Boolean(str2)); // false
var str3:String = " "; // white space only
trace(Boolean(str3)); // true
Object sınıfı örneğinden Boolean değerine çevrim, örnek null ise false değerini; aksi takdirde true değerini
döndürür:
var myObj:Object; // Uninitialized object is null.
trace(Boolean(myObj)); // false
myObj = new Object(); // instantiate
trace(Boolean(myObj)); // true
Boolean değişkenleri katı modda özel değerlendirmeye tabidir; katı modda çevrim yapmadan herhangi bir veri
türündeki değerleri Boolean değişkenine atayabilirsiniz. Tüm veri türlerinden Boolean veri türüne örtük zorlama katı
modda da gerçekleşir. Başka bir deyişle, diğer tüm veri türlerinin hemen hemen hepsinden farklı olarak, katı mod
hatalarını önlemek için Boolean değerine çevrim gerekmez. Aşağıdaki örneklerin tümü katı modda derleme yapar ve
çalışma zamanında beklendiği şekilde davranır:
var myObj:Object = new Object(); // instantiate
var bool:Boolean = myObj;
trace(bool); // true
bool = "random string";
trace(bool); // true
bool = new Array();
trace(bool); // true
bool = NaN;
trace(bool); // false
Aşağıdaki tabloda, başka veri türlerinden Boolean veri türüne çevrim sonuçları özetlenmektedir:
Veri türü veya değeri
Boolean değerine dönüştürme sonucu
String
Değer null veya boş dize ("") olursa false; aksi takdirde true.
null
false
Number, int veya uint
Değer NaN veya 0 olursa false; aksi takdirde true.
Object
Örnek null olursa false; aksi takdirde true.
String türüne çevrim
Herhangi bir sayısal veri türünden String veri türüne çevrim, sayının dize halinde temsilini döndürür. Bir Boolean
değerinden String veri türüne çevrim, değer true olursa "true" dizesini ve değer false olursa "false" dizesini
döndürür.
Bir Object sınıfı örneğinden String veri türüne çevrim, örnek null olursa "null" dizesini döndürür. Aksi takdirde,
Object sınıfından String türüne çevrim, "[object Object]" dizesini döndürür.
Array sınıfı örneğinden String türüne çevrim, tüm dizi öğelerinin virgül sınırlı bir listesini içeren bir dize döndürür.
Örneğin, aşağıdaki String veri türüne çevrim işlemi, dizideki üç öğeyi de içeren tek bir dize döndürür:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 63
ActionScript dili ve sözdizimi
var myArray:Array = ["primary", "secondary", "tertiary"];
trace(String(myArray)); // primary,secondary,tertiary
Date sınıfı örneğinden String türüne çevrim, örneğin içerdiği tarihin dize halinde temsilini döndürür. Örneğin,
aşağıdaki örnek, Date sınıfı örneğinin dize halinde temsilini döndürür (çıktıda Pasifik Yaz Saati sonucu
gösterilmektedir):
var myDate:Date = new Date(2005,6,1);
trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005
Aşağıdaki tabloda, başka veri türlerinden String veri türüne çevrim sonuçları özetlenmektedir.
Veri türü veya değeri
Dizeye dönüştürme sonucu
Array
Tüm dizi öğelerini içeren bir dize.
Boolean
"true" veya "false"
Date
Date nesnesinin dize halinde temsili.
null
"null"
Number, int veya uint
Sayının dize halinde temsili.
Object
Örnek null olursa, "null"; aksi takdirde, "[object Object]".
Sözdizimi
Bir dilin sözdizimi, çalıştırılabilir kod yazarken izlenmesi gereken kurallar kümesini tanımlar.
Büyük/küçük harf duyarlılığı
ActionScript 3.0, büyük/küçük harf duyarlı bir dildir. Yalnızca büyük/küçük harf durumu farklı olan tanımlayıcılar,
farklı tanımlayıcılar olarak değerlendirilir. Örneğin, aşağıdaki kod iki farklı değişken oluşturur:
var num1:int;
var Num1:int;
Nokta sözdizimi
Nokta operatörü (.), bir nesnenin özelliklerine ve yöntemlerine erişme yolu sağlar. Nokta sözdizimini kullanıp sırayla
örnek adı, nokta operatörü ve özellik veya yöntem adını kullanarak bir sınıf özelliğini ya da yöntemini ifade
edebilirsiniz. Örneğin, şu sınıf tanımını göz önünde bulundurun:
class DotExample
{
public var prop1:String;
public function method1():void {}
}
Nokta sözdizimini kullanıp aşağıdaki kodda oluşturulan örnek adını kullanarak prop1 özelliğine ve method1()
yöntemine erişebilirsiniz:
var myDotEx:DotExample = new DotExample();
myDotEx.prop1 = "hello";
myDotEx.method1();
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 64
ActionScript dili ve sözdizimi
Paketleri tanımlarken nokta sözdizimini kullanabilirsiniz. Yuvalanmış paketleri ifade etmek için nokta operatörünü
kullanırsınız. Örneğin, EventDispatcher sınıfı, flash adındaki paket içinde yuvalanmış events adındaki bir pakette
bulunur. Aşağıdaki ifadeyi kullanarak events paketini ifade edebilirsiniz:
flash.events
Bu ifadeyi kullanarak da EventDispatcher sınıfını ifade edebilirsiniz:
flash.events.EventDispatcher
Eğik çizgi sözdizimi
Eğik çizgi sözdizimi ActionScript 3.0'da desteklenmez. Eğik çizgi sözdizimi, bir film klibinin veya değişkenin yolunu
belirtmek için önceki ActionScript sürümlerinde kullanılırdı.
Değişmez değerler
Değişmez değer, doğrudan kodunuzda görüntülenen bir değerdir. Aşağıdaki örneklerin tümü değişmezdir:
17
"hello"
-3
9.4
null
undefined
true
false
Değişmez değerler, bileşik değişmez değerler oluşturmak için de gruplandırılabilir. Dizi değişmezleri, köşeli ayraç
karakterleri ([]) içine alınır ve dizi öğelerini ayırmak için virgül kullanır.
Dizi değişmezi, bir diziyi başlatmak için kullanılabilir. Aşağıdaki örnekler, dizi değişmezleri kullanılarak başlatılan iki
diziyi gösterir. new deyimini kullanabilir ve bileşik değişmezi parametre olarak Array sınıfı yapıcısına iletebilirsiniz,
ancak değişmez değerleri şu ActionScript çekirdek sınıflarının örneklerini başlatırken doğrudan da atayabilirsiniz:
Object, Array, String, Number, int, uint, XML, XMLList ve Boolean.
// Use new statement.
var myStrings:Array = new Array(["alpha", "beta", "gamma"]);
var myNums:Array = new Array([1,2,3,5,8]);
// Assign literal directly.
var myStrings:Array = ["alpha", "beta", "gamma"];
var myNums:Array = [1,2,3,5,8];
Değişmez değerler, genel bir nesneyi başlatmak için de kullanılabilir. Genel bir nesne, Object sınıfının bir örneğidir.
Nesne değişmezleri küme ayraçları ({}) içine alınır ve nesne özelliklerini ayırmak için virgül kullanır. Her özellik,
özellik adını özelliğin değerinden ayıran iki nokta karakteri (:) ile bildirilir.
new deyimini kullanarak genel bir nesne oluşturabilir ve nesne değişmezini parametre olarak Object sınıfı yapıcısına
iletebilir veya nesne değişmezini, bildirdiğiniz örneğe doğrudan atayabilirsiniz. Aşağıdaki örnek, yeni bir genel nesne
oluşturup her biri sırayla 1, 2 ve 3 değerlerine ayarlanmış üç özellikle (propA, propB ve propC) nesneyi başlatmanın
iki alternatif yolunu gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 65
ActionScript dili ve sözdizimi
// Use new statement and add properties.
var myObject:Object = new Object();
myObject.propA = 1;
myObject.propB = 2;
myObject.propC = 3;
// Assign literal directly.
var myObject:Object = {propA:1, propB:2, propC:3};
Daha fazla bilgi için, bkz. “Dizelerin temelleri” sayfa 138, “Normal ifadelerin temelleri” sayfa 202 ve “XML
değişkenlerini başlatma” sayfa 230.
Noktalı virgüller
Bir deyimi sonlandırmak için noktalı virgül karakterini (;) kullanabilirsiniz. Alternatif olarak, noktalı virgül
karakterini çıkarırsanız, derleyici, her kod satırının tek bir deyimi temsil ettiğini varsayar. Programcıların çoğu deyim
sonunu belirtmek için noktalı virgül kullanmaya alışkın olduğundan, deyimlerinizi sonlandırmak için sürekli olarak
noktalı virgül kullanırsanız, kodunuzun okunması daha kolay olabilir.
Bir deyimi sonlandırmak için noktalı virgül kullanmanız, tek bir satıra birden çok deyim yerleştirmenize olanak sağlar
ancak bu, kodunuzun okunmasını güçleştirebilir.
Parantezler
ActionScript 3.0'da parantezleri (()) üç şekilde kullanabilirsiniz. İlk olarak, bir ifadedeki işlemlerin sırasını
değiştirmek için parantezleri kullanabilirsiniz. Parantezler içinde gruplandırılan işlemler her zaman önce çalıştırılır.
Örneğin, aşağıdaki kodda işlemlerin sırasını değiştirmek için parantezler kullanılmıştır:
trace(2 + 3 * 4); // 14
trace((2 + 3) * 4); // 20
İkinci olarak, aşağıdaki örnekte olduğu gibi, bir ifadeler dizisini değerlendirmek ve son ifadenin sonucunu döndürmek
için virgül operatörüyle (,) birlikte parantezleri kullanabilirsiniz:
var a:int = 2;
var b:int = 3;
trace((a++, b++, a+b)); // 7
Üçüncü olarak, aşağıdaki örnekte gösterildiği gibi, işlevlere veya yöntemlere bir ya da daha fazla parametre iletmek için
parantezleri kullanabilirsiniz, böylece trace() işlevine bir String değeri iletilir:
trace("hello"); // hello
Yorumlar
ActionScript 3.0 kodu, iki tür yorumu destekler: tek satırlı yorumlar ve çok satırlı yorumlar. Bu yorumlama
mekanizması, C++ ve Java uygulamalarındaki yorumlama mekanizmalarına benzer. Derleyici, yorum olarak
işaretlenen metni yoksayar.
Tek satırlı yorumlar, iki eğik çizgi karakteriyle (//) başlar ve satırın sonuna kadar devam eder. Örneğin, aşağıdaki
kodda tek satırlı bir yorum bulunmaktadır:
var someNumber:Number = 3; // a single line comment
Çok satırlı yorumlar, bir eğik çizgi ve yıldız işareti (/*) ile başlar ve bir yıldız işareti ve eğik çizgi (*/) ile sona erer.
/* This is multiline comment that can span
more than one line of code. */
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 66
ActionScript dili ve sözdizimi
Anahtar sözcükler ve ayrılmış sözcükler
Ayrılmış sözcükler, ActionScript tarafından kullanılmak üzere ayrılmış olduğundan, kodunuzda tanımlayıcılar olarak
kullanamadığınız sözcüklerdir. Ayrılmış sözcükler arasında, derleyici tarafından programdan kaldırılmayan sözlü
anahtar sözcükler yer alır. Tanımlayıcı olarak sözlü bir anahtar sözcük kullanırsanız, derleyici bir hata bildirir.
Aşağıdaki tabloda, ActionScript 3.0 sözlü anahtar sözcükleri listelenmektedir.
as
break
case
catch
class
const
continue
default
delete
do
else
extends
false
finally
for
function
if
implements
import
in
instanceof
interface
internal
is
native
new
null
package
private
protected
public
return
super
switch
this
throw
to
true
try
typeof
use
var
void
while
with
Sözdizimi anahtar sözcükleri adı verilen, tanımlayıcı olarak kullanılabilen ancak belirli bağlamlarda özel anlamı olan
küçük bir anahtar sözcükleri kümesi vardır. Aşağıdaki tabloda, ActionScript 3.0 sözdizimi anahtar sözcükleri
listelenmektedir.
each
get
set
namespace
include
dynamic
final
native
override
static
Ayrıca bazen gelecekteki ayrılmış sözcükler olarak ifade edilen birkaç tanımlayıcı da vardır. Bu tanımlayıcılardan
bazıları, ActionScript 3.0 içeren yazılımlar tarafından anahtar sözcük olarak değerlendirilebilse de, bunlar
ActionScript 3.0 tarafından ayrılmamıştır. Bu tanımlayıcıların çoğunu kodunuzda kullanabilirsiniz ancak bunlar
sonraki dil sürümlerinde anahtar sözcük olarak görünebileceğinden, Adobe, bunları kullanmamanızı önerir.
abstract
boolean
byte
cast
char
debugger
double
enum
export
float
goto
intrinsic
long
prototype
short
synchronized
throws
to
transient
type
virtual
volatile
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 67
ActionScript dili ve sözdizimi
Sabitler
ActionScript 3.0, sabitler oluşturmak için kullanabildiğiniz const deyimini destekler. Sabitler, değiştirilemeyen sabit
bir değere sahip özelliklerdir. Bir sabite yalnızca bir defa değer atayabilirsiniz ve atamanın, sabitin bildirimine yakın
bir yerde gerçekleşmesi gerekir. Örneğin, bir sabit bir sınıfın üyesi olarak bildirilirse, bu sabite yalnızca bildirimin
parçası olarak veya sınıf yapıcısının içinde bir değer atayabilirsiniz.
Aşağıdaki kod iki sabit bildirir. Birinci sabit olan MINIMUM, bildirim deyiminin parçası olarak atanmış bir değere
sahiptir. İkinci sabit olan MAXIMUM, yapıcıda atanmış bir değere sahiptir. Katı mod bir sabitin değerinin yalnızca
başlatma zamanında atanmasına olanak sağladığından, bu örneğin yalnızca standart modda derleme yaptığını
unutmayın.
class A
{
public const MINIMUM:int = 0;
public const MAXIMUM:int;
public function A()
{
MAXIMUM = 10;
}
}
var a:A = new A();
trace(a.MINIMUM); // 0
trace(a.MAXIMUM); // 10
Bir sabite başka bir şekilde bir başlangıç değeri atamayı denerseniz bir hata oluşur. Örneğin, sınıfın dışında MAXIMUM
başlangıç değerini ayarlamaya çalışırsanız, bir çalışma zamanı hatası oluşur.
class A
{
public const MINIMUM:int = 0;
public const MAXIMUM:int;
}
var a:A = new A();
a["MAXIMUM"] = 10; // run-time error
ActionScript 3.0, kullanmanız için çok çeşitli sabitleri tanımlar. Kural gereği, ActionScript'teki sabitlerin tümü, alt çizgi
karakteri (_) ile ayrılmış sözcüklerde büyük harf kullanır. Örneğin, MouseEvent sınıfı tanımı, her biri fare girdisiyle
ilgili bir olayı temsil eden sabitleri için bu adlandırma kuralını kullanır:
package flash.events
{
public class MouseEvent extends Event
{
public static const CLICK:String = "click";
public static const DOUBLE_CLICK:String = "doubleClick";
public static const MOUSE_DOWN:String = "mouseDown";
public static const MOUSE_MOVE:String = "mouseMove";
...
}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 68
ActionScript dili ve sözdizimi
Operatörler
Operatörler, bir veya birkaç işleneni alıp bir değer döndüren özel işlevlerdir. İşlenen, bir operatörün girdi olarak
kullandığı, genellikle değişmez değer, değişken veya ifade olan bir değerdir. Örneğin, aşağıdaki kodda bir değer
döndürmek için, üç değişmez işlenenle (2, 3 ve 4) toplama (+) ve çarpma (*) operatörleri kullanılır. Daha sonra,
döndürülen değeri (14) sumNumber değişkenine atamak için atama (=) operatörü tarafından bu değer kullanılır.
var sumNumber:uint = 2 + 3 * 4; // uint = 14
Operatörler tekli, ikili veya üçlü olabilir. Tekli operatör tek bir işlenen alır. Örneğin, artırma (++) operatörü tek bir
işlenen aldığından tekli bir operatördür. İkili operatör iki işlenen alır. Örneğin, bölme (/) operatörü iki işlenen alır.
Üçlü operatör üç işlenen alır. Örneğin, koşul (?:) operatörü üç işlenen alır.
Bazı operatörler aşırı yüklüdür, başka bir deyişle, kendilerine iletilen işlenenlerin türüne ve miktarına bağlı olarak
farklı şekilde davranır. Toplama (+) operatörü, işlenenlerin veri türüne bağlı olarak farklı şekilde davranan bir aşırı
yüklü operatör örneğidir. Her iki işlenen de sayı olursa, toplama operatörü değerlerin toplamını döndürür. Her iki
işlenen de dize olursa, toplama operatörü iki işlenenin bitiştirilmiş halini döndürür. Aşağıdaki örnek kod, işlenenlere
bağlı olarak operatörün nasıl farklı şekilde davrandığını gösterir:
trace(5 + 5); // 10
trace("5" + "5"); // 55
Operatörler de sağlanan işlenenlerin sayısına bağlı olarak farklı şekilde davranabilir. Çıkarma (-) operatörü hem tekli
hem de ikili bir operatördür. Yalnızca bir işlenen sağlandığında, çıkarma operatörü işleneni negatif duruma getirip
sonucu döndürür. İki işlenen sağlandığında, çıkarma operatörü işlenenlerin farkını döndürür. Aşağıdaki örnek, ilk
olarak tekli operatör olarak ve sonra da ikili operatör olarak kullanılan çıkarma operatörünü gösterir.
trace(-3); // -3
trace(7 - 2); // 5
Operatör önceliği ve ilişkilendirilebilirlik
Operatör önceliği ve ilişkilendirilebilirliği, operatörlerin işleneceği sırayı belirler. Derleyicinin, toplama (+)
operatöründen önce çarpma (*) operatörünü işlediği aritmetiği bilenler için bu doğal görünse de, derleyicinin ilk
olarak hangi operatörlerin işleneceği hakkında açıkça talimatlara ihtiyacı vardır. Bu talimatların hepsi operatör önceliği
olarak ifade edilir. ActionScript, parantez (()) operatörünü kullanarak değiştirebileceğiniz varsayılan bir operatör
önceliğini tanımlar. Örneğin, aşağıdaki kod, derleyiciyi çarpma operatöründen önce toplama operatörünü işlemeye
zorlamak için önceki örnekteki varsayılan önceliği değiştirir:
var sumNumber:uint = (2 + 3) * 4; // uint == 20
Aynı önceliğe sahip iki veya daha fazla operatörün aynı ifadede bulunduğu durumlarla karşılaşabilirsiniz. Bu
durumlarda, derleyici, hangi operatörün önce işleneceğini belirlemek için ilişkilendirilebilirlik kurallarını kullanır.
Atama operatörleri dışındaki tüm ikili operatörler sola ilişkilendirilebilir, başka bir deyişle, soldaki operatörler, sağdaki
operatörlerden önce işlenir. Atama operatörleri ve koşul (?:) operatörü sağa ilişkilendirilebilir, başka bir deyişle,
sağdaki operatörler, soldaki operatörlerden önce işlenir.
Örneğin, aynı önceliğe sahip olan küçüktür (<) ve büyüktür (>) operatörlerini göz önünde bulundurun. Aynı ifadede
her iki operatör de kullanılırsa, her iki operatör de sola ilişkilendirilebilir olduğundan, soldaki operatör önce işlenir.
Başka bir deyişle, aşağıdaki iki deyim aynı çıktıyı oluşturur:
trace(3 > 2 < 1); // false
trace((3 > 2) < 1); // false
Büyüktür operatörü önce işlenir, bu da, 3 işleneni, 2 işleneninden büyük olduğundan true değerini verir. Daha sonra
true değeri, 1 işleneniyle birlikte küçüktür operatörüne iletilir. Aşağıdaki kod, bu ara durumu temsil eder:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 69
ActionScript dili ve sözdizimi
trace((true) < 1);
Küçüktür operatörü, true değerini 1 sayısal değerine dönüştürür ve bu sayısal değeri ikinci işlenen olan 1 ile
karşılaştırarak false değerini döndürür. (1 değeri 1'den küçük değildir.)
trace(1 < 1); // false
Parantez operatörüyle, varsayılan sola ilişkilendirilebilirliği değiştirebilirsiniz. Küçüktür operatörünü ve bu
operatörün işlenenlerini parantez içine alarak, derleyiciye, ilk önce küçüktür operatörünü işlemesini bildirebilirsiniz.
Aşağıdaki örnek, önceki örnekle aynı sayıları kullanarak farklı bir çıktı oluşturmak için parantez operatörünü kullanır:
trace(3 > (2 < 1)); // true
Küçüktür operatörü önce işlenir, bu da, 2 işleneni, 1 işleneninden küçük olmadığından false değerini verir. Daha
sonra false değeri, 3 işleneniyle birlikte büyüktür operatörüne iletilir. Aşağıdaki kod, bu ara durumu temsil eder:
trace(3 > (false));
Büyüktür operatörü, false değerini 0 sayısal değerine dönüştürür ve bu sayısal değeri diğer 3 işleneniyle
karşılaştırarak true değerini döndürür. (3 değeri 0'dan büyüktür.)
trace(3 > 0); // true
Aşağıdaki tabloda, azalan öncelik sırasıyla ActionScript 3.0'ın operatörleri listelenmektedir. Her tablo satırında, aynı
önceliğe sahip operatörler bulunmaktadır. Her operatör satırı, tablonun aşağısında görüntülenen satırdan daha yüksek
önceliğe sahiptir.
Grup
Operatörler
Birincil
[] {x:y} () f(x) new x.y x[y] <></> @ :: ..
Sonek
x++ x--
Tekli
++x --x + - ~ ! delete typeof void
Çarpma
* / %
Toplama
+ -
Bitsel kaydırma
<< >> >>>
İlişkili
< > <= >= as in instanceof is
Eşitlik
== != === !==
Bitsel AND
&
Bitsel XOR
^
Bitsel OR
|
Mantıksal AND
&&
Mantıksal OR
||
Koşul
?:
Atama
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Virgül
,
Birincil operatörler
Birincil operatörler arasında, Array ve Object değişmezleri oluşturmak, ifadeleri gruplandırmak, işlevleri çağırmak,
sınıf örneklerini başlatmak ve özelliklere erişmek için kullanılan operatörler yer alır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 70
ActionScript dili ve sözdizimi
Aşağıdaki tabloda listelendiği gibi, tüm birincil operatörler eşit önceliğe sahiptir. E4X belirtiminin parçası olan
operatörler, (E4X) notasyonuyla belirtilir.
Operatör
Gerçekleştirilen işlem
[]
Bir diziyi başlatır
{x:y}
Bir nesneyi başlatır
()
İfadeleri gruplandırır
f(x)
Bir işlevi çağırır
new
Bir yapıcıyı çağırır
x.y x[y]
Bir özelliğe erişir
<></>
Bir XMLList nesnesini (E4X) başlatır
@
Bir niteliğe (E4X) erişir
::
Bir adı (E4X) niteler
..
Bir alt XML öğesine (E4X) erişir
Sonek operatörleri
Sonek operatörleri bir operatörü alır ve değeri artırır veya azaltır. Bu operatörler tekli operatörler olsa da, yüksek
öncelikleri ve özel davranışları nedeniyle diğer tekli operatörlerden ayrı olarak sınıflandırılır. Sonek operatörü büyük
bir ifadenin parçası olarak kullanıldığında, sonek operatörü işlenmeden önce ifadenin değeri döndürülür. Örneğin,
aşağıdaki kod, değer artırılmadan önce xNum++ ifadesinin değerinin nasıl döndürüldüğünü gösterir:
var xNum:Number = 0;
trace(xNum++); // 0
trace(xNum); // 1
Aşağıdaki tabloda listelendiği gibi, tüm sonek operatörleri eşit önceliğe sahiptir:
Operatör
Gerçekleştirilen işlem
++
Artırır (sonek)
--
Azaltır (sonek)
Tekli operatörler
Tekli operatörler tek bir işlenen alır. Bu gruptaki artırma (++) ve azaltma (--) operatörleri, önekoperatörleridir, başka
bir deyişle, bunlar bir ifadede işlenenden önce görüntülenir. Önek operatörleri, tüm ifadenin değeri döndürülmeden
önce artırma veya azaltma işleminin tamamlanmasıyla sonek eşlerinden farklılık gösterir. Örneğin, aşağıdaki kod,
değer artırıldıktan sonra ++xNum ifadesinin değerinin nasıl döndürüldüğünü gösterir:
var xNum:Number = 0;
trace(++xNum); // 1
trace(xNum); // 1
Aşağıdaki tabloda listelendiği gibi, tüm tekli operatörler eşit önceliğe sahiptir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 71
ActionScript dili ve sözdizimi
Operatör
Gerçekleştirilen işlem
++
Artırır (önek)
--
Azaltır (önek)
+
Tekli +
-
Tekli - (değilleme)
!
Mantıksal NOT
~
Bitsel NOT
delete
Bir özelliği siler
typeof
Tür bilgilerini döndürür
void
Tanımsız değer döndürür
Çarpma operatörleri
Çarpma operatörleri iki işlenen alır ve çarpma, bölme veya modulo hesaplamaları yapar.
Aşağıdaki tabloda listelendiği gibi, tüm çarpma operatörleri eşit önceliğe sahiptir:
Operatör
Gerçekleştirilen işlem
*
Çarpma
/
Bölme
%
Modulo
Toplama operatörleri
Toplama operatörleri iki işlenen alır ve toplama veya çıkarma hesaplamaları yapar: Aşağıdaki tabloda listelendiği gibi,
tüm toplama operatörleri eşit önceliğe sahiptir:
Operatör
Gerçekleştirilen işlem
+
Toplama
-
Çıkarma
Bitsel kaydırma operatörleri
Bitsel kaydırma operatörleri iki işlenen alır ve birinci işlenenin bit'lerini ikinci işlenen tarafından belirtilen ölçüde
kaydırır. Aşağıdaki tabloda listelendiği gibi, tüm bitsel kaydırma operatörleri eşit önceliğe sahiptir:
Operatör
Gerçekleştirilen işlem
<<
Bitsel sola kaydırma
>>
Bitsel sağa kaydırma
>>>
Bitsel işaretsiz sağa kaydırma
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 72
ActionScript dili ve sözdizimi
İlgili operatörler
İlgili operatörler iki işlenen alır, bunların değerlerini karşılaştırır ve bir Boolean değeri döndürür. Aşağıdaki tabloda
listelendiği gibi, tüm ilgili operatörler eşit önceliğe sahiptir:
Operatör
Gerçekleştirilen işlem
<
Küçüktür
>
Büyüktür
<=
Küçüktür veya eşittir
>=
Büyüktür veya eşittir
as
Veri türünü kontrol eder
in
Nesne özelliklerini kontrol eder
instanceof
Prototip zincirini kontrol eder
is
Veri türünü kontrol eder
Eşitlik operatörleri
Eşitlik operatörleri iki işlenen alır, bunların değerlerini karşılaştırır ve bir Boolean değeri döndürür. Aşağıdaki tabloda
listelendiği gibi, tüm eşitlik operatörleri eşit önceliğe sahiptir:
Operatör
Gerçekleştirilen işlem
==
Eşitlik
!=
Eşitsizlik
===
Katı eşitlik
!==
Katı eşitsizlik
Bitsel mantıksal operatörler
Bitsel mantıksal operatörler iki işlenen alır ve bit düzeyinde mantıksal işlemler gerçekleştirir. Bitsel mantıksal
operatörler, öncelikleri konusunda farklılık gösterir ve azalan öncelik sırasıyla aşağıdaki tabloda listelenmektedir:
Operatör
Gerçekleştirilen işlem
&
Bitsel AND
^
Bitsel XOR
|
Bitsel OR
Mantıksal operatörler
Mantıksal operatörler iki işlenen alır ve bir Boolean sonucu döndürür. Mantıksal operatörler, öncelikleri konusunda
farklılık gösterir ve azalan öncelik sırasıyla aşağıdaki tabloda listelenmektedir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 73
ActionScript dili ve sözdizimi
Operatör
Gerçekleştirilen işlem
&&
Mantıksal AND
||
Mantıksal OR
Koşul operatörü
Koşul operatörü üçlü operatördür, başka bir deyişle, üç işlenen alır. Koşul operatörü, if..else koşul deyimini
uygulamanın kısayol yöntemidir.
Operatör
Gerçekleştirilen işlem
?:
Koşul
Atama operatörleri
Atama operatörleri iki işlenen alır ve bir işlenene diğer işlenenin değerini esas alarak bir değer atar. Aşağıdaki tabloda
listelendiği gibi, tüm atama operatörleri eşit önceliğe sahiptir:
Operatör
Gerçekleştirilen işlem
=
Atama
*=
Çarpma ataması
/=
Bölme ataması
%=
Modulo ataması
+=
Toplama ataması
-=
Çıkarma ataması
<<=
Bitsel sola kaydırma ataması
>>=
Bitsel sağa kaydırma ataması
>>>=
Bitsel işaretsiz sağa kaydırma ataması
&=
Bitsel AND ataması
^=
Bitsel XOR ataması
|=
Bitsel OR ataması
Koşullar
ActionScript 3.0, program akışını denetlemek için kullanabileceğiniz üç temel koşul deyimi sağlar.
if..else
if..else koşul deyimi, bir koşulu test etmenize ve bu koşul varsa bir kod bloğu çalıştırmanıza veya koşul yoksa
alternatif bir kod bloğu çalıştırmanıza olanak sağlar. Örneğin, aşağıdaki kod, x değerinin 20 değerini aşıp aşmadığını
test eder, aşıyorsa bir trace() işlevi oluşturur veya aşmıyorsa farklı bir trace() işlevi oluşturur:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 74
ActionScript dili ve sözdizimi
if (x > 20)
{
trace("x is > 20");
}
else
{
trace("x is <= 20");
}
Alternatif kod bloğu çalıştırmak istemiyorsanız, if deyimini else deyimi olmadan kullanabilirsiniz.
if..else if
if..else ifkoşul deyimini kullanarak, birden çok koşul için test yapabilirsiniz. Örneğin, aşağıdaki kod yalnızca x
değerinin 20 değerini aşıp aşmadığını değil, aynı zamanda x değerinin negatif olup olmadığını da test eder:
if (x > 20)
{
trace("x is > 20");
}
else if (x < 0)
{
trace("x is negative");
}
Bir if veya else deyiminden sonra yalnızca tek bir deyim geliyorsa, deyimin ayraç içine alınması gerekmez. Örneğin,
aşağıdaki kod ayraç kullanmaz:
if (x > 0)
trace("x
else if (x <
trace("x
else
trace("x
is positive");
0)
is negative");
is 0");
Ancak ayraç bulunmayan bir koşul deyimine daha sonra if deyimleri eklenirse beklenmedik davranış
oluşabileceğinden Adobe, her zaman ayraç kullanmanızı önerir. Örneğin, aşağıdaki kodda koşul true olarak
değerlendirilse de değerlendirilmese de, positiveNums değeri 1 artar:
var x:int;
var positiveNums:int = 0;
if (x > 0)
trace("x is positive");
positiveNums++;
trace(positiveNums); // 1
switch
Aynı koşul ifadesine bağlı birden çok çalıştırma yolunuz varsa switch deyimi kullanışlıdır. Bu, uzun if..else if
deyimleri dizisine benzer şekilde işlevsellik sağlar ancak daha kolay okunabilir. switch deyimi, bir Boolean değerinin
koşulunu test etmek yerine, bir ifade olarak değerlendirilir ve hangi kod bloğunun çalıştırılacağını belirlemek için
sonucu kullanır. Kod blokları bir case deyimiyle başlar ve bir break deyimiyle sona erer Örneğin, aşağıdaki switch
deyimi, Date.getDay() yönteminin döndürdüğü gün sayısını esas alarak haftanın gününü yazdırır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 75
ActionScript dili ve sözdizimi
var someDate:Date = new Date();
var dayNum:uint = someDate.getDay();
switch(dayNum)
{
case 0:
trace("Sunday");
break;
case 1:
trace("Monday");
break;
case 2:
trace("Tuesday");
break;
case 3:
trace("Wednesday");
break;
case 4:
trace("Thursday");
break;
case 5:
trace("Friday");
break;
case 6:
trace("Saturday");
break;
default:
trace("Out of range");
break;
}
Döngü
Döngü deyimleri, bir değerler veya değişkenler dizisi kullanarak art arda belirli bir kod bloğu gerçekleştirmenize
olanak sağlar. Adobe, kod bloğunu her zaman ayraç ({}) içine almanızı önerir. Kod bloğu yalnızca bir deyim içeriyorsa
ayraçları çıkarabilseniz de, koşullar için geçerli olan aynı nedenden dolayı bu uygulama önerilmez: bu, daha sonra
eklenen deyimlerin yanlışlıkla kod bloğundan hariç tutulması olasılığını artırır. Daha sonra, kod bloğuna dahil etmek
istediğiniz bir deyimi eklerseniz ancak gerekli ayraçları koymayı unutursanız, deyim döngünün bir parçası olarak
çalıştırılmaz.
for
for döngüsü, belirli bir değer aralığı için bir değişkeni yinelemenize olanak sağlar. for deyiminde üç ifade sağlamanız
gerekir: başlangıç değerine ayarlı bir değişken, döngünün ne zaman sona ereceğini belirleyen bir koşul deyimi ve her
döngüyle değişkenin değerini değiştiren bir ifade. Örneğin, aşağıdaki kod beş defa döngü sağlar. i değişkeninin değeri
0'da başlar ve 4'te sona erer, çıktı da her biri kendi satırında olan 0 ile 4 arasındaki sayılar olur.
var i:int;
for (i = 0; i < 5; i++)
{
trace(i);
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 76
ActionScript dili ve sözdizimi
for..in
for..in döngüsü, bir nesnenin özelliklerini veya dizideki öğeleri yineler. Örneğin, genel bir nesnenin özelliklerini
yinelemek için bir for..in döngüsünü kullanabilirsiniz (nesne özellikleri belirli bir sırada tutulmaz, bu nedende
özellikler rastgele sırada görüntüleniyor gibi gelebilir):
var myObj:Object = {x:20, y:30};
for (var i:String in myObj)
{
trace(i + ": " + myObj[i]);
}
// output:
// x: 20
// y: 30
Bir dizinin öğelerini de yineleyebilirsiniz:
var myArray:Array = ["one", "two", "three"];
for (var i:String in myArray)
{
trace(myArray[i]);
}
// output:
// one
// two
// three
Bir nesne, kullanıcı tanımlı sınıfın bir örneğiyse, sınıf dinamik bir sınıf olmadığı sürece nesnenin özelliklerini
yineleyemezsiniz. Dinamik sınıf örnekleriyle de, yalnızca dinamik olarak eklenen özellikleri yineleyebilirsiniz.
for each..in
for each..in döngüsü, bir koleksiyonun öğelerini yineler, bu öğeler bir XML veya XMLList nesnesindeki etiketler,
nesne özellikleri tarafından tutulan değerler veya bir dizinin öğeleri olabilir. Örneğin, aşağıdaki alıntıda da gösterildiği
gibi, genel bir nesnenin özelliklerini yinelemek için for each..in döngüsünü kullanabilirsiniz ancak for..in
döngüsünden farklı olarak, for each..in döngüsündeki yineleyici değişken, özelliğin adı yerine özelliğin kendisi
tarafından tutulan değeri içerir:
var myObj:Object = {x:20, y:30};
for each (var num in myObj)
{
trace(num);
}
// output:
// 20
// 30
Aşağıdaki örnekte gösterildiği gibi, bir XML veya XMLList nesnesini yineleyebilirsiniz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 77
ActionScript dili ve sözdizimi
var myXML:XML = <users>
<fname>Jane</fname>
<fname>Susan</fname>
<fname>John</fname>
</users>;
for each (var item in myXML.fname)
{
trace(item);
}
/* output
Jane
Susan
John
*/
Bu örnekte gösterildiği gibi, bir dizinin öğelerini de yineleyebilirsiniz:
var myArray:Array = ["one", "two", "three"];
for each (var item in myArray)
{
trace(item);
}
// output:
// one
// two
// three
Bir nesne mühürlenmiş bir sınıf örneğiyse, o nesnenin özelliklerini yineleyemezsiniz. Dinamik sınıf örnekleri için de,
sınıf tanımının bölümü olarak tanımlanan özellikler olan sabit özellikleri yineleyemezsiniz.
while
while döngüsü, koşul true olduğu sürece yinelenen if deyimine benzer. Örneğin, aşağıdaki kod, for döngüsü
örneğiyle aynı çıktıyı oluşturur:
var i:int = 0;
while (i < 5)
{
trace(i);
i++;
}
for döngüsü yerine while döngüsü kullanılmasının bir dezavantajı, sonsuz döngülerin while döngüleriyle daha
kolay yazılmasıdır. Sayaç değişkenini artıran ifadeyi çıkarırsanız, for döngüsü örneği derleme yapmaz ancak bu adımı
çıkarırsanız while döngüsü örneği derleme yapar. i değerini artıran ifade olmadan döngü sonsuz döngü olur.
do..while
do..while döngüsü, kod bloğu çalıştırıldıktan sonra koşul denetlendiğinden, kod bloğunun en az bir defa
çalıştırılmasını garantileyen bir while döngüsüdür. Aşağıdaki kod, koşul karşılanmasa da çıktı oluşturan basit bir
do..while döngüsü örneğini göstermektedir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 78
ActionScript dili ve sözdizimi
var i:int = 5;
do
{
trace(i);
i++;
} while (i < 5);
// output: 5
İşlevler
İşlevler, belirli görevleri gerçekleştirdiğiniz ve programınızda yeniden kullanılabilen kod bloklarıdır. ActionScript
3.0'da iki tür işlev vardır: yöntemler ve işlev kapanışları. Bir işlevin yöntem veya işlev kapanışı olarak adlandırılması,
işlevin tanımlandığı bağlama bağlıdır. Bir işlevi sınıf tanımının parçası olarak tanımlarsanız veya bunu bir nesne
örneğine eklerseniz bu işlev yöntem olarak adlandırılır. Bir işlev başka bir şekilde tanımlanırsa, işlev kapanışı olarak
adlandırılır.
İşlevler ActionScript'te her zaman çok önemli olmuştur. Örneğin, ActionScript 1.0'da class anahtar sözcüğü yoktu,
bu nedenle “sınıflar” yapıcı işlevleri tarafından tanımlanırdı. Bu nedenle dile class anahtar sözcüğü eklenmiş olsa da,
dilin sunması gereken şeylerden tam anlamıyla yararlanmak istiyorsanız, işlevlerin düzgün bir şekilde anlaşılması hala
çok önemlidir. ActionScript işlevlerinin C++ veya Java gibi dillerdeki işlevlere benzer şekilde davranmasını bekleyen
programcılar için bu güçlük yaratabilir. Temel işlev tanımı ve çağırma işlemi deneyimli programcılar için güçlük
oluşturmasa da, ActionScript işlevlerinin daha gelişmiş olan bazı özelliklerinin açıklanması gerekir.
Temel işlev kavramları
Bu bölümde, temel işlev tanımı ve çağırma teknikleri ele alınmaktadır.
İşlevleri çağırma
Bir işlevin, ardından parantez operatörü (()) gelen tanımlayıcısını kullanarak o işlevi çağırabilirsiniz. İşleve
göndermek istediğiniz herhangi bir işlev parametresini kapsamak için parantez operatörünü kullanırsınız. Örneğin,
bu kitapta, ActionScript 3.0'da üst düzey işlev olan trace() işlevi kullanılmıştır:
trace("Use trace to help debug your script");
Herhangi bir parametre içermeyen bir işlevi çağırıyorsanız, boş bir parantez çifti kullanmanız gerekir. Örneğin,
rastgele bir sayı oluşturmak için, herhangi bir parametre almayan Math.random() yöntemini kullanabilirsiniz:
var randomNum:Number = Math.random();
Kendi işlevlerinizi tanımlama
ActionScript 3.0'da bir işlevi tanımlamanın iki yolu vardır: bir işlev deyimini veya işlev ifadesini kullanabilirsiniz.
Seçtiğiniz teknik, daha statik veya daha dinamik bir programlama stili seçmenize bağlıdır. Statik veya katı mod
programlamayı tercih ediyorsanız işlevlerinizi işlev deyimleriyle tanımlayın. Aksini yapmanız gerekiyorsa, işlevlerinizi
işlev ifadeleriyle tanımlayın. İşlev ifadeleri, dinamik veya standart mod programlamada daha sık kullanılır.
İşlev deyimleri
İşlev deyimleri, katı modda işlevleri tanımlamak için tercih edilen tekniktir. Bir işlev deyimi, function anahtar
sözcüğüyle başlar ve şunlarla devam eder:
• İşlev adı
• Parantez içindeki virgül sınırlı bir listede yer alan parametreler
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 79
ActionScript dili ve sözdizimi
• İşlev gövdesi—başka bir deyişle, işlev çağrıldığında çalıştırılacak, küme ayracı içine alınmış ActionScript kodu
Örneğin, aşağıdaki kod, bir parametreyi tanımlayan bir işlev oluşturur ve sonra parametre değeri olarak “ hello"
dizesini kullanarak işlevi çağırır:
function traceParameter(aParam:String)
{
trace(aParam);
}
traceParameter("hello"); // hello
İşlev ifadeleri
Bir işlev bildirmenin ikinci yolu, aynı zamanda bazen bir işlev değişmezini veya adsız işlevi çağıran işlev ifadesiyle bir
atama deyiminin kullanılmasıdır. Bu, önceki ActionScript sürümlerinde yaygın olarak kullanılan daha ayrıntılı bir
yöntemdir.
İşlev ifadesi içeren bir atama deyimi, var anahtar sözcüğüyle başlar ve şunlarla devam eder:
• İşlev adı
• İki nokta operatörü (:)
• Veri türünü belirtecek Function sınıfı
• Atama operatörü (=)
•
function anahtar sözcüğü
• Parantez içindeki virgül sınırlı bir listede yer alan parametreler
• İşlev gövdesi—başka bir deyişle, işlev çağrıldığında çalıştırılacak, küme ayracı içine alınmış ActionScript kodu
Örneğin, aşağıdaki kod, bir işlev ifadesi kullanarak traceParameter işlevini bildirir:
var traceParameter:Function = function (aParam:String)
{
trace(aParam);
};
traceParameter("hello"); // hello
İşlev deyiminde yaptığınız gibi bir işlev adı belirtmediğinize dikkat edin. İşlev ifadeleri ile işlev deyimleri arasındaki
başka bir önemli fark, işlev ifadesinin deyim yerine bir ifade olmasıdır. Başka bir deyişle, bir işlev ifadesi, işlev
deyimi gibi tek başına duramaz. İşlev ifadesi yalnızca bir deyimin parçası olarak kullanılabilir ve bu genellikle bir
atama deyimi olur. Aşağıdaki örnek, bir dizi örneğine atanmış işlev ifadesini gösterir:
var traceArray:Array = new Array();
traceArray[0] = function (aParam:String)
{
trace(aParam);
};
traceArray[0]("hello");
Deyimler ile ifadeler arasında tercih yapma
Genel bir kural olarak, belirli koşullar bir ifade kullanımını gerektirmediği sürece, işlev deyimini kullanın. İşlev
deyimleri daha az ayrıntılıdır ve katı mod ile standart mod arasında işlev ifadelerine göre daha tutarlı bir deneyim
sağlar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 80
ActionScript dili ve sözdizimi
İşlev deyimlerinin okunması, işlev ifadelerini içeren atama deyimlerinden daha kolaydır. İşlev deyimleri kodunuzu
daha kısa hale getirir; hem var hem de function anahtar sözcüklerini kullanmanızı gerektiren işlev ifadelerinden
daha az karmaşıktır.
İşlev deyimleri, bir işlev deyimi kullanılarak bildirilmiş bir yöntemi çağırmak için nokta sözdizimini hem katı hem de
standart modda kullanabilmenize olanak sağladığından, iki derleyici modu arasında daha tutarlı bir deneyim sağlar.
Bu bir işlev ifadesiyle bildirilmiş yöntemler için her zaman geçerli değildir. Örneğin, aşağıdaki kod, iki yöntemle
Example adında bir sınıfı tanımlar: bir işlev ifadesiyle bildirilen methodExpression() yöntemi ve bir işlev deyimiyle
çağrılan methodStatement() yöntemi. Katı modda, methodExpression() yöntemini çağırmak için nokta
sözdizimini kullanamazsınız.
class Example
{
var methodExpression = function() {}
function methodStatement() {}
}
var myEx:Example = new Example();
myEx.methodExpression(); // error in strict mode; okay in standard mode
myEx.methodStatement(); // okay in strict and standard modes
İşlev deyimleri, çalışma zamanını veya dinamik davranışı esas alan programlamalar için daha uygun olarak
değerlendirilir. Katı modu kullanmayı tercih ediyorsanız ancak diğer yandan bir işlev ifadesiyle bildirilmiş bir yöntemi
çağırmanız gerekiyorsa, iki teknikten herhangi birini kullanabilirsiniz. İlk olarak, köşeli ayraçları ([]) nokta (.)
operatörü yerine kullanarak yöntemi çağırabilirsiniz. Aşağıdaki yöntem çağrısı hem katı modda hem de standart
modda başarılı olur:
myExample["methodLiteral"]();
İkinci olarak, sınıfın tamamını dinamik sınıf olarak bildirebilirsiniz. Bu, nokta operatörünü kullanarak yöntemi
çağırmanıza olanak sağlasa da, bunun dezavantajı, söz konusu sınıfın tüm örnekleri için bazı katı mod işlevselliğinden
taviz vermenizdir. Örneğin, bir dinamik sınıf örneğinde tanımsız bir özelliğe erişmeyi denerseniz, derleyici bir hata
oluşturmaz.
İşlev ifadelerinin kullanışlı olduğu bazı koşullar vardır. İşlev ifadelerinin yaygın olarak kullanıldığı koşullardan biri,
yalnızca bir defa kullanılan ve sonra atılan işlevlerdir. Daha az yaygın olarak da bir işlevin bir prototip özelliğine
eklenmesi için kullanılabilir. Daha fazla bilgi için, bkz. “Prototip nesnesi” sayfa 118.
İşlev deyimleri ile işlev ifadeleri arasında, kullanılacak tekniği seçerken dikkate almanız gereken iki küçük fark vardır.
Birinci fark, işlev ifadelerinin bellek yönetimi ve çöp toplamaya göre nesneler olarak bağımsız şekilde bulunmamasıdır.
Başka bir deyişle, dizi öğesi veya nesne özelliği gibi başka bir nesneye bir işlev ifadesi atadığınızda, kodunuzda yalnızca
o işlev ifadesine başvuru oluşturursunuz. İşlev ifadenizin eklendiği dizi veya nesne kapsam dışına çıkarsa ya da artık
kullanılamazsa, artık işlev ifadesine erişemezsiniz. Dizi veya nesne silinirse, işlev ifadesinin kullandığı bellek, çöp
toplama için uygun olur; başka bir deyişle, bellek başka amaçlar için geri istenmeye ve yeniden kullanılmaya uygun olur.
Aşağıdaki örnek, bir işlev ifadesi için, ifadenin atandığı özellik silindikten sonra işlevin artık kullanılamadığını
gösterir. Test sınıfı dinamiktir, başka bir deyişle, bir işlev ifadesi içeren functionExp adında bir özellik
ekleyebilirsiniz. functionExp() işlevi nokta operatörüyle çağrılabilir, ancak functionExp özelliği silindikten sonra
artık işleve erişilemez.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 81
ActionScript dili ve sözdizimi
dynamic class Test {}
var myTest:Test = new Test();
// function expression
myTest.functionExp = function () { trace("Function expression") };
myTest.functionExp(); // Function expression
delete myTest.functionExp;
myTest.functionExp(); // error
Diğer bir yandan, işlev ilk olarak bir işlev deyimiyle tanımlanırsa, kendi nesnesi olarak varolur ve siz işlevin eklendiği
özelliği sildikten sonra da işlev varolmaya devam eder. delete operatörü yalnızca nesnelerin özelliklerinde çalışır, bu
nedenle, stateFunc() işlevini silme çağrısı çalışmaz.
dynamic class Test {}
var myTest:Test = new Test();
// function statement
function stateFunc() { trace("Function statement") }
myTest.statement = stateFunc;
myTest.statement(); // Function statement
delete myTest.statement;
delete stateFunc; // no effect
stateFunc();// Function statement
myTest.statement(); // error
İşlev deyimleri ile işlev ifadeleri arasındaki ikinci bir fark, işlev deyimlerinin, işlev deyiminden önce görüntülenen
deyimler de dahil olmak üzere, tanımlandıkları kapsamda varolmalarıdır. İşlev ifadeleri, bunun tersine yalnızca
sonraki deyimler için tanımlanır. Örneğin, aşağıdaki kod tanımlanmadan önce scopeTest() işlevini başarıyla
çağırırsa:
statementTest(); // statementTest
function statementTest():void
{
trace("statementTest");
}
İşlev ifadeleri, tanımlanmadan önce kullanılamaz, bu nedenle de aşağıdaki kod bir çalışma zamanı hatası oluşturur:
expressionTest(); // run-time error
var expressionTest:Function = function ()
{
trace("expressionTest");
}
İşlevlerden değerleri döndürme
İşlevinizden bir değer döndürmek için, ardından, döndürmek istediğiniz ifade veya değişmez değerin geldiği return
deyimini kullanın. Örneğin, aşağıdaki kod, parametreyi temsil eden bir ifade döndürür:
function doubleNum(baseNum:int):int
{
return (baseNum * 2);
}
return deyiminin işlevi sonlandırdığına dikkat edin, böylece aşağıdaki gibi, return deyiminin aşağısındaki deyimler
çalıştırılmaz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 82
ActionScript dili ve sözdizimi
function doubleNum(baseNum:int):int {
return (baseNum * 2);
trace("after return"); // This trace statement will not be executed.
}
Katı modda, bir döndürme türü belirtmeyi seçerseniz, ilgili türde bir değer döndürmeniz gerekir. Örneğin, aşağıdaki
kod geçerli bir değer döndürmediğinden, katı modda bir hata oluşturur:
function doubleNum(baseNum:int):int
{
trace("after return");
}
Yuvalanmış işlevler
İşlevleri yuvalayabilirsiniz, başka bir deyişle, işlevler diğer işlevler içinde bildirilebilir. Yuvalanmış işlevin başvurusu
harici koda iletilmediği sürece, yuvalanmış bir işlev yalnızca üst işlevi içinde kullanılabilir. Örneğin, aşağıdaki kod,
getNameAndVersion() işlevi içinde iki yuvalanmış işlev bildirir:
function getNameAndVersion():String
{
function getVersion():String
{
return "10";
}
function getProductName():String
{
return "Flash Player";
}
return (getProductName() + " " + getVersion());
}
trace(getNameAndVersion()); // Flash Player 10
Yuvalanmış işlevler harici koda iletildiğinde, işlev kapanışları olarak iletilir; başka bir deyişle, işlev tanımlandığında
kapsamda olan tüm tanımlar işlevde saklanır. Daha fazla bilgi için, bkz. “İşlev kapsamı” sayfa 87.
İşlev parametreleri
ActionScript 3.0, dil kullanımında tecrübesiz olan programcılar için yeni gibi görünen bazı işlev parametreleri işlevleri
sağlar. Değere veya başvuruya göre parametre iletme kavramı çoğu programcılara tanıdık gelse de, arguments nesnesi
ve ... (rest)parametresi birçoğu için yeni olabilir.
Değere veya başvuruya göre argümanları iletme
Çoğu programlama dilinde, değere veya başvuruya göre argümanları iletme arasındaki ayrımın anlaşılması önemlidir;
bu ayrım kodun tasarlanma şeklini etkileyebilir.
Değere göre iletilme, argüman değerinin, işlev içinde kullanılmak üzere yerel bir değişkene kopyalanması anlamına
gelir. Başvuruya göre iletilme ise gerçek değerin değil, yalnızca argümanın bir başvurusunun iletilmesi anlamına gelir.
Gerçek argümanın herhangi bir kopyası oluşturulmaz. Bunun yerine, argüman olarak iletilen değişkenin başvurusu
oluşturulur ve işlev içinde kullanılmak üzere yerel değişkene atanır. Yerel değişken, işlev dışındaki bir değişkenin
başvurusu olarak, size orijinal değişkenin değerini değiştirme yeteneği sağlar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 83
ActionScript dili ve sözdizimi
ActionScript 3.0'da, tüm değerler nesneler olarak saklandığından, tüm argümanlar başvuruya göre iletilir. Ancak,
Boolean, Number, int, uint ve String gibi ilkel veri türlerine ait olan nesneler, değere göre iletilmiş gibi davranmasını
sağlayan özel operatörlere sahiptir. Örneğin, aşağıdaki kod, her ikisi de int türünde olan xParam ve yParam adında iki
parametreyi tanımlayan passPrimitives() adında bir işlev oluşturur. Bu parametreler, passPrimitives()
işlevinin gövdesinde bildirilen yerel değişkenlere benzer. İşlev, xValue ve yValue argümanlarıyla çağrılırsa, xParam
ve yParam parametreleri, xValue ve yValue tarafından temsil edilen int nesnelerinin başvurularıyla başlatılır.
Argümanlar ilkel olduğundan, bunlar değere göre iletilmiş gibi davranır. xParam ve yParam öğeleri başlangıçta xValue
ve yValue nesnelerini içerse de, işlev gövdesi içinde değişkenler üzerinde yapılan tüm değişiklikler bellekte değerlerin
yeni kopyalarını oluşturur.
function passPrimitives(xParam:int, yParam:int):void
{
xParam++;
yParam++;
trace(xParam, yParam);
}
var xValue:int = 10;
var yValue:int = 15;
trace(xValue, yValue);// 10 15
passPrimitives(xValue, yValue); // 11 16
trace(xValue, yValue);// 10 15
passPrimitives() işlevi içinde, xParam ve yParam değerleri artırılır ancak bu, son trace deyiminde gösterildiği
gibi, xValue ve yValue değerlerini etkilemez. İşlevin içindeki xValue ve yValue öğeleri, bellekte, işlev dışında aynı
addaki değişkenlerden ayrı olarak varolan yeni konumları işaret ettiğinden, parametreler xValue ve yValue
değişkenleriyle aynı şekilde adlandırılsaydı da bu durum geçerli olurdu.
Diğer tüm nesneler—başka bir deyişle, ilkel veri türünde olmayan nesneler—her zaman başvuruya göre iletilir ve bu
da size orijinal değişkenin değerini değiştirme yeteneği sağlar. Örneğin, aşağıdaki kod, x ve y olmak üzere iki özellikle
objVar adında bir nesne oluşturur. passByRef() işlevine argüman olarak iletilen nesne. Nesne ilkel türde
olmadığından, yalnızca başvuruya göre iletilmekle kalmaz aynı zamanda başvuru olmaya devam eder. Başka bir
deyişle, işlev içinde parametreler üzerinde yapılan değişiklikler, işlev dışındaki nesne özelliklerini etkiler.
function passByRef(objParam:Object):void
{
objParam.x++;
objParam.y++;
trace(objParam.x, objParam.y);
}
var objVar:Object = {x:10, y:15};
trace(objVar.x, objVar.y); // 10 15
passByRef(objVar); // 11 16
trace(objVar.x, objVar.y); // 11 16
objParam parametresi, genel objVar değişkeniyle aynı nesneye başvurur. Örnekteki trace deyimlerinde de
görebileceğiniz gibi, objParam nesnesinin x ve y özellikleri üzerinde yapılan değişiklikler, objVar nesnesinde
yansıtılır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 84
ActionScript dili ve sözdizimi
Varsayılan parametre değerleri
ActionScript 3.0'daki bir yenilik de, bir işlev için varsayılan parametre değerleri bildirme yeteneğidir. Varsayılan
parametre değerleri içeren bir işleve yapılan çağrı, varsayılan değerleri içeren bir parametreyi çıkarırsa, o parametre
için işlev tanımında belirtilen değer kullanılır. Varsayılan değerlere sahip tüm parametrelerin parametre listesinin
sonuna yerleştirilmesi gerekir. Varsayılan değer olarak atanan değerlerin derleme zamanı sabitleri olması gerekir. Bir
parametre için varsayılan bir değerin olması, o parametreyi etkili şekilde isteğe bağlı parametre yapar. Varsayılan değer
içermeyen bir parametre, zorunlu parametre olarak değerlendirilir.
Örneğin, aşağıdaki kod üç parametre içeren bir işlev oluşturur, bu parametrelerin ikisi varsayılan değerleri içerir.
Yalnızca bir parametreyle işlev çağrıldığında, parametrelerin varsayılan değerleri kullanılır.
function defaultValues(x:int, y:int = 3, z:int = 5):void
{
trace(x, y, z);
}
defaultValues(1); // 1 3 5
arguments nesnesi
Bir işleve parametreler iletildiğinde, işlevinize iletilen parametreler hakkındaki bilgilere erişmek için arguments
nesnesini kullanabilirsiniz. arguments nesnesinin önemli yönlerinden bazıları şunlardır:
•
arguments nesnesi, işleve iletilen tüm parametreleri içeren bir dizidir.
•
arguments.length özelliği, işleve iletilen parametrelerin sayısını bildirir.
•
arguments.callee özelliği, işlevin kendisine bir başvuru sağlar, bu da işlev ifadelerine yapılan yinelemeli çağrılar
için kullanışlıdır.
Not: Herhangi bir parametre arguments olarak adlandırılırsa veya ... (rest) parametresini kullanırsanız,
arguments nesnesi kullanılamaz.
İşlev gövdesinde arguments nesnesie başvurulursa, ActionScript 3.0, işlev çağrılarının, işlev tanımında
tanımlananlardan daha fazla parametre içermesine olanak sağlar, ancak parametre sayısı, zorunlu parametre (ve
isteğe bağlı olarak isteğe bağlı parametre) sayısıyla eşleşmezse, bu katı modda bir derleyici hatası oluşturur. İşlev
tanımında tanımlansa da tanımlanmasa da, işleve iletilen herhangi bir parametreye erişmek için arguments
nesnesinin dizi yönünü kullanabilirsiniz. Yalnızca standart modda derleme yapan aşağıdaki örnek,
traceArgArray() işlevine iletilen tüm parametreleri izlemek için arguments.length özelliğiyle birlikte
arguments dizisini kullanır:
function traceArgArray(x:int):void
{
for (var i:uint = 0; i < arguments.length; i++)
{
trace(arguments[i]);
}
}
traceArgArray(1, 2, 3);
//
//
//
//
output:
1
2
3
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 85
ActionScript dili ve sözdizimi
arguments.callee özelliği genellikle yineleme oluşturmak için adsız işlevlerde kullanılır. Kodunuza esneklik
katmak için bunu kullanabilirsiniz. Yinelemeli işlevin adı, geliştirme döngünüzde değişirse, işlev adı yerine
arguments.callee öğesini kullanıyorsanız, işlev gövdenizde yinelemeli çağrıyı değiştirmekle ilgili endişe
duymanız gerekmez. Yinelemeyi etkinleştirmek için, aşağıdaki işlev ifadesinde arguments.callee özelliği
kullanılır:
var factorial:Function = function (x:uint)
{
if(x == 0)
{
return 1;
}
else
{
return (x * arguments.callee(x - 1));
}
}
trace(factorial(5)); // 120
İşlev bildiriminizde ... (rest) parametresini kullanırsanız, arguments nesnesini kullanamazsınız. Bunun yerine,
parametreler için bildirdiğiniz parametre adlarını kullanarak parametrelere erişmeniz gerekir.
Ayrıca parametre adı olarak "arguments" dizesini kullanmaktan kaçınmalısınız, aksi takdirde bu, arguments
nesnesini gölgeler. Örneğin, bir arguments parametresi eklenecek şekilde traceArgArray() işlevi yeniden
yazılırsa, işlev gövdesinde arguments öğesine başvurular, arguments nesnesini değil, parametreyi ifade eder.
Aşağıdaki kod herhangi bir çıktı oluşturmaz:
function traceArgArray(x:int, arguments:int):void
{
for (var i:uint = 0; i < arguments.length; i++)
{
trace(arguments[i]);
}
}
traceArgArray(1, 2, 3);
// no output
Önceki ActionScript sürümlerinde bulunan arguments nesnesi de geçerli işlevi çağıran işlevin başvurusu
niteliğindeki caller adında bir özellik içerirdi. caller özelliği ActionScript 3.0'da yoktur ancak çağıran işleve
başvuru gerekiyorsa, çağıran işlevi, başvurunun kendisi olan fazladan bir parametreyi iletecek şekilde
değiştirebilirsiniz.
... (rest) parametresi
ActionScript 3.0, ... (rest) parametresi adında yeni bir parametre içerir. Bu parametre, virgül sınırlı herhangi bir sayıda
argümanı kabul eden bir dizi parametresi belirtmenize olanak sağlar. Parametre, ayrılmış sözcükler dışında herhangi
bir ada sahip olabilir. Bu parametre bildiriminin belirtilen son parametre olması gerekir. Bu parametrenin
kullanılması, arguments nesnesini kullanılamaz duruma getirir. ... (rest) parametresi, arguments dizisi ve
arguments.length özelliğiyle aynı işlevselliği verse de, bu, arguments.callee tarafından sağlanan işlevselliğe
benzer bir işlevsellik sağlamaz. ... (rest) parametresini kullanmadan önce arguments.callee öğesini
kullanmadığınızdan emin olmanız gerekir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 86
ActionScript dili ve sözdizimi
Aşağıdaki örnek, arguments nesnesi yerine ... (rest) parametresini kullanarak traceArgArray() işlevini yeniden
yazar:
function traceArgArray(... args):void
{
for (var i:uint = 0; i < args.length; i++)
{
trace(args[i]);
}
}
traceArgArray(1, 2, 3);
//
//
//
//
output:
1
2
3
... (rest) parametresi ayrıca listedeki son parametre olduğu sürece diğer parametrelerle de kullanılabilir. Aşağıdaki
örnek, işlevin birinci parametresi (x) int türünde olacak ve ikinci parametre de ... (rest) parametresini kullanacak
şekilde traceArgArray() işlevini değiştirir. Birinci parametre artık ... (rest) parametresi tarafından oluşturulan
dizinin bölümü olmadığından, çıktı birinci değeri atlar.
function traceArgArray(x: int, ... args)
{
for (var i:uint = 0; i < args.length; i++)
{
trace(args[i]);
}
}
traceArgArray(1, 2, 3);
// output:
// 2
// 3
Nesne olarak işlevler
ActionScript 3.0'daki işlevler nesnelerdir. Bir işlev oluşturduğunuzda, yalnızca başka bir işleve parametre olarak
iletilmekle kalmayan aynı zamanda kendisine eklenmiş özellik ve yöntemlerin de bulunduğu bir nesne
oluşturursunuz.
Başka bir işleve argümanlar olarak iletilen işlevler, değere göre değil, başvuruya göre iletilir. Bir işlevi argüman olarak
ilettiğinizde, yöntemi çağırmak için parantez operatörünü değil yalnızca tanımlayıcıyı kullanırsınız. Örneğin,
aşağıdaki kod, addEventListener() yöntemine argüman olarak clickListener() adında bir işlev iletir:
addEventListener(MouseEvent.CLICK, clickListener);
Array.sort() yöntemi ayrıca bir işlevi kabul eden bir parametreyi de tanımlar. Array.sort() işlevine argüman
olarak kullanılan özel bir sıralama işlevi örneği için, bkz. “Diziyi sıralama” sayfa 159.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 87
ActionScript dili ve sözdizimi
ActionScript'i ilk defa kullanan programcılar için bu garip görünse de, işlevler tıpkı diğer nesneler gibi özelliklere ve
yöntemlere sahip olabilir. Aslında, her işlev, kendisi için tanımlı parametrelerin sayısını saklayan length adında salt
okunur bir özelliğe sahiptir. Bu, işleve gönderilen argümanların sayısını bildiren arguments.length özelliğinden
farklıdır. ActionScript'te, bir işleve gönderilen argüman sayısının, o işlev için tanımlanmış parametre sayısını
aşabileceğini unutmayın. Katı mod, iletilen argümanların sayısı ile tanımlanan parametrelerin sayısı arasında tam
eşleşme gerektirdiğinden yalnızca standart modda derleme yapan aşağıdaki örnek, iki özellik arasındaki farkı gösterir:
// Compiles only in standard mode
function traceLength(x:uint, y:uint):void
{
trace("arguments received: " + arguments.length);
trace("arguments expected: " + traceLength.length);
}
traceLength(3, 5, 7, 11);
/* output:
arguments received: 4
arguments expected: 2 */
Standart modda, kendi işlev özelliklerinizi işlev gövdesinin dışında tanımlayabilirsiniz. İşlev özellikleri, işlevle ilgili bir
değişkenin durumunu kaydetmenize olanak sağlayan yarı durağan özellikler görevi görebilir. Örneğin, belirli bir
işlevin kaç defa çağrıldığını izlemek isteyebilirsiniz. Bir oyun yazıyorsanız ve bir kullanıcının belirli bir komutu kaç
defa kullandığını izlemek istiyorsanız, statik sınıf özelliği kullanabilseniz de, bu işlevsellik kullanışlı olabilir. Katı mod,
işlevlere dinamik özellikler eklemenize olanak sağlamadığından yalnızca standart modda derleme yapan aşağıdaki
örnek, işlev bildirimi dışında bir işlev özelliği oluşturur ve işlev her çağrıldığında özelliği artırır:
// Compiles only in standard mode
var someFunction:Function = function ():void
{
someFunction.counter++;
}
someFunction.counter = 0;
someFunction();
someFunction();
trace(someFunction.counter); // 2
İşlev kapsamı
Bir işlevin kapsamı, yalnızca programın neresinde işlevin çağrılabileceğini değil, işlevin hangi tanımlara erişebildiğini
de belirler. Değişken tanımlayıcıları için geçerli olan aynı kapsam kuralları, işlev tanımlayıcıları için de geçerlidir.
Genel kapsamda bildirilen bir işlev, tüm kodunuzda kullanılabilir. Örneğin, ActionScript 3.0, kodunuzun herhangi bir
yerinde kullanılabilir olan isNaN() ve parseInt() gibi genel işlevler içerir. Yuvalanmış bir işlev—başka bir işlev
içinde bildirilen bir işlev—bildirildiği işlevin herhangi bir yerinde kullanılabilir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 88
ActionScript dili ve sözdizimi
Kapsam zinciri
Bir işlev her çalıştırılmaya başladığında, birçok nesne ve özellik oluşturulur. İlk olarak, işlev gövdesinde bildirilen
parametreleri ve yerel değişkenleri veya işlevleri saklayan etkinleştirme nesnesi adında özel bir nesne oluşturulur.
Etkinleştirme nesnesi dahili bir mekanizma olduğundan bu nesneye doğrudan erişemezsiniz. İkinci olarak, Flash
Player veya Adobe AIR uygulamalarının tanımlayıcı bildirimleri için denetleyeceği nesnelerin sıralanmış bir listesini
içeren bir kapsam zinciri oluşturulur. Çalıştırılan her işlev, dahili bir özellikte saklanan bir kapsam zincirine sahiptir.
Yuvalanmış bir işlev için, kapsam zinciri kendi etkinleştirme nesnesiyle başlar ve üst işlevinin etkinleştirme nesnesiyle
devam eder. Zincir, genel nesneye ulaşıncaya kadar bu şekilde devam eder. Bir ActionScript programı başlatıldığında
genel bir nesne oluşturulur ve bu nesne tüm genel değişkenleri ve işlevleri içerir.
İşlev kapanışları
İşlev kapanışı, işlevin anlık görüntüsünü ve sözlü ortamını içeren bir nesnedir. İşlevin sözlü ortamı, işlevin değerleriyle
birlikte kapsam zincirinde bulunan tüm değişkenleri, özellikleri, yöntemleri ve nesneleri içerir. Nesne veya sınıftan
ayrı olarak bir işlev her çalıştırıldığında işlev kapanışları oluşturulur. İşlev kapanışlarının tanımlandıkları kapsamda
bulunması, bir işlev farklı bir kapsama bir argüman veya bir döndürme değeri olarak iletildiğinde ilginç sonuçlar
oluşturur.
Örneğin, aşağıdaki kod iki işlev oluşturur: bir dikdörtgenin alanını hesaplayan rectArea() adında yuvalanmış bir
işlevi döndüren foo() ve foo() öğesini çağırıp döndürülen işlev kapanışını myProduct adında bir değişkende
saklayan bar(). bar() işlevi, kendi x yerel değişkenini (2 değeriyle) tanımlasa da, myProduct() işlev kapanışı
çağrıldığında bu, foo() i levinde tanımlı x de i kenini (40 de eriyle) içerir. Bu nedenle de bar()
işlevi, 8 değerini değil, 160 değerini döndürür.
function foo():Function
{
var x:int = 40;
function rectArea(y:int):int // function closure defined
{
return x * y
}
return rectArea;
}
function bar():void
{
var x:int = 2;
var y:int = 4;
var myProduct:Function = foo();
trace(myProduct(4)); // function closure called
}
bar(); // 160
Yöntemler, oluşturuldukları sözlü ortamla ilgili bilgi içermeleri yönünden benzer şekilde davranır. Bir yöntem,
örneğinden ayıklanıp bağımlı bir yöntem oluşturduğunda bu özellik en belirgin durumda olur. İşlev kapanışı ile
bağımlı yöntem arasındaki ana fark, bir işlev kapanışında thisanahtar sözcüğünün değeri değişebilirken, bağımlı
yöntemdeki this anahtar sözcüğünün değerinin her zaman başlangıçta eklendiği örneği ifade etmesidir. Daha fazla
bilgi için, bkz. “Yöntemler” sayfa 96.
89
Bölüm 5: ActionScript'te nesne tabanlı
programlama
Bu bölümde, ActionScript uygulamasının, nesne tabanlı programlamayı (OOP) destekleyen öğeleri açıklanmaktadır.
Nesne tasarımı, soyutlama, kapsülleme, miras ve çok biçimlilik gibi genel OOP ilkeleri bu bölümde ele alınmamıştır.
Bu bölüm daha çok ActionScript 3.0 kullanılarak bu ilkelerin nasıl uygulandığını açıklamaktadır.
ActionScript’in komut dosyası oluşturma dili olarak köklerinden dolayı, ActionScript 3.0 OOP desteği isteğe bağlıdır.
Bu, programcılara çeşitli kapsam ve karmaşıklık düzeyine sahip projeleri için en iyi yaklaşımı seçmelerinde esneklik
sağlar. Küçük görevler için, yalnızca prosedür gereği programlama paradigması ile ActionScript'in kullanılmasının
yeterli olduğunu düşünebilirsiniz. Daha büyük projeler için OOP ilkelerinin uygulanması, kodunuzun anlaşılmasını,
korunmasını ve genişletilmesini kolaylaştırabilir.
Nesne tabanlı programlama temelleri
Nesne tabanlı programlamaya giriş
Nesne tabanlı programlama (OOP), bir programdaki kodların nesneler (bilgi (veri değerleri) ve işlevler içeren ayrı ayrı
öğeler) halinde gruplandırılarak organize edilmesinin bir yoludur. Programı organize etmek için nesne tabanlı bir
yaklaşım kullanılması, belirli bilgileri (örneğin, albüm başlığı, parça başlığı veya sanatçı adı gibi müzik bilgileri), o
bilgiyle ilişkilendirilmiş ortak işlevler veya eylemlerle ("çalma listesine ekleme" veya "tüm şarkıları sanatçıya göre
çalma") birlikte gruplandırmanıza olanak sağlar. Bu öğeler, nesne adı verilen tek bir öğede (örneğin, bir “Album” veya
“MusicTrack”) birleştirilir. Bu değerlerin ve işlevlerin birlikte gruplandırılabilmesi, örneğin, birden çok değişken
yerine yalnızca bir değişkenin izlenmesinin gerekmesi, ilgili işlevlerin bir arada organize edilmesi ve programların
gerçek dünyadakine benzer şekilde yapılandırılabilmesi gibi birçok avantaj sağlar.
Ortak nesne tabanlı programlama görevleri
Uygulamada, nesne tabanlı programlama iki bölüm içerir. Bu bölümlerden biri, program tasarlama stratejileri ve
teknikleridir. (Genellikle nesne tabanlı tasarım olarak adlandırılır.) Bu geniş bir konu olup bu bölümde ele
alınmamıştır. OOP'nin diğer bölümü ise, nesne tabanlı bir yaklaşım kullanan program oluşturulması için belirli bir
programlama dilinde kullanılabilir olan gerçek programlama yapılarıdır. Bu bölümde, OOP'deki şu ortak görevler
açıklanmaktadır:
• Sınıfları tanımlama
• Özellikler, yöntemler ve alma ve ayarlama erişimcileri (erişimci yöntemleri) oluşturma
• Sınıflara, özelliklere, yöntemlere ve erişimcilere erişimi denetleme
• Statik özellikler ve yöntemler oluşturma
• Numaralandırmaya benzer yapılar oluşturma
• Arabirimleri tanımlama ve kullanma
• Sınıf öğelerini geçersiz kılma da dahil, miras ile çalışma
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 90
ActionScript'te nesne tabanlı programlama
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:
• Nitelik: Sınıf tanımında bir sınıf öğesine (örn. bir özellik veya yöntem) atanan özellik. Nitelikler genellikle,
programın diğer bölümlerindeki kodlar tarafından özellik veya yöntemin erişilebilir olup olmayacağını
tanımlamak için kullanılır. Örneğin, private ve public niteliklerdir. Özel bir yöntem yalnızca sınıfın içindeki kod
tarafından çağrılabilirken genel bir yöntem programdaki herhangi bir kod tarafından çağrılabilir.
• Sınıf: Belirli bir türdeki nesnelerin yapı ve davranışının tanımı (bu veri türündeki nesnelerin bir şablonu veya
şeması gibi).
• Sınıf hiyerarşisi: Hangi sınıfların diğer sınıflardan miras aldığını belirten, ilişkili birden çok sınıfın yapısı.
• Yapıcı: Sınıfın örneği oluşturulduğunda çağrılan, bir sınıfta tanımlayabildiğiniz özel bir yöntem. Yapıcı genellikle
varsayılan değerleri belirtmek veya nesne için kurulum işlemlerini gerçekleştirmek için kullanılır.
• Veri türü: Belirli bir değişkenin saklayabildiği bilgi türü. Genellikle veri türü ile sınıf aynı anlamdadır.
• Nokta operatörü: ActionScript'te (ve diğer birçok programlama dilinde), bir adın, bir nesnenin alt öğesini (örn. bir
özellik ya da yöntem) ifade ettiğini belirtmek için kullanılan nokta işareti (.). Örneğin, myObject.myProperty
ifadesinde nokta operatörü, myProperty teriminin, myObject adındaki nesnenin öğesi olan bir değeri ifade ettiğini
belirtir.
• Numaralandırma: Tek bir sınıfın özellikleri olarak rahatlık sağlaması için birlikte gruplandırılmış ilgili sabit
değerleri kümesi.
• Miras: Bir sınıf tanımının, farklı bir sınıf tanımının tüm işlevlerini içermesine (ve genellikle bu işleve katkıda
bulunmasına ) olanak sağlayan OOP mekanizması.
• Örnek: Bir programda oluşturulmuş gerçek bir nesne.
• Ad alanı: Temel anlamda, kodun diğer koda erişmesi konusunda daha düzgün denetim sağlayan özel bir nitelik.
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Bu bölümdeki kod listeleri öncelikli
olarak veri türlerinin tanımlanması ve işlenmesiyle ilgili olduğundan, örneklerin test edilmesi işlemi kapsamında,
tanımlanan sınıfın bir örneğinin oluşturulması, örneğin özellikleri ya da yöntemleri kullanılarak işlenmesi ve daha
sonra bu örneğin özelliklerinin değerlerinin görüntülenmesi yer alır. Bu değerleri görüntülemek için, Sahne
Alanı'ndaki metin alanı örneğine değerleri yazmak veya değerleri Çıktı panelinde yazdırmak için trace() işlevini
kullanmak isteyebilirsiniz. Bu teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34 bölümünde ayrıntılı
şekilde açıklanmıştır.
Sınıflar
Sınıf, bir nesnenin soyut temsilidir. Sınıfta, bir nesnenin barındırabileceği veri türleri ve nesnenin sergileyebileceği
davranışlar hakkında bilgiler yer alır. Böyle bir soyutlamanın yararı, yalnızca birbiriyle etkileşim kuran birkaç
nesnenin yer aldığı küçük komut dosyaları yazdığınızda belirgin olmayabilir. Ancak programın kapsamı genişledikçe
ve yönetilmesi gereken nesne sayısı arttıkça, nesnelerin nasıl oluşturulduğu ve birbiriyle nasıl etkileşim kurduğu
konusunda sınıfların size daha iyi denetim sağladığını fark edebilirsiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 91
ActionScript'te nesne tabanlı programlama
ActionScript 1.0'a kadar ActionScript programcıları, sınıflara benzeyen yapılar oluşturmak için Function nesnelerini
kullanabilirdi. ActionScript 2.0 ise class ve extends gibi anahtar sözcüklerle sınıflar için biçimsel destek ekledi.
ActionScript 3.0, hem ActionScript 2.0'da ilk defa sunulan anahtar sözcüklerini desteklemeye devam eder hem de
protected ve internal nitelikleriyle gelişmiş erişim denetimi ve final ve override anahtar sözcükleriyle miras
üzerinden daha iyi denetim gibi yeni yetenekler de içerir.
Java, C++ veya C# gibi programlama dillerinde sınıf oluşturduysanız, ActionScript'in de benzer bir deneyim
sunduğunu göreceksiniz. ActionScript, ilerleyen bölümlerde her biri ele alınan class, extends ve public gibi aynı
anahtar sözcüklerin ve nitelik adlarının çoğunu paylaşır.
Not: Bu bölümde, özellik terimiyle değişkenler, sabitler ve yöntemler gibi herhangi bir nesne veya sınıf üyesi ifade
edilmektedir. Ayrıca sınıf ve statik terimleri sık sık birbirinin yerine kullanılsa da, bu bölümde bu terimler birbirinden
farklı şekilde ele alınmıştır. Örneğin, bu bölümde deyim sınıfı özellikleri, yalnızca statik üyeleri değil, bir sınıfın tüm
üyelerini ifade eder.
Sınıf tanımları
ActionScript 3.0 sınıf tanımları, ActionScript 2.0 sınıf tanımlarında kullanılana benzer bir sözdizimi kullanır. Sınıf
tanımının düzgün sözdizimi, ardından sınıf adının geldiği class anahtar sözcüğüdür. Sınıf adından sonra da, küme
ayraçları ({}) içine alınmış sınıf gövdesi gelir. Örneğin, aşağıdaki kod, visible adında tek bir değişken içeren Shape
adında bir sınıf oluşturur:
public class Shape
{
var visible:Boolean = true;
}
Önemli sözdizimi değişikliklerinden biri, paket içindeki sınıf tanımlarında gerçekleşmiştir. ActionScript 2.0'da, bir
sınıf bir paketin içindeyse, sınıf bildirimine paket adının da dahil edilmesi gerekir. package deyimini ilk defa sunan
ActionScript 3.0'da, paket adının, sınıf bildirimine değil, paket bildirimine dahil edilmesi gerekir. Örneğin, aşağıdaki
sınıf bildirimleri, flash.display paketinin bir parçası olan BitmapData sınıfının ActionScript 2.0 ve ActionScript 3.0'da
nasıl tanımlandığını gösterir:
// ActionScript 2.0
class flash.display.BitmapData {}
// ActionScript 3.0
package flash.display
{
public class BitmapData {}
}
Sınıf nitelikleri
ActionScript 3.0, aşağıdaki dört nitelikten birini kullanarak sınıf tanımlarını değiştirmenize olanak sağlar:
Nitelik
Tanım
dynamic
Çalışma zamanında örneklere özellik eklenmesine olanak sağlar.
final
Başka bir sınıf tarafından genişletilmemelidir.
internal (varsayılan)
Geçerli paketin içindeki başvurular tarafından görülebilir.
public
Her yerdeki başvurular tarafından görülebilir
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 92
ActionScript'te nesne tabanlı programlama
internal dışında bu niteliklerin her biri için, ilişkilendirilmiş davranışı elde etmek üzere açıkça niteliği dahil etmeniz
gerekir. Örneğin, bir sınıfı tanımlarken dynamic niteliğini dahil etmezseniz, çalışma zamanında sınıfa özellikler
ekleyemezsiniz. Aşağıdaki kodun gösterdiği gibi, sınıf tanımının başına niteliği yerleştirerek açıkça o niteliği atamış
olursunuz:
dynamic class Shape {}
Listede abstract adında bir nitelik bulunmadığına dikkat edin. Bunun nedeni, abstract sınıflarının ActionScript
3.0'da desteklenmemesidir. Ayrıca listede private ve protected adındaki niteliklerin de bulunmadığına dikkat edin.
Bu nitelikler yalnızca bir sınıf tanımı içinde anlam içerir ve tek başlarına sınıflara uygulanamaz. Bir sınıfın paket
dışında herkes tarafından görülebilir olmasını istemiyorsanız, sınıfı bir paketin içine yerleştirin ve internal niteliğiyle
işaretleyin. Alternatif olarak, hem internal hem de public niteliklerini çıkarabilirsiniz, böylece derleyici internal
niteliğini otomatik olarak sizin için ekler. Bir sınıfın tanımlandığı kaynak dosya dışında görülebilir olmasını
istemiyorsanız, sınıfı paket tanımının kapatma küme ayracının aşağısına, kaynak dosyanızın en altına yerleştirin.
Sınıf gövdesi
Küme ayraçları içine alınan sınıf gövdesi, sınıfınızın değişkenlerini, sabitlerini ve yöntemlerini tanımlamak için
kullanılır. Aşağıdaki örnek, Adobe Flash Player API'sinde Accessibility sınıfının bildirimini gösterir:
public final class Accessibility
{
public static function get active():Boolean;
public static function updateProperties():void;
}
Bir sınıf gövdesinin içinde bir ad alanını da tanımlayabilirsiniz. Aşağıdaki örnek, bir ad alanının, nasıl sınıf gövdesi
içinde tanımlanabildiğini ve o sınıftaki yöntemin bir niteliği olarak kullanılabildiğini gösterir:
public class SampleClass
{
public namespace sampleNamespace;
sampleNamespace function doSomething():void;
}
ActionScript 3.0, tanımları yalnızca sınıf gövdesine değil, deyimlere de dahil etmenize olanak sağlar. Bir sınıf
gövdesinin içinde bulunduğu halde yöntem tanımının dışında bulunan deyimler, tam olarak bir defa çalıştırılır—sınıf
tanımıyla ilk karşılaşılıp ilişkilendirilmiş sınıf nesnesi oluşturulduğunda. Aşağıdaki örnek, hello() adındaki bir harici
işleve yapılan çağrıyı ve sınıf tanımlandığında onaylama mesajı veren bir trace deyimini içerir:
function hello():String
{
trace("hola");
}
class SampleClass
{
hello();
trace("class created");
}
// output when class is created
hola
class created
Önceki ActionScript sürümlerinin aksine, ActionScript 3.0'da, aynı sınıf gövdesinde aynı ada sahip bir statik özelliğin
ve örnek özelliğinin tanımlanmasına izin verilir. Örneğin, aşağıdaki kod, message adında bir statik değişkeni ve aynı
ada sahip bir örnek değişkenini bildirir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 93
ActionScript'te nesne tabanlı programlama
class StaticTest
{
static var message:String = "static variable";
var message:String = "instance variable";
}
// In your script
var myST:StaticTest = new StaticTest();
trace(StaticTest.message); // output: static variable
trace(myST.message); // output: instance variable
Sınıf özelliği nitelikleri
ActionScript nesne modeli ele alınırken, property terimi, değişkenler, sabitler ve yöntemler gibi, sınıf öğesi olabilen
herhangi bir şeyi ifade eder. Bu, terimin daha dar kapsamda kullanıldığı ve yalnızca değişken olan veya bir alıcı ya da
ayarlayıcı yöntemi tarafından tanımlanmış sınıf üyelerini içerdiği ActionScript 3.0 Dil ve Bileşenler Başvurusu'ndaki
kullanım şeklinden farklıdır. ActionScript 3.0'da, bir sınıfın herhangi bir özelliğiyle kullanılan bir nitelik kümesi
vardır. Aşağıdaki tabloda bu nitelik kümesi listelenmektedir.
Nitelik
Tanım
internal (varsayılan)
Aynı paketin içindeki başvurular tarafından görülebilir.
private
Aynı sınıftaki başvurular tarafından görülebilir.
protected
Aynı sınıftaki ve türetilmiş sınıflardaki başvurular tarafından görülebilir.
public
Her yerdeki başvurular tarafından görülebilir
static
Sınıf örneklerinin aksine, bir özelliğin bir sınıfa ait olduğunu belirtir.
UserDefinedNamespace
Kullanıcı tarafından tanımlanmış özel ad alanı adı
Erişim denetimi ad alanı nitelikleri
ActionScript 3.0, bir sınıf içinde tanımlanmış özelliklere erişimi denetleyen dört özel nitelik sağlar: public, private,
protected ve internal.
public niteliği, bir özelliği komut dosyanızın her yerinde görülebilir duruma getirir. Örneğin, bir yöntemi kendi
paketinin dışındaki kodlar için kullanılabilir duruma getirmek üzere, yöntemi public niteliğiyle bildirmeniz gerekir.
var, const veya function anahtar sözcükleriyle bildirilmiş tüm özellikler için bu geçerlidir.
private niteliği, bir özelliğin yalnızca özelliğin tanımlayan sınıfı içindeki çağıranlar tarafından görülebilmesini sağlar.
Bu davranış, alt sınıfın bir üst sınıftaki özel özelliğine erişmesine olanak sağlayan, ActionScript 2.0'daki private
niteliğinin davranışından farklıdır. Davranıştaki başka bir önemli değişiklik de çalışma zamanı erişimiyle ilgilidir.
ActionScript 2.0'da, private anahtar sözcüğü yalnızca derleme zamanında erişimi yasaklarken çalışma zamanında
kolayca atlatılabilirdi. ActionScript 3.0'da ise artık bu durum geçerli değildir. private olarak işaretlenmiş özellikler,
derleme zamanında da çalışma zamanında da kullanılamaz.
Örneğin, aşağıdaki kod, tek bir değişkenle PrivateExample adında basit bir sınıf oluşturur ve sonra sınıfın dışından
özel değişkene erişmeyi dener. ActionScript 2.0'da derleme zamanı erişimi yasaklanırdı ancak derleme zamanında
değil de çalışma zamanında özellik araması yapan özellik erişimi operatörü ([]) kullanılarak bu yasak kolayca
atlatılabilirdi.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 94
ActionScript'te nesne tabanlı programlama
class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);// compile-time error in strict mode
trace(myExample["privVar"]); // ActionScript 2.0 allows access, but in ActionScript 3.0, this
is a run-time error.
ActionScript 3.0'da ise, katı mod kullanıyorsanız, nokta operatörü (myExample.privVar) kullanılarak bir özel özelliğe
erişme girişimi, derleme zamanı hatasına yol açar. Aksi takdirde, özellik erişimi operatörü (myExample["privVar"])
kullandığınızda olduğu gibi, çalışma zamanında hata bildirilir.
Aşağıdaki tabloda, mühürlenmiş (dinamik olmayan) bir sınıfa ait özel özelliğe erişme girişiminin sonuçları
özetlenmektedir:
Katı mod
Standart mod
nokta operatörü (.)
derleme zamanı hatası
çalışma zamanı hatası
ayraç operatörü ([])
çalışma zamanı hatası
çalışma zamanı hatası
dynamic niteliğiyle bildirilen sınıflarda, özel bir değişkene erişme girişimi, çalışma zamanı hatasına yol açmaz. Bunun
yerine değişken yalnızca görünmüyorsa, Flash Player veya Adobe® AIR™, undefined değerini döndürür. Ancak katı
modda nokta operatörünü kullanırsanız derleme zamanı hatası oluşur. Aşağıdaki örnek, önceki örnekle aynıdır; tek
farkı, PrivateExample sınıfının bir dinamik sınıf olarak bildirilmesidir:
dynamic class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);// compile-time error in strict mode
trace(myExample["privVar"]); // output: undefined
Dinamik sınıflar genellikle, bir sınıf için harici olan bir kod, özel bir özelliğe erişme girişiminde bulunduğunda hata
oluşturmak yerine undefined değerini döndürür. Aşağıdaki tabloda, yalnızca katı modda özel bir özelliğe erişmek için
nokta operatörü kullanıldığında bir hata oluşturulduğu gösterilir:
Katı mod
Standart mod
nokta operatörü (.)
derleme zamanı hatası
undefined
ayraç operatörü ([])
undefined
undefined
ActionScript 3.0'da ilk defa sunulan protected niteliği, bir özelliği kendi sınıfı veya alt sınıfı içindeki çağıranlar
tarafından görülebilir duruma getirir. Başka bir deyişle, protected özelliği kendi sınıfı içinde kullanılabilir veya miras
hiyerarşisinde kendisinin aşağısında bulunan sınıflar için kullanılabilir durumdadır. Alt sınıf aynı pakette veya farklı
bir pakette de olsa bu durum geçerlidir.
ActionScript 2.0'a alışkın olanlar için bu işlevsellik, ActionScript 2.0'daki private niteliğine benzer. ActionScript 3.0
protected niteliği, Java'daki protected niteliğine çok benzer ancak aynı paketteki çağıranlara da erişim izni vererek
Java sürümünden farklılık gösterir. protected niteliği, alt sınıfınız için gerekli olan ancak miras zincirinin dışındaki
kodlardan gizlemek istediğiniz bir değişken veya yönteminiz olduğunda kullanışlıdır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 95
ActionScript'te nesne tabanlı programlama
ActionScript 3.0'da yeni olan internal niteliği, bir özelliğin kendi paketi içindeki çağıranlar tarafından görülebilir
olmasını sağlar. Bu, bir paket içindeki kod için varsayılan nitelik olup aşağıdaki niteliklerden herhangi birine sahip
olmayan tüm özellikler için geçerlidir:
•
public
•
private
•
protected
• kullanıcı tanımlı bir ad alanı
Java'da bu erişim düzeyi için açıkça bir ad olmayıp yalnızca başka bir erişim değiştiricisinin çıkarılmasıyla bu erişim
düzeyi elde edilebilse de, internal niteliği, Java'daki varsayılan erişim denetimine benzer. internal niteliği, özelliği
yalnızca kendi paketi içindeki çağıranlar tarafından görülebilir duruma getirme amacınızı açıkça belirtme seçeneğini
size sunar.
static niteliği
var, const veya function anahtar sözcükleriyle bildirilmiş özelliklerle kullanılabilen static niteliği, bir özelliği
sınıfın örneklerine değil, sınıfa eklemenize olanak sağlar. Sınıf için harici olan kodun, örnek adı yerine sınıf adını
kullanarak statik özellikleri çağırması gerekir.
Statik özellikler alt sınıflar tarafından miras alınmaz ancak özellikler, alt sınıfın kapsam zincirinin parçasıdır. Başka bir
deyişle, alt sınıfın gövdesi içinde, statik bir değişken veya yöntem tanımlanmış olduğu sınıfa başvurulmadan
kullanılabilir. Daha fazla bilgi için, bkz. “Statik özellikler miras alınmaz” sayfa 112.
Kullanıcı tanımlı ad alanı nitelikleri
Önceden tanımlanmış erişim denetimi niteliklerine alternatif olarak, bir nitelik olarak kullanılmak üzere özel bir ad
alanı oluşturabilirsiniz. Her tanım için yalnızca bir ad alanı niteliği kullanılabilir ve ad alanı niteliğini, erişim denetimi
niteliklerinden herhangi biriyle (public, private, protected, internal) birlikte kullanamazsınız. Ad alanlarını
kullanma hakkında daha fazla bilgi için, bkz. “Ad alanları” sayfa 42.
Değişkenler
Değişkenler, var veya const anahtar sözcükleriyle bildirilebilir. var anahtar sözcüğüyle bildirilmiş değişkenlerin
değerleri, komut dosyasının çalıştırılması sırasında birden çok defa değişebilir const anahtar sözcükleriyle bildirilen
değişkenler sabitler olarak adlandırılır ve kendilerine yalnızca bir defa atanmış değerlere sahip olabilir. Başlatılmış bir
sabite yeni bir değer atama girişimi hataya yol açar. Daha fazla bilgi için, bkz. “Sabitler” sayfa 67.
Statik değişkenler
Statik değişkenler, static anahtar sözcüğü ile var veya const deyiminin birleşimi kullanılarak bildirilir. Bir sınıf
örneğine değil, sınıfa eklenen statik değişkenler, nesne sınıfının tamamı için geçerli olan bilgilerin saklanıp
paylaşılmasında kullanışlıdır. Örneğin, bir sınıfın başlatılma sayısının hesabını tutmak istiyorsanız veya izin verilen
maksimum sınıf örneği sayısını saklamak istiyorsanız statik değişken uygundur.
Aşağıdaki örnek, sınıf başlatma sayısının izlenmesi için totalCount değişkenini ve maksimum başlatma sayısını
saklamak için MAX_NUM sabitini oluşturur. totalCount ve MAX_NUM değişkenleri, belirli bir örneğe değil, bir bütün
olarak sınıfa uygulanan değerleri içerdiğinden statiktir.
class StaticVars
{
public static var totalCount:int = 0;
public static const MAX_NUM:uint = 16;
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 96
ActionScript'te nesne tabanlı programlama
StaticVars sınıfına ve bu sınıfın alt sınıflarına harici olan kod, yalnızca sınıfın kendisi üzerinden totalCount ve
MAX_NUM özelliklerine başvurabilir. Örneğin, aşağıdaki kod çalışır:
trace(StaticVars.totalCount); // output: 0
trace(StaticVars.MAX_NUM); // output: 16
Sınıfın bir örneği üzerinden statik değişkenlere erişemezsiniz, bu nedenle de aşağıdaki kod hata döndürür:
var myStaticVars:StaticVars = new StaticVars();
trace(myStaticVars.totalCount); // error
trace(myStaticVars.MAX_NUM); // error
StaticVars sınıfının MAX_NUM için yaptığı gibi, hem static hem de const anahtar sözcükleriyle bildirilen
değişkenlerin, siz sabiti bildirdiğiniz anda başlatılması gerekir. Yapıcı veya bir örnek yöntemi içinde MAX_NUM öğesine
bir değer atayamazsınız. Aşağıdaki kod, statik sabit başlatmanın geçerli bir yolu olmadığından bir hata oluşturur:
// !! Error to initialize static constant this way
class StaticVars2
{
public static const UNIQUESORT:uint;
function initializeStatic():void
{
UNIQUESORT = 16;
}
}
Örnek değişkenleri
Örnek değişkenleri arasında, var ve const anahtar sözcükleri ile ancak static anahtar sözcüğü olmadan bildirilen
özellikler yer alır. Sınıfın tamamı yerine sınıf örneklerine eklenen örnek değişkenler, bir örneğe özgü değerlerin
saklanmasında kullanışlıdır. Örneğin, Array sınıfı, belirli bir Array sınıfının barındırdığı dizi öğelerinin sayısını
saklayan length adında bir örnek özelliğine sahiptir.
var veya const olarak bildirilen örnek değişkenleri, bir alt sınıfta geçersiz kılınamaz. Ancak, alıcı ve ayarlayıcı
yöntemlerini geçersiz kılarak değişkenlerin geçersiz kılınmasına benzer işlevselliği gerçekleştirebilirsiniz. Daha fazla
bilgi için, bkz. “Erişimci yöntemlerini alma ve ayarlama” sayfa 99.
Yöntemler
Yöntemler, bir sınıf tanımının parçası olan işlevlerdir. Sınıfın bir örneği oluşturulduktan sonra, bir yöntem bu örneğe
bağımlı olur. Sınıf dışında bildirilen bir işlevden farklı olarak yöntem, eklendiği örnekten ayrı şekilde kullanılamaz.
Yöntemler, function anahtar sözcüğü kullanılarak tanımlanır. Tüm sınıf özelliklerinde olduğu gibi, özel, korumalı,
genel, dahili, statik veya özel ad alanı gibi sınıf özelliği niteliklerinden herhangi birini yöntemlere uygulayabilirsiniz.
Şunun gibi bir işlev deyimi kullanabilirsiniz:
public function sampleFunction():String {}
Veya aşağıdaki gibi bir işlev ifadesi atadığınız bir değişkeni kullanabilirsiniz:
public var sampleFunction:Function = function () {}
Çoğu durumda, aşağıdaki nedenlerden dolayı işlev ifadesi yerine işlev deyimi kullanmayı isterseniz:
• İşlev deyimleri daha kısa ve okunması daha kolaydır.
• İşlev deyimleri, override ve final anahtar sözcüklerini kullanmanıza olanak sağlar. Daha fazla bilgi için, bkz.
“Yöntemleri geçersiz kılma” sayfa 110.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 97
ActionScript'te nesne tabanlı programlama
• İşlev deyimleri, tanımlayıcı (başka bir deyişle, işlevin adı) ile yöntem gövdesinin içindeki kod arasında daha güçlü
bir bağ oluşturur. Değişkenin değeri bir atama deyimiyle değiştirilebildiğinden, değişken ile işlev ifadesi arasındaki
bağlantı herhangi bir zamanda kesilebilir. Değişkeni var yerine const ile bildirerek bu sorunu geçici olarak
çözebilseniz de, bu teknik, kodun okunmasını güçleştirip override ve final anahtar sözcüklerinin kullanılmasını
önlediğinden, en iyi uygulama olarak değerlendirilmez.
Prototip nesnesine bir işlev eklemeyi seçtiğinizde işlev ifadesi kullanmanız gerekir. Daha fazla bilgi için, bkz. “Prototip
nesnesi” sayfa 118.
Yapıcı yöntemleri
Bazen yapıcılar olarak da adlandırılan yapıcı yöntemleri, tanımlandıkları sınıfla aynı adı paylaşan işlevlerdir. new
anahtar sözcüğüyle sınıfın bir örneği her oluşturulduğunda, yapıcı yöntemine dahil ettiğiniz kodlar çalıştırılır.
Örneğin, aşağıdaki kod, status adında tek bir özellik içeren Example adında basit bir sınıfı tanımlar. status
değişkeninin başlangıç değeri, yapıcı işlevinin içinde ayarlanır.
class Example
{
public var status:String;
public function Example()
{
status = "initialized";
}
}
var myExample:Example = new Example();
trace(myExample.status); // output: initialized
Yapıcı yöntemleri yalnızca genel olabilir ancak public niteliğinin kullanılması isteğe bağlıdır Bir yapıcıda private,
protected veya internal gibi diğer erişim denetimi belirticilerinden herhangi birini kullanamazsınız. Ayrıca yapıcı
yöntemiyle kullanıcı tanımlı bir ad alanı da kullanamazsınız.
Yapıcı, super() deyimini kullanarak doğrudan üst sınıfının yapıcısına açıkça bir çağrı yapabilir. Üst sınıf yapıcısı
açıkça çağrılmazsa, derleyici otomatik olarak yapıcı gövdesindeki birinci deyimin önüne bir çağrı ekler. Üst sınıfın
başvurusu olarak super önekini kullanarak da üst sınıf yöntemlerini çağırabilirsiniz. Aynı yapıcı gövdesinde hem
super() hem de super öğesini kullanmaya karar verirseniz, ilk olarak super() öğesini çağırdığınızdan emin olun.
Aksi takdirde, super başvurusu beklendiği gibi davranmaz. super() yapıcısının ayrıca throw veya return
deyiminden önce çağrılması gerekir.
Aşağıdaki örnek, super() yapıcısını çağırmadan önce super başvurusunu kullanmaya çalışmanız durumunda ne
olacağını gösterir. Yeni bir sınıf olan ExampleEx, Example sınıfını genişletir. ExampleEx yapıcısı, üst sınıfında
tanımlanmış durum değişkenine erişmeye çalışır ancak bunu super() öğesini çağırmadan önce yapar. super()
yapıcısı çalıştırılıncaya kadar status değişkeni kullanılamadığından, ExampleEx yapıcısının içindeki trace()
deyimi, null değerini üretir.
class ExampleEx extends Example
{
public function ExampleEx()
{
trace(super.status);
super();
}
}
var mySample:ExampleEx = new ExampleEx(); // output: null
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 98
ActionScript'te nesne tabanlı programlama
Yapıcı içinde return deyiminin kullanılması geçerli bir durum olsa da, bir değer döndürülmesine izin verilmez. Başka
bir deyişle, return deyimlerinin ilişkilendirilmiş ifadeler veya değerler içermemesi gerekir. Aynı şekilde, yapıcı
yöntemlerinin değer döndürmesine izin verilmez, başka bir deyişle, herhangi bir döndürme türü belirtilemez.
Sınıfınızda bir yapıcı yöntemi tanımlamazsanız, derleyici otomatik olarak sizin için boş bir yapıcı oluşturur. Sınıfınız
başka bir sınıfı genişletirse, derleyici oluşturduğu yapıcıya bir super() çağrısı dahil eder.
Statik yöntemler
Sınıf yöntemleri olarak da adlandırılan statik yöntemler, static anahtar sözcüğüyle bildirilen yöntemlerdir. Sınıfın
örneğine değil, sınıfa eklenen statik yöntemler, tek bir örneğin durumu dışındaki şeyleri etkileyen işlevlerin
kapsüllenmesinde kullanışlıdır. Statik yöntemler bir bütün olarak sınıfa eklendiğinden, statik yöntemlere sınıfın
örneği üzerinden değil yalnızca sınıf üzerinden erişilebilir.
Statik yöntemler, sınıf örneklerinin durumunu etkilemekle sınırlı olmayan işlevlerin kapsüllenmesinde kullanışlıdır.
Başka bir deyişle, bir yöntem sınıf örneğinin değerini doğrudan etkilemeyen işlevler sağlıyorsa statik olmalıdır.
Örneğin, Date sınıfı, bir dizeyi alıp sayıya dönüştüren parse() adındaki bir statik yönteme sahiptir. Bu yöntem sınıfın
tek bir örneğini etkilemediğinden statiktir. parse() yöntemi bir tarih değerini temsil eden dizeyi alır, dizeyi ayrıştırır
ve Date nesnesinin dahili temsiliyle uyumlu bir formatta sayıyı döndürür. Date sınıfının bir örneğine yöntemin
uygulanması mantıklı olmadığından, bu yöntem bir örnek yöntemi değildir.
Statik parse() yöntemini, getMonth() gibi Date sınıfının örnek yöntemlerinden biriyle karşılaştırın. getMonth()
yöntemi, Date örneğinin belirli bir bileşenini (ay) alarak doğrudan örneğin değeri üzerinde çalıştığından, bir örnek
yöntemidir.
Statik yöntemler tek tek örneklere bağımlı olmadığından, statik yöntemin gövdesinde this veya super anahtar
sözcüklerini kullanamazsınız. this başvurusu ve super başvurusu yalnızca bir örnek yönteminin bağlamında anlam
içerir.
Bazı sınıf tabanlı programlama dillerinin aksine, ActionScript 3.0'da statik yöntemler miras alınmaz. Daha fazla bilgi
için, bkz. “Statik özellikler miras alınmaz” sayfa 112.
Örnek yöntemleri
Örnek yöntemleri, static anahtar sözcüğü olmadan bildirilen yöntemlerdir. Bütün olarak sınıfa değil, sınıfın
örneklerine eklenen örnek yöntemleri, sınıfın tek tek örneklerini etkileyen işlevlerin uygulanmasında kullanışlıdır.
Örneğin, Array sınıfı, doğrudan Array örneklerinde çalışan sort() adında bir örnek yöntemi içerir.
Örnek yönteminin gövdesinde statik değişkenler ve örnek değişkenleri kapsam içinde bulunur, başka bir deyişle, aynı
sınıfta tanımlanmış değişkenlere, basit bir tanımlayıcı kullanılarak başvurulabilir. Örneğin, şu sınıf (CustomArray)
Array sınıfını genişletir. CustomArray sınıfı, sınıf örneklerinin toplam sayısını izlemek için arrayCountTotal
adındaki bir statik değişkeni, örneklerin oluşturulma sırasını izleyen arrayNumber adındaki bir örnek değişkenini ve
bu değişkenlerin değerlerini döndüren getPosition() adındaki bir örnek yöntemini tanımlar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 99
ActionScript'te nesne tabanlı programlama
public class CustomArray extends Array
{
public static var arrayCountTotal:int = 0;
public var arrayNumber:int;
public function CustomArray()
{
arrayNumber = ++arrayCountTotal;
}
public function getArrayPosition():String
{
return ("Array " + arrayNumber + " of " + arrayCountTotal);
}
}
Sınıfa harici olan kodun CustomArray.arrayCountTotal öğesini kullanarak sınıf nesnesi üzerinden
arrayCountTotal statik değişkenini ifade etmesi gerekse de, getPosition() yönteminin gövdesinde bulunan kod,
doğrudan arrayCountTotal değişkenini ifade edebilir. Üst sınıflardaki statik değişkenler için de bu geçerlidir. Statik
özellikler ActionScript 3.0'da miras alınmasa da, üst sınıflardaki statik özellikler kapsam içindedir. Örneğin, Array
sınıfı, bir tanesi DESCENDING olarak adlandırılan birkaç statik değişkene sahiptir. Array alt sınıfında bulunan kod, basit
bir tanımlayıcı kullanarak DESCENDING statik sabitini ifade edebilir:
public class CustomArray extends Array
{
public function testStatic():void
{
trace(DESCENDING); // output: 2
}
}
Bir örnek yönteminin gövdesindeki this başvurusunun değeri, yöntemin eklendiği örneğin başvurusudur. Aşağıdaki
kod, this başvurusunun yöntemi içeren örneği işaret ettiğini gösterir:
class ThisTest
{
function thisValue():ThisTest
{
return this;
}
}
var myTest:ThisTest = new ThisTest();
trace(myTest.thisValue() == myTest); // output: true
Örnek yöntemlerinin mirası, override ve final anahtar sözcükleriyle denetlenebilir. Miras alınan bir yöntemi
yeniden tanımlamak için override niteliğini ve alt sınıfların bir yöntemi geçersiz kılmasını önlemek için final
niteliğini kullanabilirsiniz. Daha fazla bilgi için, bkz. “Yöntemleri geçersiz kılma” sayfa 110.
Erişimci yöntemlerini alma ve ayarlama
Alıcılar ve ayarlayıcılar olarak da adlandırılan alma ve ayarlama erişimci işlevleri, oluşturduğunuz sınıflar için
kullanımı kolay bir programlama arabirimi sağlarken, bilgi gizleme ve kapsüllemeye yönelik programlama ilkelerine
da bağlı kalmanıza olanak sağlar. Alma ve ayarlama işlevleri, sınıf özelliklerinizin sınıf için özel olmasını sürdürmenizi
ancak sınıfınızın kullanıcılarının bir sınıf yöntemi çağırmak yerine bir sınıf değişkenine erişiyormuş gibi bu özelliklere
erişmesine olanak sağlar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 100
ActionScript'te nesne tabanlı programlama
Bu yaklaşımın avantajı, getPropertyName() ve setPropertyName() gibi kullanılması güç adlara sahip geleneksel
erişimci işlevlerinden kaçınmanıza olanak sağlamasıdır. Alıcı ve ayarlayıcıların başka bir avantajı da, hem okuma hem
de yazma erişimine izin veren her özellik için genele açık iki işlevden kaçınabilmenizi sağlamasıdır.
GetSet adındaki şu örnek sınıf, privateProperty adındaki özel değişkene erişim sağlayan publicAccess() adında
alma ve ayarlama erişimci işlevlerini içerir:
class GetSet
{
private var privateProperty:String;
public function get publicAccess():String
{
return privateProperty;
}
public function set publicAccess(setValue:String):void
{
privateProperty = setValue;
}
}
privateProperty özelliğine doğrudan erişmeyi denerseniz, aşağıdaki gibi bir hata oluşur:
var myGetSet:GetSet = new GetSet();
trace(myGetSet.privateProperty); // error occurs
Bunun yerine, GetSet sınıfının kullanıcısı, publicAccess adında bir özellik olarak görüntülenen ancak gerçekte
privateProperty adındaki özel özellikte çalışan bir alma ve ayarlama erişimcisi işlevleri çifti olan bir öğeyi kullanır.
Aşağıdaki örnek, GetSet sınıfını başlatır ve sonra publicAccess adındaki genel erişimciyi kullanarak
privateProperty değerini ayarlar:
var myGetSet:GetSet = new GetSet();
trace(myGetSet.publicAccess); // output: null
myGetSet.publicAccess = "hello";
trace(myGetSet.publicAccess); // output: hello
Alıcı ve ayarlayıcı işlevleri, normal sınıf üyesi değişkenleri kullandığınız zaman mümkün olmayacak şekilde, bir üst
sınıftan miras alınan özellikleri geçersiz kılmanıza olanak sağlar. var anahtar sözcüğü kullanılarak bildirilen sınıf üyesi
değişkenleri, bir alt sınıfta geçersiz kılınamaz. Alıcı ve ayarlayıcı işlevleri kullanılarak oluşturulan özelliklerse bu
kısıtlamaya sahip değildir. Bir üst sınıftan miras alınan alıcı ve ayarlayıcı işlevlerinde override niteliğini
kullanabilirsiniz.
Bağımlı yöntemler
Bazen yöntem kapanışı olarak da adlandırılan bir bağımlı yöntem, yalnızca örneğinden ayıklanmış bir yöntemdir.
Bağımlı yöntem örnekleri arasında, bir işleve argüman olarak iletilen veya bir işlevden değer olarak döndürülen
yöntemler yer alır. ActionScript 3.0'da yeni bir özellik olan bağımlı yöntem, kendi örneğinden ayıklandığında da sözlü
ortamını koruduğundan bir işlev kapanışına benzer. Bağımlı yöntem ile işlev kapanışı arasındaki en önemli fark,
bağımlı yöntemin this başvurusunun, yöntemi uygulayan örneğe bağlı veya bağımlı kalmaya devam etmesidir. Başka
bir deyişle, bağımlı yöntemdeki this başvurusu her zaman yöntemi uygulayan orijinal nesneyi işaret eder. İşlev
kapanışları için, this başvurusu geneldir, başka bir deyişle, çağrıldığı zaman işlevin ilişkilendirilmiş olduğu nesneyi
işaret eder.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 101
ActionScript'te nesne tabanlı programlama
this anahtar sözcüğünü kullanıyorsanız, bağımlı yöntemleri anlamanız önemlidir. this anahtar sözcüğünün
yöntemin üst nesnesine bir başvuru sağladığını unutmayın. ActionScript programcılarının çoğu, this anahtar
sözcüğünün her zaman yöntemin tanımını içeren nesneyi veya sınıfı ifade etmesini bekler. Ancak yöntem bağlama
olmadan bu her zaman geçerli olmayabilir. Örneğin, önceki ActionScript sürümlerinde this başvurusu her zaman
yöntemi uygulayan örneği ifade etmiyordu. ActionScript 2.0'da bir örnekten yöntemler ayıklandığında, this
başvurusu orijinal örneğe bağımlı olmamakla kalmaz aynı zamanda örneğin sınıfının üye değişkenleri ve yöntemleri
de kullanılamaz. Bir yöntemi parametre olarak ilettiğinizde bağımlı yöntemler otomatik olarak oluşturulduğundan
ActionScript 3.0'da bu bir sorun yaratmaz. Bağımlı yöntemler, this anahtar sözcüğünün her zaman yöntemin
tanımlanmış olduğu nesne veya sınıfa başvurmasını sağlar.
Aşağıdaki kod, bağımlı yöntemi tanımlayan foo() adındaki bir yöntemi ve bağımlı yöntemi döndüren bar()
adındaki bir yöntemi içeren ThisTest adındaki bir sınıfı tanımlar. Sınıfa harici olan kod, ThisTest sınıfının bir örneğini
oluşturur, bar() yöntemini çağırır ve döndürme değerini myFunc adındaki bir değişkende saklar.
class ThisTest
{
private var num:Number = 3;
function foo():void // bound method defined
{
trace("foo's this: " + this);
trace("num: " + num);
}
function bar():Function
{
return foo; // bound method returned
}
}
var myTest:ThisTest = new ThisTest();
var myFunc:Function = myTest.bar();
trace(this); // output: [object global]
myFunc();
/* output:
foo's this: [object ThisTest]
output: num: 3 */
Kodun son iki satırı, kendisinden bir önceki satırsa bulunan this başvurusu genel nesneyi işaret etse de, foo()
bağımlı yöntemindeki this başvurusunun halen ThisTest sınıfının bir örneğini işaret ettiğini gösterir. Üstelik, myFunc
değişkeninde saklanan bağımlı yöntem, ThisTest sınıfının üye değişkenlerine erişmeye devam eder. Bu kodun aynısı
ActionScript 2.0'da çalıştırılsa, this başvuruları eşleşir ve num değişkeni undefined olurdu.
addEventListener() yöntemi, argüman olarak bir işlev veya yöntem iletmenizi gerektirdiğinden, bağımlı
yöntemlerin eklenmesinin en belirgin olduğu alanlardan biri olay işleyicileridir. Daha fazla bilgi için, bkz. Sınıf
yöntemi olarak tanımlanan dinleyici işlevi, “Olay dinleyicileri” sayfa 253.
Sınıflarla numaralandırma
Numaralandırmalar, küçük bir değer kümesini kapsüllemek için oluşturduğunuz özel veri türleridir. ActionScript 3.0,
enum anahtar sözcüğüne sahip C++ veya Numaralandırma arabirimine sahip Java uygulamalarından farklı olarak
belirli bir numaralandırma hizmetini desteklemez. Ancak sınıfları ve statik sabitleri kullanarak numaralandırmalar
oluşturabilirsiniz. Örneğin, ActionScript 3.0'daki PrintJob sınıfı, aşağıdaki kodda gösterildiği gibi, "landscape" ve
"portrait" değerlerinin de yer aldığı bir değer kümesini saklamak için PrintJobOrientation adında bir
numaralandırma kullanır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 102
ActionScript'te nesne tabanlı programlama
public final class PrintJobOrientation
{
public static const LANDSCAPE:String = "landscape";
public static const PORTRAIT:String = "portrait";
}
Kural gereği, sınıfı genişletmeye gerek olmadığından, numaralandırma sınıfı final niteliğiyle bildirilir. Sınıf yalnızca
statik üyeleri içerir, başka bir deyişle, sınıfın örneklerini oluşturmazsınız. Bunun yerine, aşağıdaki kod alıntısında
gösterildiği gibi, doğrudan sınıf nesnesi üzerinden numaralandırma değerlerine erişirsiniz:
var pj:PrintJob = new PrintJob();
if(pj.start())
{
if (pj.orientation == PrintJobOrientation.PORTRAIT)
{
...
}
...
}
ActionScript 3.0'daki numaralandırma sınıflarının tümü yalnızca String, int veya uint türündeki değişkenleri içerir.
Değişmez dizeler veya sayı değerleri yerine numaralandırmaları kullanmanın avantajı, yazım hatalarının
numaralandırmada daha kolay bulunabilmesidir. Bir numaralandırmanın adını yanlış yazarsanız, ActionScript
derleyicisi bir hata oluşturur. Değişmez değerleri kullanırsanız, bir sözcüğü yanlış yazdığınızda veya yanlış sayıyı
kullandığınızda derleyici şikayette bulunmaz. Önceki örnekte, aşağıdaki alıntının gösterdiği gibi, numaralandırma
sabitinin adı hatalıysa, derleyici bir hata oluşturur:
if (pj.orientation == PrintJobOrientation.PORTRAI) // compiler error
Ancak, aşağıdaki gibi, bir dize değişmez değerini yanlış yazarsanız, derleyici bir hata oluşturmaz:
if (pj.orientation == "portrai") // no compiler error
Numaralandırma oluşturmaya yönelik ikinci bir teknik de, numaralandırma için statik özelliklere sahip ayrı bir sınıf
oluşturulmasıdır. Ancak her statik özellik, bir dize veya tam sayı değerini değil, sınıfın bir örneğini içerdiğinden, bu
teknik farklılık gösterir. Örneğin, aşağıdaki kod, haftanın günleri için bir numaralandırma sınıfı oluşturur:
public final class Day
{
public static const
public static const
public static const
public static const
public static const
public static const
public static const
}
MONDAY:Day = new Day();
TUESDAY:Day = new Day();
WEDNESDAY:Day = new Day();
THURSDAY:Day = new Day();
FRIDAY:Day = new Day();
SATURDAY:Day = new Day();
SUNDAY:Day = new Day();
Bu teknik ActionScript 3.0 tarafından kullanılmasa da, tekniğin sağladığı gelişmiş tür denetlemesini tercih eden birçok
geliştirici tarafından kullanılır. Örneğin, numaralandırma değeri döndüren bir yöntem, döndürme değerini
numaralandırma veri türüyle sınırlandırabilir. Aşağıdaki kod, yalnızca haftanın gününü döndüren bir işlevi değil, aynı
zamanda tür ek açıklaması olarak numaralandırma türünü kullanan bir işlev çağrısını da gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 103
ActionScript'te nesne tabanlı programlama
function getDay():Day
{
var date:Date = new Date();
var retDay:Day;
switch (date.day)
{
case 0:
retDay = Day.MONDAY;
break;
case 1:
retDay = Day.TUESDAY;
break;
case 2:
retDay = Day.WEDNESDAY;
break;
case 3:
retDay = Day.THURSDAY;
break;
case 4:
retDay = Day.FRIDAY;
break;
case 5:
retDay = Day.SATURDAY;
break;
case 6:
retDay = Day.SUNDAY;
break;
}
return retDay;
}
var dayOfWeek:Day = getDay();
Haftanın günlerinin her biriyle bir tam sayıyı ilişkilendirip günün dize halinde temsilini döndüren bir toString()
yöntemi sağlayacak şekilde Day sınıfını geliştirebilirsiniz. Uygulama olarak, bu şekilde Day sınıfını geliştirmek
isteyebilirsiniz.
Gömülü varlık sınıfları
ActionScript 3.0, gömülü varlıkları temsil etmek için gömülü varlık sınıfları adı verilen özel sınıfları kullanır. Gömülü
varlık, derleme zamanında bir SWF dosyasına dahil edilen, ses, görüntü, font gibi bir varlıktır. Bir varlığın dinamik
olarak yüklenmek yerine gömülmesi, o varlığın çalışma zamanında da kullanılabilir olmasını sağlarken SWF
dosyasının boyutunun artmasına neden olur.
Flash'ta gömülü varlık sınıflarını kullanma
Bir varlığı gömmek için, ilk olarak varlığı bir FLA dosyasının kütüphanesine yerleştirin. Ardından varlığın gömülü
varlık sınıfı için bir ad sağlamak üzere varlığın bağlantı özelliğini kullanın. Sınıf yolunda bu ada sahip bir sınıf
bulunmazsa, sizin için otomatik olarak bir sınıf oluşturulur. Daha sonra, gömülü varlık sınıfının bir örneğini
oluşturabilir ve o sınıf tarafından tanımlanmış veya miras alınmış özellikleri ve yöntemleri kullanabilirsiniz. Örneğin,
aşağıdaki kod, PianoMusic adındaki gömülü bir varlık sınıfına bağlı gömülü bir sesi çalmak için kullanılabilir:
var piano:PianoMusic = new PianoMusic();
var sndChannel:SoundChannel = piano.play();
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 104
ActionScript'te nesne tabanlı programlama
Arabirimler
Arabirim, ilgisiz nesnelerin birbiriyle iletişim kurmasına olanak sağlayan bir yöntem bildirimleri koleksiyonudur.
Örneğin, ActionScript 3.0, bir sınıfın olay nesnelerini işlemek için kullanabileceği yöntem bildirimlerini içeren
IEventDispatcher arabirimini tanımlar. IEventDispatcher arabirimi, nesnelerin birbirine olay nesnelerini iletmesi için
standart bir yol oluşturur. Aşağıdaki kod, IEventDispatcher arabiriminin tanımını gösterir:
public interface IEventDispatcher
{
function addEventListener(type:String, listener:Function,
useCapture:Boolean=false, priority:int=0,
useWeakReference:Boolean = false):void;
function removeEventListener(type:String, listener:Function,
useCapture:Boolean=false):void;
function dispatchEvent(event:Event):Boolean;
function hasEventListener(type:String):Boolean;
function willTrigger(type:String):Boolean;
}
Arabirimler, bir yöntemin arabirimi ile uygulaması arasındaki ayrımı esas alır. Bir yöntemin arabirimi, yöntemin adı,
tüm parametreleri ve döndürme türü gibi yöntemi çağırmak için gerekli olan tüm bilgileri içerir. Yöntemin
uygulaması, yalnızca arabirim bilgilerini değil, yöntemin davranışını yürüten çalıştırılabilir deyimleri de içerir.
Arabirim tanımı yalnızca yöntem arabirimlerini içerir ve arabirimi uygulayan tüm sınıflar, yöntem uygulamalarını
tanımlamaktan sorumludur.
ActionScript 3.0'da, EventDispatcher sınıfı, tüm IEventDispatcher arabirim yöntemlerini tanımlayıp yöntemlerin her
birine yöntem gövdeleri ekleyerek IEventDispatcher arabirimini uygular. Aşağıdaki kod, EventDispatcher sınıfı
tanımından bir alıntıdır:
public class EventDispatcher implements IEventDispatcher
{
function dispatchEvent(event:Event):Boolean
{
/* implementation statements */
}
...
}
IEventDispatcher arabirimi, olay nesnelerini işlemek ve IEventDispatcher arabirimini uygulayan diğer nesnelere de bu
olay nesnelerini iletmek için EventDispatcher örneklerinin kullandığı bir protokol görevi görür.
Arabirimin başka bir açıklaması da, veri türünü tıpkı sınıfın tanımladığı gibi tanımlamasıdır. Aynı şekilde, tıpkı sınıf
gibi, arabirim de tür ek açıklaması olarak kullanılabilir. Bir veri türü olarak arabirim, veri türü gerektiren is ve as
operatörleri gibi operatörlerle de kullanılabilir. Ancak sınıfın aksine, bir arabirim başlatılamaz. Bu ayrım da birçok
programcının arabirimleri soyut veri türleri olarak ve sınıfları da somut veri türleri olarak değerlendirmesine neden
olmuştur.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 105
ActionScript'te nesne tabanlı programlama
Arabirimi tanımlama
Bir arabirim tanımının yapısı, sınıf tanımının yapısına benzer; tek fark, arabirimin yalnızca herhangi bir yöntem
gövdesi içermeyen yöntemleri içerebilmesidir. Arabirimler, değişken veya sabitleri içeremez ancak alıcı ve
ayarlayıcıları içerebilir. Bir arabirimi tanımlamak için, interface anahtar sözcüğünü kullanın. Örneğin, şu
IExternalizable arabirimi, ActionScript 3.0'da flash.utils paketinin parçasıdır. IExternalizable arabirimi, bir nesnenin
serileştirilmesi, başka bir deyişle nesnenin bir aygıtta depolanmaya veya ağda taşınmaya uygun bir formata
dönüştürülmesine yönelik bir protokolü tanımlar.
public interface IExternalizable
{
function writeExternal(output:IDataOutput):void;
function readExternal(input:IDataInput):void;
}
IExternalizable arabiriminin public erişim denetimi değiştiricisi ile bildirildiğini unutmayın. Arabirim tanımları
yalnızca public ve internal erişim denetimi belirticileri tarafından değiştirilebilir. Bir arabirim tanımının içindeki
yöntem bildirimleri, herhangi bir erişim denetimi belirticisi içeremez.
ActionScript 3.0, arabirim adlarının I büyük harfiyle başladığı bir kuralı izler ancak arabirim adı olarak herhangi bir
geçerli tanımlayıcıyı kullanabilirsiniz. Arabirim tanımları genellikle paketin üst düzeyine yerleştirilir. Arabirim
tanımları bir sınıf tanımının içine veya başka bir arabirim tanımının içine yerleştirilemez.
Arabirimler başka bir veya birkaç arabirimi genişletebilir. Örneğin, aşağıdaki IExample arabirimi, IExternalizable
arabirimini genişletir:
public interface IExample extends IExternalizable
{
function extra():void;
}
IExample arabirimini uygulayan tüm sınıfların yalnızca extra() yöntemi için değil, aynı zamanda IExternalizable
arabiriminden miras alınan writeExternal() ve readExternal() yöntemleri için de uygulamalar içermesi gerekir.
Bir sınıfta arabirim uygulama
Sınıf, bir arabirim uygulayabilen ActionScript 3.0 dil öğesidir. Bir veya daha fazla arabirim uygulamak için sınıf
bildiriminde implements anahtar sözcüğünü kullanın. Aşağıdaki örnek, IAlpha ve IBeta adında iki arabirimi ve
bunların her ikisini uygulayan Alpha adında bir sınıfı tanımlar:
interface IAlpha
{
function foo(str:String):String;
}
interface IBeta
{
function bar():void;
}
class Alpha implements IAlpha, IBeta
{
public function foo(param:String):String {}
public function bar():void {}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 106
ActionScript'te nesne tabanlı programlama
Arabirim uygulayan bir sınıfta, uygulanan yöntemlerin şunları yapması gerekir:
•
public erişim denetimi tanımlayıcısını kullanma.
• Arabirim yöntemiyle aynı adı kullanma.
• Veri türlerinin her biri arabirim yöntemi parametresi veri türüyle eşleşen, aynı sayıda parametreye sahip olma.
• Aynı döndürme türünü kullanma.
public function foo(param:String):String {}
Ancak uyguladığınız yöntemlerin parametrelerini adlandırma şeklinizde esnekliğe sahip olursunuz. Uygulanan
yöntemdeki parametre sayısının ve her parametrenin veri türünün, arabirim yöntemininkilerle eşleşmesi gerekse de,
parametre adlarının eşleşmesi gerekmez. Örneğin, önceki örnekte, Alpha.foo() yönteminin parametresi param
olarak adlandırılır:
Ancak parametre, IAlpha.foo() arabirim yönteminde str olarak adlandırılır:
function foo(str:String):String;
Ayrıca varsayılan parametre değerlerinde de esnekliğe sahip olursunuz. Bir arabirim tanımı, varsayılan parametre
değerlerine sahip işlev bildirimleri içerebilir. Böyle bir işlev bildirimini uygulayan yöntemin, arabirim tanımında
belirtilen değerle aynı veri türünün üyesi olan bir varsayılan parametre değerine sahip olması gerekir ancak gerçek
değerin eşleşmesi gerekmez. Örneğin, aşağıdaki kod, 3 varsayılan parametre değerine sahip bir yöntemi içeren
arabirimi tanımlar:
interface IGamma
{
function doSomething(param:int = 3):void;
}
Aşağıdaki sınıf tanımı, Igamma arabirimini uygular ancak farklı bir varsayılan parametre değeri kullanır:
class Gamma implements IGamma
{
public function doSomething(param:int = 4):void {}
}
Bu esnekliğin nedeni, arabirim uygulama kurallarının özellikle veri türü uyumluluğunu sağlamak üzere tasarlanmış
olması ve aynı parametre adları ve varsayılan parametre değerlerinin zorunlu tutulmasının, bu hedefin elde
edilmesinde gerekli olmamasıdır.
Miras
Miras, programcıların varolan sınıfları esas alarak yeni sınıflar geliştirmesine olanak sağlayan bir kod yeniden
kullanım şeklidir. Varolan sınıflar genellikle temel sınıflar veya üst sınıflar olarak ifade edilirken, yeni sınıflar genellikle
alt sınıflar olarak adlandırılır. Mirasın en büyük avantajı, siz bir temel sınıftaki kodu yeniden kullanırken varolan kodu
değiştirmeden bırakmanıza olanak sağlamasıdır. Üstelik miras, diğer sınıfların temel sınıfla etkileşim kurma şekli
üzerinde herhangi bir değişiklik gerektirmez. Tamamen test edilmiş veya hala kullanımda olabilecek varolan bir sınıfı
değiştirmek yerine, mirası kullanarak sınıfı, ek özellik ve yöntemlerle genişletebileceğiniz tümleşik bir modül olarak
değerlendirebilirsiniz. Aynı şekilde, bir sınıfın başka bir sınıftan miras aldığını belirtmek için extends anahtar
sözcüğünü kullanırsınız.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 107
ActionScript'te nesne tabanlı programlama
Miras aynı zamanda kodunuzda çok biçimlilikten yararlanmanıza olanak sağlar. Çok biçimlilik, farklı veri türlerine
uygulandığında farklı şekilde davranan bir yöntem için tek bir yöntem adı kullanma yeteneğidir. Bunun basit bir
örneği, Circle ve Square adında iki alt sınıf içeren Shape adındaki bir temel sınıftır. Shape sınıfı, şeklin alanını
döndüren, area() adında bir yöntemi tanımlar. Çok biçimlilik uygulanıyorsa, Circle ve Square türündeki nesnelerde
area() yöntemini çağırıp sizin için doğru hesaplamaların yapılmasını sağlayabilirsiniz. Miras, alt sınıfların temel
sınıflardaki yöntemleri miras almasına, yeniden tanımlamasına veya geçersiz kılmasına olanak sağlayarak çok
biçimliliği etkinleştirir. Aşağıdaki örnekte, area() yöntemi Circle ve Square sınıfları tarafından yeniden tanımlanır:
class Shape
{
public function area():Number
{
return NaN;
}
}
class Circle extends Shape
{
private var radius:Number = 1;
override public function area():Number
{
return (Math.PI * (radius * radius));
}
}
class Square extends Shape
{
private var side:Number = 1;
override public function area():Number
{
return (side * side);
}
}
var cir:Circle = new Circle();
trace(cir.area()); // output: 3.141592653589793
var sq:Square = new Square();
trace(sq.area()); // output: 1
Her sınıf bir veri türünü tanımladığından, miras kullanılması, temel sınıf ile temel sınıfı genişleten sınıf arasında özel
bir ilişki oluşturur. Bir alt sınıfın, temel sınıfın tüm özelliklerine sahip olması garantilenir, başka bir deyişle, alt sınıfın
bir örneği her zaman temel sınıfın bir örneği yerine geçebilir. Örneğin, bir yöntem Shape türünde bir parametreyi
tanımlarsa, aşağıdaki gibi, Circle öğesi Shape öğesini genişlettiğinden Circle türünde bir argüman iletilmesi geçerli bir
durumdur:
function draw(shapeToDraw:Shape) {}
var myCircle:Circle = new Circle();
draw(myCircle);
Örnek özellikleri ve miras
function, var veya const anahtar sözcükleriyle tanımlanmış bir örnek özelliği, özellik temel sınıfta private
niteliğiyle bildirilmediği sürece, tüm alt sınıflar tarafından miras alınır. Örneğin, ActionScript 3.0'daki Event sınıfı,
tüm olay nesneleri için ortak olan özellikleri miras alan çok sayıda alt sınıfa sahiptir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 108
ActionScript'te nesne tabanlı programlama
Bazı olay türleri için, Event sınıfı, olayın tanımlanması için gerekli olan tüm özellikleri içerir. Bu olay türleri, Event
sınıfında tanımlı olanlar dışında bir örnek özelliği gerektirmez. Bu olaylara örnek olarak, veri başarıyla yüklendiğinde
gerçekleşen complete olayı ve bir ağ bağlantısı kurulduğunda gerçekleşen connect olayı verilebilir.
Aşağıdaki örnek, alt sınıflar tarafından miras alınan özellik ve yöntemlerden bazılarını gösteren bir Event sınıfı
alıntısıdır. Özellikler miras alındığından, tüm alt sınıflar bu özelliklere erişebilir.
public class Event
{
public function get type():String;
public function get bubbles():Boolean;
...
public
public
public
public
...
function
function
function
function
stopPropagation():void {}
stopImmediatePropagation():void {}
preventDefault():void {}
isDefaultPrevented():Boolean {}
}
Diğer olay türleri, Event sınıfında kullanılamayan benzersiz özellikleri gerektirir. Bu olaylar, Event sınıfının alt sınıfları
kullanılarak tanımlanır, böylece Event sınıfında tanımlanan özelliklere yeni özellikler eklenebilir. Böyle bir alt sınıfa
örnek olarak, mouseMove ve click olayları gibi fare hareketiyle veya fare tıklatmalarıyla ilişkilendirilmiş olaylara özgü
özellikler ekleyen MouseEvent sınıfı verilebilir. Aşağıdaki örnek, alt sınıfta bulunan ancak temel sınıfta bulunmayan
özelliklerin tanımını gösteren bir MouseEvent alıntısıdır:
public class MouseEvent extends Event
{
public static const CLICK:String= "click";
public static const MOUSE_MOVE:String = "mouseMove";
...
public function get stageX():Number {}
public function get stageY():Number {}
...
}
Erişim denetimi belirticileri ve miras
Bir özellik public anahtar sözcüğüyle bildirilirse, özellik her yerdeki kodlar tarafından görülebilir. Başka bir deyişle,
private, protected ve internal anahtar sözcüklerinin aksine, public anahtar sözcüğü özellik mirasına herhangi
bir kısıtlama koymaz.
Bir özellik private anahtar sözcüğüyle bildirilirse, yalnızca kendisini tanımlayan sınıfta görülebilir, başka bir deyişle,
alt sınıflar tarafından miras alınmaz. Bu davranış, private anahtar sözcüğünün daha çok ActionScript 3.0 protected
anahtar sözcüğü gibi davrandığı önceki ActionScript sürümlerinden farklıdır.
protected anahtar sözcüğü, bir özelliğin yalnızca kendisini tanımlayan sınıfta değil, tüm alt sınıflar için de görülebilir
olduğunu belirtir. Java programlama dilindeki protected anahtar sözcüğünün aksine, ActionScript 3.0'daki
protected anahtar sözcüğü, bir özelliği aynı paketteki diğer tüm sınıflar tarafından görülebilir duruma getirmez.
ActionScript 3.0'da, yalnızca alt sınıflar protected anahtar sözcüğüyle bildirilen bir özelliğe erişebilir. Üstelik, alt sınıf
temel sınıfla aynı pakette de olsa farklı pakette de olsa, korumalı özelliği o alt sınıf tarafından görülebilir.
Bir özelliğin görünebilirliğini tanımlandığı paketle sınırlandırmak için, internal anahtar sözcüğünü kullanın veya
herhangi bir erişim denetimi belirticisi kullanmayın. internal erişim denetimi belirticisi, herhangi bir erişim
denetimi belirticisi belirtilmediğinde geçerli olan varsayılandır. internal olarak işaretlenmiş bir özellik yalnızca aynı
pakette bulunan bir alt sınıf tarafından miras alınır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 109
ActionScript'te nesne tabanlı programlama
Erişim denetimi belirticilerinin her birinin, paket sınırları boyunca mirası nasıl etkilediğini görmek için aşağıdaki
örneği kullanabilirsiniz. Aşağıdaki örnek, AccessControl adında bir ana uygulama sınıfını ve Base ve Extender adında
başka iki sınıfı tanımlar. Base sınıfı, foo adındaki bir pakette ve Base sınıfının alt sınıfı olan Extender sınıfı da bar
adındaki bir pakettedir. AccessControl sınıfı yalnızca Extender sınıfını içe aktarır ve Base sınıfında tanımlanmış str
adındaki bir değişkene erişmeye çalışan Extender örneğini oluşturur. str değişkeni, public olarak bildirilir, böylece
aşağıdaki alıntıda gösterildiği gibi kod derleme yapar ve çalıştırılır:
// Base.as in a folder named foo
package foo
{
public class Base
{
public var str:String = "hello"; // change public on this line
}
}
// Extender.as in a folder named bar
package bar
{
import foo.Base;
public class Extender extends Base
{
public function getString():String {
return str;
}
}
}
// main application class in file named AccessControl.as
package
{
import flash.display.MovieClip;
import bar.Extender;
public class AccessControl extends MovieClip
{
public function AccessControl()
{
var myExt:Extender = new Extender();
trace(myExt.str);// error if str is not public
trace(myExt.getString()); // error if str is private or internal
}
}
}
Diğer erişim denetimi belirticilerinin, önceki örnekte derlemeyi ve çalıştırmayı nasıl etkilediğini görmek için,
AccessControl sınıfından aşağıdaki satırı sildikten veya aşağıdaki satırın yorumunu kaldırdıktan sonra, str
değişkeninin erişim denetimi belirticisini private, protected ya da internal olarak değiştirin:
trace(myExt.str);// error if str is not public
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 110
ActionScript'te nesne tabanlı programlama
Değişkenleri geçersiz kılmaya izin verilmez
var veya const anahtar sözcükleriyle bildirilen özellikler miras alınır ancak geçersiz kılınamaz. Bir özelliğin geçersiz
kılınması, bir alt sınıfta özelliğin yeniden tanımlanması anlamına gelir. Geçersiz kılınabilen tek özellik türü
yöntemlerdir—başka bir deyişle, function anahtar sözcüğüyle bildirilmiş özelliklerdir. Bir örnek değişkenini geçersiz
kılamasanız da, örnek değişkeni için alıcı ve ayarlayıcı yöntemleri oluşturup yöntemleri geçersiz kılarak benzer bir
işlevi elde edebilirsiniz. Daha fazla bilgi için, bkz. “Yöntemleri geçersiz kılma” sayfa 110.
Yöntemleri geçersiz kılma
Bir yöntemin geçersiz kılınması, miras alınan bir yöntemin davranışının yeniden tanımlanması anlamına gelir. Statik
yöntemler miras alınmaz ve geçersiz kılınamaz. Ancak, örnek yöntemleri, alt sınıflar tarafından miras alınır ve şu iki
kriter karşılandığı sürece geçersiz kılınabilir:
• Örnek yöntemi temel sınıfta final anahtar sözcüğüyle bildirilmez. final anahtar sözcüğü bir örnek yöntemiyle
kullanıldığında, programcının, alt sınıfların yöntemi geçersiz kılmasını önleme amacında olduğunu belirtir.
• Örnek yöntemi temel sınıfta private erişim denetimi belirticisiyle bildirilmez. Bir yöntem temel sınıfta private
olarak işaretlenmişse, temel sınıf yöntemi alt sınıf tarafından görülemeyeceğinden, alt sınıfta aynı şekilde
adlandırılmış yöntemi tanımlarken override anahtar sözcüğünün kullanılması gerekmez.
Bu kriterleri karşılayan bir örnek yöntemini geçersiz kılmak için, aşağıdaki şekilde alt sınıftaki yöntem tanımının
override anahtar sözcüğünü kullanması ve yöntemin üst sınıf sürümüyle eşleşmesi gerekir:
• Geçersiz kılma yönteminin, temel sınıf yöntemiyle aynı erişim denetimi düzeyine sahip olması gerekir. Dahili
olarak işaretlenmiş yöntemler, herhangi bir erişim denetimi belirticisi içermeyen yöntemlerle aynı erişim denetimi
düzeyine sahiptir.
• Geçersiz kılma yönteminin, temel sınıf yöntemiyle aynı sayıda parametreye sahip olması gerekir.
• Geçersiz kılma yöntemi parametrelerinin, temel sınıf yöntemindeki parametrelerle aynı veri türü ek açıklamalarına
sahip olması gerekir.
• Geçersiz kılma yönteminin, temel sınıf yöntemiyle aynı döndürme türüne sahip olması gerekir.
Her ikisinin de parametre sayısı ve parametrelerinin veri türü eşleştiği sürece, geçersiz kılma yöntemindeki
parametrelerin adları ile temel sınıftaki parametrelerin adlarının eşleşmesi gerekmez.
super deyimi
Programcılar bir yöntemi geçersiz kılarken genellikle davranışı tamamen değiştirmek yerine geçersiz kıldıkları üst sınıf
yönteminin davranışına ekleme yapmak ister. Bunun için de, bir alt sınıftaki yöntemin kendi üst sınıf sürümünü
çağırmasına olanak sağlayan bir mekanizma gerekir. super deyimi, anında üst sınıfa başvuru içererek bu mekanizmayı
sağlar. Aşağıdaki örnek, thanks() adındaki bir yöntemi içeren Base adında bir sınıfı ve thanks() yöntemini geçersiz
kılan Extender adındaki bir Base sınıfının alt sınıfını tanımlar. Extender.thanks() yöntemi, Base.thanks() öğesini
çağırmak için super deyimini kullanır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 111
ActionScript'te nesne tabanlı programlama
package {
import flash.display.MovieClip;
public class SuperExample extends MovieClip
{
public function SuperExample()
{
var myExt:Extender = new Extender()
trace(myExt.thanks()); // output: Mahalo nui loa
}
}
}
class Base {
public function thanks():String
{
return "Mahalo";
}
}
class Extender extends Base
{
override public function thanks():String
{
return super.thanks() + " nui loa";
}
}
Alıcıları ve ayarlayıcıları geçersiz kılma
Bir üst sınıfta tanımlanmış değişkenleri geçersiz kılamasanız da, alıcıları ve ayarlayıcıları geçersiz kılabilirsiniz.
Örneğin, aşağıdaki kod, ActionScript 3.0'daki MovieClip sınıfında tanımlanmış currentLabel adındaki bir alıcıyı
geçersiz kılar:
package
{
import flash.display.MovieClip;
public class OverrideExample extends MovieClip
{
public function OverrideExample()
{
trace(currentLabel)
}
override public function get currentLabel():String
{
var str:String = "Override: ";
str += super.currentLabel;
return str;
}
}
}
OverrideExample sınıf yapıcısında trace() çıktısı Override: null olup bu, örneğin miras alınan currentLabel
özelliğini geçersiz kılabildiğini gösterir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 112
ActionScript'te nesne tabanlı programlama
Statik özellikler miras alınmaz
Statik özellikler, alt sınıflar tarafından miras alınmaz. Başka bir deyişle, statik özelliklere bir alt sınıfın örneği üzerinden
erişilemez. Statik özelliğe yalnızca tanımlanmış olduğu sınıf nesnesi üzerinden erişilebilir. Örneğin, aşağıdaki kod,
Base adında bir temel sınıfı ve Base sınıfını genişleten Extender adında bir alt sınıfı tanımlar. test adındaki bir statik
değişken Base sınıfında tanımlanır. Aşağıdaki alıntıda yazılı kod katı modda derleme yapmaz ve standart modda bir
çalışma zamanı hatası oluşturur.
package {
import flash.display.MovieClip;
public class StaticExample extends MovieClip
{
public function StaticExample()
{
var myExt:Extender = new Extender();
trace(myExt.test);// error
}
}
}
class Base {
public static var test:String = "static";
}
class Extender extends Base { }
Aşağıdaki kodda gösterildiği gibi, test statik değişkenine yalnızca sınıf nesnesi üzerinden erişilebilir:
Base.test;
Ancak aynı adı statik özellik olarak kullanıp bir örnek özelliğinin tanımlanmasına izin verilir. Böyle bir örnek özelliği,
statik özellikle aynı sınıfta veya bir alt sınıfta tanımlanabilir. Örneğin, önceki örnekte yer alan Base sınıfı, test adında
bir örnek özelliğine sahip olabilirdi. Örnek özelliği Extender sınıfı tarafından miras alındığından, aşağıdaki kod
derleme yapar ve çalıştırılır. Test örneği değişkeninin tanımı Extender sınıfına kopyalanmayıp taşınırsa da kod
derleme yapar ve çalıştırılır.
package
{
import flash.display.MovieClip;
public class StaticExample extends MovieClip
{
public function StaticExample()
{
var myExt:Extender = new Extender();
trace(myExt.test);// output: instance
}
}
}
class Base
{
public static var test:String = "static";
public var test:String = "instance";
}
class Extender extends Base {}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 113
ActionScript'te nesne tabanlı programlama
Statik özellikler ve kapsam zinciri
Statik özellikler miras alınmasa da, bunlar kendilerini tanımlayan sınıfın ve o sınıfın alt sınıflarının kapsam zincirinde
bulunur. Bu nedenle de, statik özelliklerin hem tanımlandıkları sınıfın hem de alt sınıfların kapsamında olduğu
söylenebilir. Başka bir deyişle, bir statik özellik yalnızca statik özelliği tanımlayan sınıfın ve o sınıfın alt sınıflarının
gövdesinde doğrudan erişilebilir durumdadır.
Aşağıdaki örnek, Base sınıfında tanımlanmış statik test değişkeninin, Extender sınıfının kapsamında olduğunu
göstermek için, önceki örnekte tanımlanan sınıfları değiştirir. Başka bir deyişle, Extender sınıfı, test öğesini
tanımlayan sınıfın adını değişkene önek olarak eklemeden statik test değişkenine erişebilir.
package
{
import flash.display.MovieClip;
public class StaticExample extends MovieClip
{
public function StaticExample()
{
var myExt:Extender = new Extender();
}
}
}
class Base {
public static var test:String = "static";
}
class Extender extends Base
{
public function Extender()
{
trace(test); // output: static
}
}
Bir örnek özelliği, aynı sınıfta veya bir üst sınıfta statik özellik olarak aynı adı kullanacak şekilde tanımlanırsa, örnek
özelliği kapsam zincirinde daha yüksek bir öncelik elde eder. Örnek özelliğinin statik özelliği gölgelediği, başka bir
deyişle, statik özelliğin değeri yerine örnek özelliğinin değerinin kullanıldığı söylenebilir. Örneğin, aşağıdaki kod,
Extender sınıfı test adında bir örnek değişkeni tanımlarsa, trace() deyiminin, statik değişkenin değerini değil,
örnek değişkeninin değerini kullandığını gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 114
ActionScript'te nesne tabanlı programlama
package
{
import flash.display.MovieClip;
public class StaticExample extends MovieClip
{
public function StaticExample()
{
var myExt:Extender = new Extender();
}
}
}
class Base
{
public static var test:String = "static";
}
class Extender extends Base
{
public var test:String = "instance";
public function Extender()
{
trace(test); // output: instance
}
}
Gelişmiş başlıklar
Bu bölümde, ilk olarak ActionScript ve OOP'nin kısaca geçmişine yer verilmiş ve sonra ActionScript 3.0 nesne modeli
ve bu modelin eski ActionScript Virtual Machine (AVM1) içeren önceki Flash Player sürümlerinden çok daha yüksek
performans elde etmek için yeni ActionScript Virtual Machine (AVM2) uygulamasını nasıl etkinleştirdiği
açıklanmıştır.
ActionScript OOP desteğinin geçmişi
ActionScript 3.0, önceki ActionScript sürümleri esas alınarak oluşturulduğundan, ActionScript nesne modelinin nasıl
geliştiğinin anlaşılması yardımcı olabilir. ActionScript, önceki Flash geliştirme aracı sürümleri için basit bir komut
dosyası yazma mekanizması olarak kullanılmaya başlamıştır. Daha sonra programcılar ActionScript ile gittikçe daha
karmaşık uygulamalar oluşturmaya başladı. Bu programcıların gereksinimlerine yanıt vermek için, sonraki her
sürüme, karmaşık uygulamaların oluşturulmasını kolaylaştıran dil özellikleri eklendi.
ActionScript 1.0
ActionScript 1.0, Flash Player 6 ve öncesinde kullanılan dil sürümünü ifade eder. Bu geliştirme aşamasında bile
ActionScript nesne modeli, temel veri türü olarak nesne kavramını esas almıştı. ActionScript nesnesi bir grup özellik
içeren birleşik bir veri türüdür. Nesne modeli ele alınırken özellik terimi, değişkenler, işlevler veya yöntemler gibi bir
nesneye eklenen her şeyi içerir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 115
ActionScript'te nesne tabanlı programlama
Bu birinci nesil ActionScript, class anahtar sözcüğüyle sınıfların tanımlanmasını desteklemese de, prototip nesne adı
verilen özel bir nesne türünü kullanarak bir sınıfı tanımlayabilirsiniz. Java ve C++ gibi sınıf tabanlı dillerde yaptığınız
gibi, somut nesneler olarak başlatacağınız soyut bir sınıf tanımı oluşturmak için class anahtar sözcüğünü kullanmak
yerine, ActionScript 1.0 gibi prototip tabanlı diller, başka nesneler için bir model (veya prototip) olarak varolan bir
nesneyi kullanır. Sınıf tabanlı bir dilde nesneler, o nesnenin şablonu görevini gören bir sınıfa işaret edebilse de,
prototip tabanlı bir dildeki nesneler, bunun yerine nesnenin şablonu görevini gören başka bir nesneye (prototip) işaret
eder.
ActionScript 1.0'da bir sınıf oluşturmak üzere o sınıf için bir yapıcı işlevi tanımlarsınız. ActionScript'te işlevler yalnızca
soyut tanımlar değil, gerçek nesnelerdir. Oluşturduğunuz yapıcı işlevi, o sınıfın örnekleri için prototip nesne görevi
görür. Aşağıdaki kod, Shape adında bir sınıf oluşturur ve varsayılan olarak true değerine ayarlanmış visible adında
tek bir özelliği tanımlar:
// base class
function Shape() {}
// Create a property named visible.
Shape.prototype.visible = true;
Bu yapıcı işlevi, aşağıdaki gibi new operatörüyle başlatabileceğiniz bir Shape sınıfını tanımlar:
myShape = new Shape();
Shape() yapıcı işlevi nesnesi, Shape sınıfının örnekleri için prototip görevi gördüğü gibi, Shape sınıfının alt sınıfları
(başka bir deyişle, Shape sınıfını genişleten diğer sınıflar) için de prototip görevi görebilir.
Shape sınıfının alt sınıfı olan bir sınıfın oluşturulması iki adımda gerçekleşir. İlk olarak, aşağıdaki gibi, sınıf için bir
yapıcı işlevi tanımlayarak sınıfı oluşturun:
// child class
function Circle(id, radius)
{
this.id = id;
this.radius = radius;
}
İkinci olarak, Shape sınıfının, Circle sınıfının prototipi olduğunu bildirmek için new operatörünü kullanın. Varsayılan
olarak, oluşturduğunuz tüm sınıflar kendi prototipi olarak Object sınıfını kullanır, başka bir deyişle,
Circle.prototype öğesi geçerli olarak bir genel nesne (Object sınıfının bir örneği) içerir. Circle öğesinin
prototipinin Object değil Shape olduğunu belirtmek için, aşağıdaki kodu kullanarak genel bir nesneyi değil, Shape
nesnesini içerecek şekilde Circle.prototype öğesinin değerini değiştirin:
// Make Circle a subclass of Shape.
Circle.prototype = new Shape();
Şimdi Shape sınıfı ve Circle sınıfı, prototip zinciri olarak bilinen bir miras ilişkisiyle birbirine bağlanır. Diyagramda,
bir prototip zincirindeki ilişkiler gösterilmektedir:
Object.prototype
Shape.prototype
Circle.prototype
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 116
ActionScript'te nesne tabanlı programlama
Her prototip zincirinin sonundaki temel sınıf, Object sınıfıdır. Object sınıfı, ActionScript 1.0'da oluşturulmuş tüm
nesneler için temel prototip nesnesine işaret eden Object.prototype adında bir statik özellik içerir. Örnek prototip
zincirimizdeki bir sonraki nesne Shape nesnesidir. Bunun nedeni, Shape.prototype özelliğinin asla açıkça
ayarlanmaması ve bu nedenle de genel nesne (Object sınıfının bir örneği) içermeye devam etmesidir. Bu zincirdeki son
halka, prototipine (Shape sınıfına) bağlı Circle sınıfıdır. (Circle.prototype özelliği bir Shape nesnesi içerir.)
Aşağıdaki örnekte olduğu gibi, Circle sınıfının bir örneğini oluşturursak, örnek Circle sınıfının prototip zincirini miras
alır:
// Create an instance of the Circle class.
myCircle = new Circle();
Shape sınıfının bir üyesi olarak visible adında bir özellik oluşturduğumuzu hatırlayın. Örneğimizde, visible
özelliği, myCircle nesnesinin bir parçası olarak değil, yalnızca Shape nesnesinin bir üyesi olarak bulunur ancak
aşağıdaki kod satırı true değerini verir:
trace(myCircle.visible); // output: true
Flash Player, prototip zincirinde dolanarak myCircle nesnesinin visible özelliğini miras aldığını doğrulayabilir. Bu
kodu çalıştırırken, Flash Player ilk olarak myCircle nesnesinin özelliklerinde visible adındaki bir özelliği arar, ancak
bu özelliği bulamaz. Flash Player daha sonra Circle.prototype nesnesine bakar ancak yine visible adındaki
özelliği bulamaz. Flash Player, prototip zincirinde devam ederek en sonunda Shape.prototype nesnesinde
tanımlanmış visible özelliğini bulur ve o özelliğin değerini verir.
Basitlik sağlamak için bu bölümde prototip zincirinin ayrıntılarına ve karmaşık noktalarına yer verilmemiş olup
bunun yerine ActionScript 3.0 nesne modelini anlamanıza yardımcı olacak bilgilerin sağlanması amaçlanmıştır.
ActionScript 2.0
ActionScript 2.0, Java ve C++ gibi sınıf tabanlı dillerle çalışan kişilere tanıdık gelecek şekilde sınıflar tanımlamanıza
olanak sağlayan class, extends, public ve private gibi yeni anahtar sözcükler sunmuştur. ActionScript 1.0 ile
ActionScript 2.0 arasında temel alınan miras mekanizmasının değişmediğinin anlaşılması önemlidir. ActionScript 2.0
yalnızca sınıfların tanımlanması için yeni bir sözdizimi eklemiştir. Prototip zinciri, her iki dil sürümünde de aynı
şekilde çalışır.
Aşağıdaki alıntıda gösterildiği gibi, ActionScript 2.0 tarafından ilk defa sunulan yeni sözdizimi, birçok programcının
daha sezgisel bulduğu bir şekilde sınıfları tanımlamanıza olanak sağlar:
// base class
class Shape
{
var visible:Boolean = true;
}
ActionScript 2.0'ın ayrıca derleme zamanı tür denetlemesiyle kullanılmak üzere tür ek açıklamaları da sunduğunu
unutmayın. Bu, önceki örnekte bulunan visible özelliğinin yalnızca bir Boolean değeri içermesi gerektiğini
bildirmenize olanak sağlar. Yeni extends anahtar sözcüğü, alt sınıf oluşturma işlemini de basitleştirir. Aşağıdaki
örnekte, ActionScript 1.0'da iki adımda gerçekleştirilen işlem, extends anahtar sözcüğüyle tek adımda gerçekleştirilir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 117
ActionScript'te nesne tabanlı programlama
// child class
class Circle extends Shape
{
var id:Number;
var radius:Number;
function Circle(id, radius)
{
this.id = id;
this.radius = radius;
}
}
Şimdi yapıcı, sınıf tanımının parçası olarak bildirilir ve id ve radius sınıf özelliklerinin de açıkça bildirilmesi gerekir.
ActionScript 2.0 ayrıca arabirimlerin tanımı için de destek eklemiştir, bu sayede nesne tabanlı programlarınızı
nesneler arası iletişim için biçimsel olarak tanımlanmış protokollerle daha düzgün hale getirebilirsiniz.
ActionScript 3.0 sınıf nesnesi
Daha çok Java ve C++ ile ilişkilendirilmiş olan yaygın bir nesne tabanlı programlama paradigması, nesne türlerini
tanımlamak için sınıfları kullanır. Bu paradigmayı kullanan programlama dilleri, sınıfın tanımladığı veri türü
örneklerini oluşturmak için de sınıfları kullanabilir. ActionScript, sınıfları bu iki amaç için de kullanır ancak
ActionScript'in prototip tabanlı bir dil olması da ilginç bir özellik katar. ActionScript, her sınıf tanımı için, hem
davranışın hem de durumun paylaşılmasına olanak sağlayan özel bir sınıf nesnesi oluşturur. Ancak birçok
ActionScript programcısı için bu ayrım pratik bir kodlama anlamına gelmeyebilir. ActionScript 3.0, bu özel sınıf
nesnelerini kullanmadan hatta anlamadan karmaşık nesne tabanlı ActionScript uygulamaları oluşturabileceğiniz
şekilde tasarlanmıştır. Sınıf nesnelerinden yararlanmak isteyen ileri düzey programcılar için bu bölümde bu konular
ayrıntılı şekilde ele alınmıştır.
Aşağıdaki diyagram, A adındaki basit bir sınıfı temsil eden bir sınıf nesnesi yapısını göstermektedir. A sınıfı, class A
{} deyimiyle tanımlanmıştır:
Class.prototype
T
Object.prototype
CA
temsilci
tür
C
temsilci
prototip
yapıcı
A
P
A
özellikler
T
A
Diyagramdaki her dikdörtgen bir nesneyi temsil eder. Diyagramdaki her nesne, A sınıfına ait olduğunu temsil eden
bir A alt simge karakterine sahiptir. Sınıf nesnesi (CA), birçok başka önemli nesneye başvuruları içerir. Örnek
nitelikleri nesnesi (TA), bir sınıf tanımı içinde tanımlanan örnek özelliklerini saklar. Sınıf nitelikleri nesnesi (TCA),
dahili sınıf türünü temsil eder ve sınıf tarafından tanımlanan statik özellikleri saklar. (C alt simge karakteri "sınıfı" ifade
eder.) Prototip nesnesi (PA) her zaman başlangıçta constructor özelliği yoluyla eklendiği sınıf nesnesini ifade eder.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 118
ActionScript'te nesne tabanlı programlama
Nitelikler nesnesi
ActionScript 3.0'da yeni bir özellik olan nitelikler nesnesi, performans göz önünde tutularak uygulanmıştır. Önceki
ActionScript sürümlerinde, Flash prototip zincirinde dolandığı için ad arama zaman alıcı bir işlem olabiliyordu.
ActionScript 3.0'da, miras alınan özellikler, üst sınıflardan alt sınıfların nitelikler nesnesine kopyalandığından, ad
arama çok daha etkili olup daha az zaman alır.
Nitelikler nesnesine programcı kodu ile doğrudan erişilemez ancak performans artışı ve bellek kullanımındaki
iyileşme ile bu nesnenin varlığı hissedilebilir. Nitelikler nesnesi, bir sınıfın mizanpajı ve içerikleri hakkında ayrıntılı
bilgi içeren AVM2'yi sağlar. Bu bilgiler sayesinde AVM2, zaman alıcı bir işlem olan ad aramasına gerek kalmadan
özelliklere erişmeye veya yöntemler çağırmaya yönelik doğrudan makine talimatları oluşturabildiğinden, çalıştırma
süresini büyük ölçüde azaltabilir.
Nitelikler nesnesi sayesinde nesnenin bellek izi, önceki ActionScript sürümlerindeki benzer bir nesnenin bellek
izinden çok daha küçük olabilir. Örneğin, bir sınıf mühürlenmişse (başka bir deyişle, sınıfın dinamik olduğu
bildirilmemişse), o sınıfın örneği, dinamik olarak eklenmiş özelliklerin karma tablosunu gerektirmez ve nitelikler
nesnelerinin işaretçilerinden ve sınıfta tanımlanmış sabit özelliklere yönelik birkaç yuvadan biraz daha fazlasını
barındırabilir. Sonuç olarak, ActionScript 2.0'da 100 bayt bellek gerektiren bir nesne, ActionScript 3.0'da 20 bayt kadar
düşük bellek gerektirebilir.
Not: Nitelikler nesnesi dahili bir uygulama olup, gelecek ActionScript sürümlerinde bu uygulamanın değişmeyeceğine
veya tamamen kaldırılmayacağına dair bir garanti yoktur.
Prototip nesnesi
Her ActionScript sınıf nesnesi, sınıfın prototip nesnesine başvuru niteliğinde olan prototype adında bir özelliğe
sahiptir. Prototip nesnesi, ActionScript’in prototip tabanlı dil olması nedeniyle eski uygulamasının devamı
niteliğindedir. Daha fazla bilgi için, bkz. “ActionScript OOP desteğinin geçmişi” sayfa 114.
prototype özelliği salt okunur özelliktedir, başka bir deyişle, farklı nesnelere işaret edecek şekilde değiştirilemez. Bu
da, prototipin farklı bir sınıfa işaret edecek şekilde yeniden atanabildiği önceki ActionScript sürümlerindeki
prototype sınıfından farklılık gösterir. prototype özelliği salt okunur olsa da, bu özelliğin başvurduğu prototip
nesnesi salt okunur değildir. Başka bir deyişle, prototip nesnesine yeni özellikler eklenebilir. Prototip nesnesine
eklenen özellikler, sınıfın tüm örnekleri arasında paylaşılır.
Önceki ActionScript sürümlerinde tek miras mekanizması olan prototip zinciri, ActionScript 3.0'da yalnızca ikincil rol
oynar. Birincil miras mekanizması olan sabit özellik mirası, nitelikler nesnesi tarafından dahili olarak işlenir. Sabit
özellik, sınıf tanımının bir parçası olarak tanımlanan bir değişken veya yöntemdir. Sabit özellik mirası, class,
extends ve override gibi anahtar sözcüklerle ilişkilendirilmiş miras mekanizması olduğundan, sınıf mirası olarak da
adlandırılır.
Prototip zinciri, sabit özellik mirasından daha dinamik olan alternatif bir miras mekanizması sağlar. Yalnızca sınıf
tanımının bir parçası olarak değil, aynı zamanda sınıf nesnesinin prototype özelliği üzerinden çalışma zamanında da
sınıfın prototip nesnesine özellikler ekleyebilirsiniz. Ancak, derleyiciyi katı moda ayarlamanız durumunda, dynamic
anahtar sözcüğüyle bir sınıf bildirmediğiniz sürece bir prototip nesnesine eklenmiş özelliklere erişemeyebileceğinizi
unutmayın.
Prototip nesnesine birçok özellik eklenmiş olan sınıfa güzel bir örnek Object sınıfıdır. Object sınıfının toString() ve
valueOf() yöntemleri, gerçekten Object sınıfının prototip nesnesinin özelliklerine atanmış işlevlerdir. Aşağıda, bu
yöntemlerin bildirilmesinin teoride nasıl göründüğünü gösterir (uygulama ayrıntıları nedeniyle gerçek uygulama
biraz daha farklıdır):
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 119
ActionScript'te nesne tabanlı programlama
public dynamic class Object
{
prototype.toString = function()
{
// statements
};
prototype.valueOf = function()
{
// statements
};
}
Daha önceden belirtildiği gibi, sınıf tanımının dışında bir sınıfın prototip nesnesine bir özellik ekleyebilirsiniz.
Örneğin, toString() yöntemi aşağıdaki gibi Object sınıfının dışında da tanımlanabilir:
Object.prototype.toString = function()
{
// statements
};
Ancak sabit özellik mirasının aksine, prototip mirası, bir alt sınıfta yöntemi yeniden tanımlamak istediğinizde
override anahtar sözcüğünü gerektirmez. Örneğin. Object sınıfının bir alt sınıfında valueOf() yöntemini yeniden
tanımlamak istiyorsanız, üç seçeneğiniz vardır. İlk olarak, sınıf tanımının içinde alt sınıfın prototip nesnesinde bir
valueOf() yöntemini tanımlayabilirsiniz. Aşağıdaki kod, Object sınıfının Foo adında bir alt sınıfını oluşturur ve sınıf
tanımının bir parçası olarak Foo alt sınıfının prototip nesnesinde valueOf() yöntemini yeniden tanımlar. Her sınıf
Object öğesinden miras aldığı için, extends anahtar sözcüğünün kullanılması gerekmez.
dynamic class Foo
{
prototype.valueOf = function()
{
return "Instance of Foo";
};
}
İkinci olarak, aşağıdaki kodda gösterildiği gibi, sınıf tanımının dışında Foo alt sınıfının prototip nesnesinde bir
valueOf() yöntemini tanımlayabilirsiniz:
Foo.prototype.valueOf = function()
{
return "Instance of Foo";
};
Üçüncü olarak, Foo sınıfının parçası olarak valueOf() adında bir sabit özellik tanımlayabilirsiniz. Bu teknik, sabit
özellik mirası ile prototip mirasını karma olarak kullandığından diğer tekniklerden farklıdır. valueOf() öğesini
yeniden tanımlamak isteyen tüm Foo alt sınıflarının override anahtar sözcüğünü kullanması gerekir. Aşağıdaki kod,
Foo'da sabit özellik olarak tanımlanan valueOf() öğesini gösterir:
class Foo
{
function valueOf():String
{
return "Instance of Foo";
}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 120
ActionScript'te nesne tabanlı programlama
AS3 ad alanı
İki ayrı miras mekanizması, sabit özellik mirası ve prototip mirasının olması, çekirdek sınıfların özellikleri ve
yöntemleriyle ilgili ilginç bir uyumluluk zorluğu oluşturur. ActionScript'in esas aldığı ECMAScript dil belirtimiyle
uyumluluk için prototip mirasının kullanılması gerekir, başka bir deyişle, çekirdek sınıfın özellikleri ve yöntemleri o
sınıfın prototip nesnesinde tanımlanır. Diğer yandan, ActionScript 3.0 ile uyumluluk için sabit özellik mirasının
kullanılması gerekir, başka bir deyişle, çekirdek sınıfın özellikleri ve yöntemleri, const, var ve function anahtar
sözcükleri kullanılarak sınıf tanımında tanımlanır. Üstelik, prototip sürümleri yerine sabit özelliklerin kullanılması,
çalışma zamanı performansında önemli ölçüde artış sağlayabilir.
ActionScript 3.0, çekirdek sınıfları için hem prototip mirasını hem de sabit özellik mirasını kullanarak bu sorunu
çözer. Çekirdek sınıfların her biri iki özellik ve yöntem kümesi içerir. Kümelerden biri, ECMAScript belirtimiyle
uyumluluk sağlamak için prototip nesnesinde tanımlanırken, diğeri de ActionScript 3.0 ile uyumluluk sağlamak üzere
sabit özellikler ve AS3 ad alanıyla tanımlanır.
AS3 ad alanı, iki özellik ve yöntem kümesi arasında seçim yapılmasına yönelik kullanışlı bir mekanizma sağlar. AS3 ad
alanını kullanmazsanız, çekirdek sınıfın bir örneği, çekirdek sınıfın prototip nesnesinde tanımlanan özellikleri ve
yöntemleri miras alır. Sabit özellikler her zaman prototip özelliklerden daha çok tercih edildiği için, AS3 ad alanını
kullanmaya karar verirseniz, çekirdek sınıfın bir örneği AS3 sürümlerini miras alır. Başka bir deyişle, kullanılabilir bir
sabit özellik olduğunda, aynı ada sahip olan prototip özelliği yerine her zaman bu sabit özellik kullanılır.
Bir özelliğin veya yöntemin AS3 ad alanı sürümünü AS3 ad alanıyla niteleyerek kullanabilirsiniz. Örneğin, aşağıdaki
kod, Array.pop() yönteminin AS3 sürümünü kullanır:
var nums:Array = new Array(1, 2, 3);
nums.AS3::pop();
trace(nums); // output: 1,2
Alternatif olarak, bir kod bloğu içindeki tüm tanımlar için AS3 ad alanını açmak üzere use namespace direktifini
kullanabilirsiniz. Örneğin, aşağıdaki kod, pop() ve push() yöntemleri için AS3 ad alanını açmak üzere use
namespace direktifini kullanır:
use namespace AS3;
var nums:Array = new Array(1, 2, 3);
nums.pop();
nums.push(5);
trace(nums) // output: 1,2,5
ActionScript 3.0 ayrıca programınızın tamamına AS3 ad alanı uygulayabilmenizi sağlamak üzere her özellik kümesi
için derleyici seçenekleri sağlar. -as3 derleyici seçeneği, AS3 ad alanını temsil ederken, -es derleyici seçeneği de
prototip mirası seçeneğini (es, ECMAScript'i ifade eder) temsil eder. Programınızın tamamı için AS3 ad alanını açmak
üzere, -as3 derleyici seçeneğini true değerine ve -es derleyici seçeneğini de false değerine ayarlayın. Prototip
sürümlerini kullanmak için, derleyici seçeneklerini karşıt değerlere ayarlayın. Adobe Flex Builder 3 ve Adobe Flash
CS4 Professional için varsayılan derleyici ayarları şunlardır: -as3 = true ve -es = false.
Herhangi bir çekirdek sınıfı genişletmeyi ve herhangi bir yöntemi geçersiz kılmayı planlıyorsanız, geçersiz kılınmış bir
yöntemi nasıl bildirmeniz gerektiğini AS3 ad alanının nasıl etkileyebildiğini anlamanız gerekir. AS3 ad alanını
kullanıyorsanız, çekirdek sınıf yönteminin herhangi bir yöntem geçersiz kılması, override niteliğiyle birlikte AS3 ad
alanını da kullanmalıdır. AS3 ad alanını kullanmıyor ve bir alt sınıfta çekirdek sınıf yöntemini yeniden tanımlamak
istiyorsanız, AS3 ad alanını veya override anahtar sözcüğünü kullanmamanız gerekir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 121
ActionScript'te nesne tabanlı programlama
Örnek: GeometricShapes
GeometricShapes örnek uygulaması, ActionScript 3.0 kullanılarak aşağıda örnekleri verilen çok sayıda nesne tabanlı
kavram ve özelliklerin nasıl uygulanabildiğini gösterir:
• Sınıfları tanımlama
• Sınıfları genişletme
• Çok biçimlilik ve override anahtar sözcüğü
• Arabirimleri tanımlama, genişletme ve uygulama
Bu aynı zamanda, sınıf örnekleri oluşturan ve böylece bir arabirimin örneği olarak döndürme değerinin nasıl
bildirildiğini ve bu döndürülen nesnenin genel olarak nasıl kullanıldığını gösteren bir "fabrika yöntemini" içerir.
Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.
GeometricShapes uygulama dosyalarını Samples/GeometricShapes klasöründe bulabilirsiniz. Uygulama aşağıdaki
dosyaları içerir:
Dosya
Açıklama
GeometricShapes.mxml
Flash (FLA) veya Flex (MXML) içindeki ana
uygulama dosyası.
veya
GeometricShapes.fla
com/example/programmingas3/geometricshapes/IGeometricShape.as
Tüm GeometricShapes uygulama sınıfları
tarafından uygulanacak yöntemleri tanımlayan
temel arabirim.
com/example/programmingas3/geometricshapes/IPolygon.as
Birden çok kenarı olan GeometricShapes
uygulama sınıfları tarafından uygulanacak
yöntemleri tanımlayan bir arabirim.
com/example/programmingas3/geometricshapes/RegularPolygon.as
Şeklin merkezi etrafında simetrik olarak
konumlandırılmış eşit uzunlukta kenarlara sahip
bir geometrik şekil türü.
com/example/programmingas3/geometricshapes/Circle.as
Bir daireyi tanımlayan geometrik şekil türü.
com/example/programmingas3/geometricshapes/EquilateralTriangle.as
Eşit kenar bir üçgeni tanımlayan bir
RegularPolygon alt sınıfı.
com/example/programmingas3/geometricshapes/Square.as
Kareyi tanımlayan bir RegularPolygon alt sınıfı.
com/example/programmingas3/geometricshapes/GeometricShapeFactory.as
Belirli bir tür ve boyutta şekiller oluşturulması için
fabrika yöntemini içeren bir sınıf.
GeometricShapes sınıflarını tanımlama
GeometricShapes uygulaması, kullanıcının bir geometrik şekil türünü ve boyutunu belirtmesine olanak sağlar. Bu
daha sonra şeklin açıklamasını, alanını ve çevre uzunluğunu içeren bir yanıt verir.
Uygulama kullanıcı arabirimi, şeklin türünün seçilmesi, boyutun ayarlanması ve açıklamanın görüntülenmesine
yönelik birkaç denetim içerecek şekilde küçük ve basittir. Bu uygulamanın en ilginç bölümü, yüzeyin altında, sınıf
yapısında ve arabirimin kendisinde yer alır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 122
ActionScript'te nesne tabanlı programlama
Bu uygulama geometrik şekillerle ilgilidir ancak bunları grafiksel olarak görüntülemez. İlerleyen bir bölümün
örneğinde (bkz. “Örnek: SpriteArranger” sayfa 308) yeniden kullanılacak sınıfların ve arabirimlerin küçük bir
kütüphanesini sağlar. SpriteArranger örneği, şekilleri grafiksel olarak görüntüler ve burada GeometricShapes
uygulamasında sağlanan sınıf çerçevesini esas alarak kullanıcının bu şekilleri işlemesine olanak sağlar.
Bu örnekte geometrik şekilleri tanımlayan sınıflar ve arabirimler, aşağıdaki diyagramda Unified Modeling Language
(UML) notasyonu kullanılarak gösterilmektedir:
<< interface >>
IGeometricShape
+getArea (): Number
+describe (): Strin
Circle
+diameter:Number
+Circle () : Circle
+getArea () : Number
+describe () : String
+getCircumference () : Number
<< interface >>
IPolygon
+getPerimeter (): Number
+getSumOfAngles (): Number
RegularPolygon
+numSides : int
+sideLength : Number
+RegularPolygon (): RegularPolygon
+getSumOfAngles (): Number
+getPerimeter (): Number
+getArea (): Number
+describe (): String
EquilateralTriangle
+EquilateralTriangle (): EquilateralTriangle
+getArea (): Number
+describe (): String
Square
+Square (): Square
+getArea (): Number
+describe (): String
GeometricShapes Örnek Sınıflar
Arabirimlerle ortak davranışı tanımlama
Bu GeometricShapes uygulaması, üç tür şekli ele alır: daireler, kareler ve eşkenar üçgenler. GeometricShapes sınıf
yapısı, üç şekil türü için de ortak olan yöntemleri listeleyen IGeometricShape adındaki çok basit bir arabirimle başlar:
package com.example.programmingas3.geometricshapes
{
public interface IGeometricShape
{
function getArea():Number;
function describe():String;
}
}
Bu arabirim iki yöntemi tanımlar: şeklin alanını hesaplayıp döndüren getArea() yöntemi ve şeklin özelliklerinin
metin açıklamasını bir araya getiren describe() yöntemi.
Ayrıca her şeklin çevre uzunluğunu da bilmek isteriz. Ancak dairenin çevresi benzersiz bir şekilde hesaplanır ve bu
nedenle de davranış bir üçgenin veya kareninkinden farklıdır. Yine de üçgenler, kareler ve diğer çokgenler arasında
yeterince benzerlik olduğundan, yalnızca bunlara yönelik yeni bir arabirim sınıfının tanımlanması mantıklıdır:
IPolygon. Ayrıca burada gösterildiği gibi IPolygon arabirimi daha basittir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 123
ActionScript'te nesne tabanlı programlama
package com.example.programmingas3.geometricshapes
{
public interface IPolygon extends IGeometricShape
{
function getPerimeter():Number;
function getSumOfAngles():Number;
}
}
Bu arabirim, tüm çokgenler için ortak olan iki yöntemi tanımlar: tüm kenarların birleşik uzunluğunu hesaplayan
getPerimeter() yöntemi ve tüm iç açıları toplayan getSumOfAngles() yöntemi.
IPolygon arabirimi, IGeometricShape arabirimini genişletir, başka bir deyişle, IPolygon arabirimini uygulayan tüm
sınıfların, IGeometricShape arabiriminden iki tane ve IPolygon arabiriminden iki tane olmak üzere dört yöntemin
hepsini bildirmesi gerekir.
Şekil sınıflarını tanımlama
Tüm şekil türleri için ortak olan yöntemler hakkında iyice fikir edindikten sonra, şekil sınıflarını tanımlayabilirsiniz.
Uygulamanız gereken yöntem sayısı açısından en basit şekil, burada gösterildiği gibi Circle sınıfıdır:
package com.example.programmingas3.geometricshapes
{
public class Circle implements IGeometricShape
{
public var diameter:Number;
public function Circle(diam:Number = 100):void
{
this.diameter = diam;
}
public function getArea():Number
{
// The formula is Pi * radius * radius.
var radius:Number = diameter / 2;
return Math.PI * radius * radius;
}
public function getCircumference():Number
{
// The formula is Pi * diameter.
return Math.PI * diameter;
}
public function describe():String
{
var desc:String = "This shape is a Circle.\n";
desc += "Its diameter is " + diameter + " pixels.\n";
desc += "Its area is " + getArea() + ".\n";
desc += "Its circumference is " + getCircumference() + ".\n";
return desc;
}
}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 124
ActionScript'te nesne tabanlı programlama
Circle sınıfı, IGeometricShape arabirimini uygular, bu nedenle hem getArea() yöntemi hem de describe() yöntemi
için kod sağlamalıdır. Ayrıca, Circle sınıfı için benzersiz olan getCircumference() yöntemini tanımlar. Circle sınıfı
da diğer çokgen sınıflarında bulunmayan bir özellik olarak diameter özelliğini bildirir.
Diğer iki şekil türü olan kareler ve eşkenar üçgenler, ortak başka şeylere sahiptir: bunların her biri eşit uzunlukta
kenarlara sahiptir ve her ikisi için de çevre uzunluğunu ve iç açıları toplamını hesaplamakta kullanabileceğiniz ortak
formüller vardır. Aslında bu ortak formüller, gelecekte de tanımlamanız gerekecek diğer normal çokgenler için de
geçerli olacaktır.
RegularPolygon sınıfı hem Square sınıfı hem de EquilateralTriangle sınıfı için üst sınıf olacaktır. Üst sınıf, ortak
yöntemleri tek bir yerde tanımlamanıza olanak sağlar, böylece alt sınıfların her birinde bunları ayrı ayrı tanımlamanız
gerekmez. RegularPolygon sınıfının kodu şöyledir:
package com.example.programmingas3.geometricshapes
{
public class RegularPolygon implements IPolygon
{
public var numSides:int;
public var sideLength:Number;
public function RegularPolygon(len:Number = 100, sides:int = 3):void
{
this.sideLength = len;
this.numSides = sides;
}
public function getArea():Number
{
// This method should be overridden in subclasses.
return 0;
}
public function getPerimeter():Number
{
return sideLength * numSides;
}
public function getSumOfAngles():Number
{
if (numSides >= 3)
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 125
ActionScript'te nesne tabanlı programlama
{
return ((numSides - 2) * 180);
}
else
{
return 0;
}
}
public function describe():String
{
var desc:String = "Each side is " + sideLength + " pixels long.\n";
desc += "Its area is " + getArea() + " pixels square.\n";
desc += "Its perimeter is " + getPerimeter() + " pixels long.\n";
desc += "The sum of all interior angles in this shape is " + getSumOfAngles() + "
degrees.\n";
return desc;
}
}
}
İlk olarak, RegularPolygon sınıfı, tüm normal çokgenler için ortak olan iki özelliği bildirir: kenarların her birinin
uzunluğu (sideLength özelliği) ve kenar sayısı (numSides özelliği).
RegularPolygon sınıfı IPolygon arabirimini uygular ve IPolygon arabirim yöntemleri için dört yöntemi de bildirir.
Ortak formülleri kullanarak bunlardan ikisini (getPerimeter() ve getSumOfAngles() yöntemleri) uygular.
getArea() yönteminin formülü şekilden şekle farklı olacağından, yöntemin temel sınıf sürümü, alt sınıf yöntemleri
tarafından miras alınabilen ortak mantığı içeremez. Bunun yerine, alanın hesaplanmadığını belirtmek için 0 varsayılan
değerini döndürür. Her şeklin alanını doğru şekilde hesaplamak için, RegularPolygon sınıfının alt sınıfları, getArea()
yöntemini geçersiz kılmalıdır.
Aşağıdaki EquilateralTriangle sınıfının kodu, getArea() yönteminin nasıl geçersiz kılındığını gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 126
ActionScript'te nesne tabanlı programlama
package com.example.programmingas3.geometricshapes
{
public class EquilateralTriangle extends RegularPolygon
{
public function EquilateralTriangle(len:Number = 100):void
{
super(len, 3);
}
public override function getArea():Number
{
// The formula is ((sideLength squared) * (square root of 3)) / 4.
return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4;
}
public override function describe():String
{
/* starts with the name of the shape, then delegates the rest
of the description work to the RegularPolygon superclass */
var desc:String = "This shape is an equilateral Triangle.\n";
desc += super.describe();
return desc;
}
}
}
override anahtar sözcüğü, EquilateralTriangle.getArea() yönteminin RegularPolygon üst sınıfından
getArea() yöntemini kasıtlı olarak geçersiz kıldığını belirtir. EquilateralTriangle.getArea() yöntemi
çağrıldığında, önceki kodda bulunan formülü kullanarak alanı hesaplar ve RegularPolygon.getArea()
yöntemindeki kod asla çalıştırılmaz.
Buna karşılık, EquilateralTriangle sınıfı, kendi getPerimeter() yöntemi sürümünü tanımlamaz.
EquilateralTriangle.getPerimeter() yöntemi çağrıldığında, çağrı miras zincirinde yukarı gider ve
RegularPolygon üst sınıfının getPerimeter() yönteminde kodu çalıştırır.
EquilateralTriangle() yapıcısı, üst sınıfının RegularPolygon() yapıcısını açıkça çağırmak için super()
deyimini kullanır. Her iki yapıcı da aynı parametre kümesine sahip olsaydı, EquilateralTriangle() yapıcısı
tamamen çıkarılabilir ve bunun yerine RegularPolygon() yapıcısı çalıştırılabilirdi. Ancak, RegularPolygon()
yapıcısı numSides adında fazladan bir parametre gerektirir. Bu nedenle EquilateralTriangle() yapıcısı, üçgenin 3
kenarının olduğunu belirtmek için len girdi parametresi ve 3 değeriyle birlikte iletilen super(len, 3) öğesini çağırır.
describe() yöntemi de super() deyimini kullanır ancak bunu farklı bir şekilde, RegularPolygon üst sınıfının
describe() yöntemi sürümünü çağırmak için kullanır. EquilateralTriangle.describe() yöntemi ilk olarak
desc dize değişkenini şeklin türüyle ilgili bir deyime ayarlar. Daha sonra super.describe() öğesini çağırarak
RegularPolygon.describe() yönteminin sonuçlarını alır ve bu sonuçları desc dizesine ekler.
Square sınıfı burada ayrıntılı şekilde ele alınmayacaktır ancak bu sınıf, EquilateralTriangle sınıfına çok benzeyip bir
yapıcı ve getArea() ve describe() yöntemlerinin kendi uygulamalarını sağlar.
Çok biçimlilik ve fabrika yöntemi
Arabirim ve mirastan yararlanan bir sınıf kümesi birçok ilginç şekilde kullanılabilir. Örneğin, şu ana kadar açıklanan
şekil sınıflarının tümü IGeometricShape arabirimini uygular veya bir üst sınıfı genişletir. Bu nedenle de, bir değişkeni
IGeometricShape örneği olacak şekilde tanımlarsanız, o değişkene yönelik describe() yöntemini çağırmak için söz
konusu değişkenin gerçekte Circle sınıfının mı yoksa Square sınıfının mı bir örneği olduğunu bilmenize gerek yoktur.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 127
ActionScript'te nesne tabanlı programlama
Aşağıdaki kod, bunun nasıl olduğunu gösterir:
var myShape:IGeometricShape = new Circle(100);
trace(myShape.describe());
Değişken IGeometricShape arabiriminin bir örneği olarak tanımlansa da temel alınan sınıf Circle olduğundan,
myShape.describe() öğesi çağrıldığında Circle.describe() yöntemini çalıştırır.
Bu örnek, çok biçimlilik ilkesinin uygulanmasını gösterir: tamamen aynı yöntem çağrısı, yöntemi çağrılan nesne
sınıfına bağlı olarak, farklı bir kodun çalıştırılmasına neden olur.
GeometricShapes uygulaması, fabrika yöntemi olarak bilinen basitleştirilmiş bir tasarım modeli sürümü kullanarak bu
türde bir arabirim tabanlı çok biçimliliği uygular. Fabrika yöntemi terimi, temel alınan veri türü veya içerikleri
bağlama göre değişebilen bir nesneyi döndüren işlevi ifade eder.
Burada gösterilen GeometricShapeFactory sınıfı, createShape() adındaki bir fabrika yöntemini tanımlar:
package com.example.programmingas3.geometricshapes
{
public class GeometricShapeFactory
{
public static var currentShape:IGeometricShape;
public static function createShape(shapeName:String,
len:Number):IGeometricShape
{
switch (shapeName)
{
case "Triangle":
return new EquilateralTriangle(len);
case "Square":
return new Square(len);
case "Circle":
return new Circle(len);
}
return null;
}
public static function describeShape(shapeType:String, shapeSize:Number):String
{
GeometricShapeFactory.currentShape =
GeometricShapeFactory.createShape(shapeType, shapeSize);
return GeometricShapeFactory.currentShape.describe();
}
}
}
createShape() fabrika yöntemi, yeni nesnelerin uygulama tarafından daha genel şekilde işlenebilmesi için yeni
nesneleri IGeometricShape örnekleri olarak döndürürken, şekil alt sınıf yapıcılarının, oluşturdukları örneklerin
ayrıntılarını tanımlamasına da olanak sağlar.
Önceki örnekte bulunan describeShape() yöntemi, bir uygulamanın daha belirli bir nesnenin genel başvurusunu
almak için nasıl fabrika yöntemini kullanabildiğini gösterir. Uygulama, şu şekilde, yeni oluşturulmuş bir Circle
nesnesinin açıklamasını alabilir:
GeometricShapeFactory.describeShape("Circle", 100);
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 128
ActionScript'te nesne tabanlı programlama
describeShape() yöntemi, aynı parametrelerle createShape() fabrika yöntemini çağırarak yeni Circle nesnesini
IGeometricShape nesnesi olarak yazılmış currentShape adındaki bir statik değişkende saklar. Daha sonra,
currentShape nesnesinde describe() yöntemi çağrılır ve Circle.describe() yöntemini çalıştırıp dairenin
ayrıntılı bir açıklamasını döndürmek için bu çağrı otomatik olarak çözümlenir.
Örnek uygulamayı geliştirme
Arabirimlerin ve mirasın gerçek gücü, uygulamanızı geliştirdiğinizde veya değiştirdiğinizde belirgin olur.
Bu örnek uygulamaya yeni bir şekil olarak beşgen eklemek istediğinizi varsayın. Bu durumda, RegularPolygon sınıfını
genişleten ve getArea() ve describe() yöntemlerinin kendi sürümlerini tanımlayan yeni bir Pentagon sınıfı
oluşturursunuz. Daha sonra, uygulamanın kullanıcı arabiriminde açılır kutuya yeni bir Pentagon seçeneği eklersiniz.
Ve işte hepsi budur. Pentagon sınıfı miras yoluyla RegularPolygon sınıfından getPerimeter() yönteminin ve
getSumOfAngles() yönteminin işlevselliğini otomatik olarak alır. Pentagon örneği, IGeometricShape arabirimini
uygulayan bir sınıftan miras aldığından, IGeometricShape örneği olarak da değerlendirilebilir. Başka bir deyişle, yeni
bir şekil türü eklemek için, GeometricShapeFactory sınıfındaki yöntemlerden herhangi birinin yöntem imzasını
değiştirmeniz gerekmez. (Dolayısıyla, GeometricShapeFactory sınıfını kullanan kodlardan herhangi birini de
değiştirmeniz gerekmez.)
Arabirimlerin ve mirasın bir uygulamaya yeni özellikler eklemeye yönelik iş yükünü nasıl azalttığını görmek için,
uygulama amacıyla Geometric Shapes örneğine bir Pentagon sınıfı eklemek isteyebilirsiniz.
129
Bölüm 6: Tarih ve saatlerle çalışma
Zamanlama her şey olmayabilir ancak yazılım uygulamalarında önemli bir faktördür. ActionScript 3.0, takvim
günlerinin, saatlerinin ve zaman aralıklarının yönetilmesi için güçlü yollar sağlar. Bu zamanlama işlevinin çoğunu iki
ana sınıf sağlar: Date sınıfı ve flash.utils paketindeki yeni Timer sınıfı.
Tarih ve saat temelleri
Tarih ve saatlerle çalışmaya giriş
Tarih ve saatler, ActionScript programlarında kullanılan yaygın bir bilgi türüdür. Örneğin, diğer olasılıklar arasında
haftanın geçerli gününü bilmeniz veya bir kullanıcının belirli bir ekranda ne kadar zaman harcadığını ölçmeniz
gerekebilir. ActionScript'te, tarih ve saat bilgileri dahil olmak üzere, zaman içindeki tek bir anı temsil etmek için Date
sınıfını kullanabilirsiniz. Date örneği içinde, her bir tarih ve saat birimi için değerler vardır. Bu değerler arasında, yıl,
ay, gün, haftanın günü, saat, dakika, saniye, milisaniye ve saat dilimi yer alır. Daha ileri düzey kullanıcılar için
ActionScript, belirli bir gecikmeden sonra veya art arda aralıklarla eylemleri gerçekleştirmek için kullanabildiğiniz
Timer sınıfını da içerir.
Ortak tarih ve saat görevleri
Bu bölümde, tarih ve saat bilgileriyle çalışmaya yönelik şu ortak görevler açıklanmaktadır:
• Date nesneleriyle çalışma
• Geçerli tarih ve saati alma
• Ayrı ayrı tarih ve saat birimlerine (gün, yıl, saat, dakika, vb.) erişme
• Tarih ve saatlerle aritmetik uygulama
• Saat dilimleri arasında dönüştürme yapma
• Yinelenen eylemler gerçekleştirme
• Ayarlanmış bir zaman aralığından sonra eylemler gerçekleştirme
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:
• UTC saati: Eşitlenmiş Evrensel Saat—“sıfır saat” başvurusu saat dilimi. Diğer tüm saat dilimleri, UTC zamanına
göre (ilerisinde veya gerisinde) saat sayısı olarak tanımlanır.
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Bu bölümdeki kod listeleri öncelikle
Date nesneleriyle ilgili olduğundan, örneklerin test edilmesi işlemi, değerleri Sahne Alanı'ndaki bir metin alanı
örneğine yazarak veya Çıktı paneline değerleri yazdırmak için trace() işlevlerini kullanarak, örneklerde kullanılan
değişkenlerin değerlerinin görüntülenmesini içerir. Bu teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34
bölümünde ayrıntılı şekilde açıklanmıştır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 130
Tarih ve saatlerle çalışma
Takvim tarih ve saatlerini yönetme
ActionScript 3.0'daki tüm takvim tarihi ve saati yönetimi işlevleri, üst düzey Date sınıfında yoğunlaşmıştır. Date sınıfı,
Eşitlenmiş Evrensel Saat'te (UTC) veya bir saat dilimine özel yerel saatte tarih ve saatleri işlemenize olanak sağlayan
yöntemleri ve özellikleri içerir. UTC, temelde Greenwich Saati (GMT) ile aynı olan standart bir saat tanımıdır.
Date nesneleri oluşturma
Date sınıfı, tüm çekirdek sınıfların en çok yönlü yapıcı yöntemlerinden birini sağlar. Dört farklı şekilde bunu
çağırabilirsiniz.
İlk olarak, herhangi bir parametre verilmediyse, Date() yapıcısı, saat diliminizi esas alarak yerel saatte geçerli tarih ve
saati içeren bir Date nesnesini döndürür. Aşağıda buna bir örnek verilmiştir:
var now:Date = new Date();
İkinci olarak, tek bir sayısal parametre verildiyse, Date() yapıcısı bunu 1 Ocak 1970'ten bu yana geçen milisaniye sayısı
olarak değerlendirir ve karşılık gelen bir Date nesnesini döndürür. İlettiğiniz milisaniye değerinin, UTC'de 1 Ocak
1970'ten bu yana geçen milisaniye sayısı olarak değerlendirildiğini unutmayın. Ancak değerleri almak ve
görüntülemek için UTC'ye özel yöntemleri kullanmadığınız sürece Date nesnesi, yerel saat diliminizdeki değerleri
gösterir. Tek bir milisaniye parametresi kullanarak yeni bir Date nesnesi oluşturursanız, yerel saatiniz ile UTC
arasındaki saat dilimi farkını dikkate aldığınızdan emin olun. Aşağıdaki deyimler, UTC'de 1 Ocak 1970 gününün gece
yarısına ayarlanmış bir Date nesnesi oluşturur:
var millisecondsPerDay:int = 1000 * 60 * 60 * 24;
// gets a Date one day after the start date of 1/1/1970
var startTime:Date = new Date(millisecondsPerDay);
Üçüncü olarak, Date() yapıcısına birden çok sayısal parametre iletebilirsiniz. Yapıcı bu parametreleri sırayla yıl, ay,
gün, saat, dakika, saniye ve milisaniye olarak değerlendirir ve karşılık gelen Date nesnesini döndürür. Bu girdi
parametrelerinin UTC'de değil yerel saatte olduğu varsayılır. Aşağıdaki deyimler, yerel saatte 1 Ocak 2000
başlangıcında gece yarısına ayarlanmış bir Date nesnesi alır:
var millenium:Date = new Date(2000, 0, 1, 0, 0, 0, 0);
Dördüncü olarak, Date() yapıcısına tek bir dize parametresi iletebilirsiniz. Yapıcı bu dizeyi tarih veya saat
bileşenlerine ayrıştırmayı dener ve sonra karşılık gelen bir Date nesnesini döndürür. Bu yaklaşımı kullanırsanız,
ayrıştırma hatalarını yakalamak için Date() yapıcısının bir try..catch bloğunun içine alınması iyi bir fikirdir.
Date() yapıcısı, ActionScript 3.0 Dil ve Bileşenler Başvurusu'nda listelendiği gibi, çok sayıda değişik dize formatını
kabul eder. Aşağıdaki deyim, bir dize değeri kullanarak yeni bir Date nesnesini başlatır:
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");
Date() yapıcısı dize parametresini başarıyla ayrıştıramazsa, istisna atmaz. Ancak sonuçta elde edilen Date nesnesi
geçersiz bir tarih değeri içerir.
Zaman birimi değerlerini alma
Date sınıfının özelliklerini veya yöntemlerini kullanarak bir Date nesnesi içindeki çeşitli zaman birimlerinin
değerlerini ayıklayabilirsiniz. Aşağıdaki özelliklerin her biri, size Date nesnesindeki bir zaman biriminin değerini verir:
•
fullYear özelliği
• Ocak için 0 ile başlayıp Aralık için 11 olacak şekilde sayısal formatta olan month özelliği
• 1 ile 31 aralığında, ayın gününü ifade eden takvim numarası olan date özelliği
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 131
Tarih ve saatlerle çalışma
• Pazar için 0 olmak üzere sayısal formatta haftanın günü olan day özelliği
• 0 ile 23 aralığı içinde hours özelliği
•
minutes özelliği
•
seconds özelliği
•
milliseconds özelliği
Aslına bakılırsa, Date sınıfı bu değerlerin her birinin alınması için size birçok yol sağlar. Örneğin, Date nesnesinin
ay değerini dört farklı şekilde alabilirsiniz:
•
month özelliği
•
getMonth() yöntemi
•
monthUTC özelliği
•
getMonthUTC() yöntemi
Bu dört yol da verimlilik açısından eşdeğerdir, böylece uygulamanıza en iyi şekilde uyan yaklaşımı kullanabilirsiniz.
Listelenen özelliklerin tümü, toplam tarih değerinin bileşenlerini temsil eder. Örneğin, milisaniye değeri 1000'e
ulaştığında saniye değeri 1 artıp milliseconds özelliği 0 değerine getirildiğinden, milisaniye değeri asla 999'dan
büyük olmaz.
Date nesnesinin değerini, 1 Ocak 1970 (UTC) tarihinden bu yana geçen milisaniye sayısı olarak almak isterseniz,
getTime() yöntemini kullanabilirsiniz. Bunun karşılığı olan setTime() yöntemi, 1 Ocak 1970'ten (UTC) bu yana
geçen milisaniye sayısını kullanarak varolan bir Date nesnesinin değerini değiştirmenize olanak sağlar.
Tarih ve saat aritmetiği yapma
Date sınıfıyla tarih ve saatlerde toplama ve çıkarma işlemleri yapabilirsiniz. Tarih değerleri dahili olarak milisaniye
cinsinde saklanır, böylece diğer değerleri Date nesnelerine eklemeden veya Date nesnelerinden çıkarmadan önce
milisaniyeye dönüştürmeniz gerekir.
Uygulamanız çok sayıda tarih ve saat aritmetiği uygulayacaksa, aşağıdaki gibi, ortak zaman birimi değerlerini
milisaniye cinsinde tutan sabitler oluşturulması yararlı olabilir:
public static const millisecondsPerMinute:int = 1000 * 60;
public static const millisecondsPerHour:int = 1000 * 60 * 60;
public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;
Artık standart zaman birimlerini kullanarak tarih aritmetiği yapmak çok kolay. Aşağıdaki kod, getTime() ve
setTime() yöntemlerini kullanarak geçerli saatten bir saate bir tarih değeri ayarlar:
var oneHourFromNow:Date = new Date();
oneHourFromNow.setTime(oneHourFromNow.getTime() + millisecondsPerHour);
Tarih değeri ayarlamanın başka bir yolu, tek bir milisaniye parametresi kullanarak yeni bir Date nesnesi
oluşturulmasıdır. Örneğin, aşağıdaki kod, başka bir tarihi hesaplamak için bir tarihe 30 gün ekler:
// sets the invoice date to today's date
var invoiceDate:Date = new Date();
// adds 30 days to get the due date
var dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));
Ardından, 30 günlük zamanı temsil etmesi için millisecondsPerDay sabiti 30 ile çarpılır ve sonuç invoiceDate
değerine eklenip dueDate değerini ayarlamak için kullanılır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 132
Tarih ve saatlerle çalışma
Saat dilimleri arasında dönüştürme yapma
Tarih ve saat aritmetiği, tarihleri bir saat diliminden diğerine dönüştürmek istediğinizde kullanışlıdır. Date nesnesinin
saat diliminin UTC'den farklı olduğu dakika cinsinden değeri döndüren getTimezoneOffset() yöntemi de aynı
işleve sahiptir. Tüm saat dilimleri çift saatlik artışa ayarlanmadığından (bazıları yakın saat dilimlerinden yarım saat
farklıdır), dakika cinsinden bir değer döndürür.
Aşağıdaki örnek, bir tarihi yerel saatten UTC'ye dönüştürmek için saat dilimi farkını kullanır. İlk olarak saat dilimi
değerini milisaniye cinsinden hesaplayıp sonra Date değerini o miktara göre ayarlayarak dönüştürmeyi gerçekleştirir:
// creates a Date in local time
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");
// converts the Date to UTC by adding or subtracting the time zone offset
var offsetMilliseconds:Number = nextDay.getTimezoneOffset() * 60 * 1000;
nextDay.setTime(nextDay.getTime() + offsetMilliseconds);
Zaman aralıklarını denetleme
Adobe Flash CS4 Professional'ı kullanarak uygulamalar geliştirdiğinizde, uygulamanızda sabit, kare kare ilerleme
sağlayan zaman çizelgesine erişiminiz olur. Yalnızca ActionScript projelerindeyse, diğer zamanlama mekanizmalarını
kullanmanız gerekir.
Döngüler ve zamanlayıcılar
Bazı programlama dillerinde, for veya do..while gibi döngü deyimlerini kullanarak kendi zamanlama şemalarınızı
tasarlamanız gerekir.
Döngü deyimleri genellikle yerel makinenin izin verdiği ölçüde hızlı şekilde çalıştırılır, başka bir deyişle, uygulama bazı
makinelerde hızlı çalışırken, başka makinelerde yavaş çalışabilir. Uygulamanız için tutarlı bir zamanlama aralığı
gerekirse, uygulamanızı gerçek bir takvim veya saat zamanına bağlamanız gerekir. Oyun, animasyon ve gerçek zamanlı
denetleyiciler gibi birçok uygulama için makineden makineye tutarlı olan normal, zaman odaklı şekilde ilerleyen
mekanizmalar gerekir.
ActionScript 3.0 Timer sınıfı güçlü bir çözüm sunar. Timer sınıfı, belirtilen zaman aralığına her ulaşıldığında
ActionScript 3.0 olay modelini kullanarak zamanlayıcı olaylarını gönderir.
Timer sınıfı
ActionScript 3.0'da zamanlama işlevlerini işlemenin tercih edilen yolu, bir aralığa her ulaşıldığında olayları göndermek
için kullanılabilen Timer sınıfının (flash.utils.Timer) kullanılmasıdır.
Bir zamanlayıcıyı başlatmak için, ilk olarak bir Timer sınıfı örneğini oluşturarak bu sınıfa ne sıklıkla bir zamanlayıcı
olayı oluşturacağını ve durmadan önce kaç defa bunu yapacağını bildirirdiniz.
Örneğin, aşağıdaki kod, her saniye bir olay gönderen ve 60 saniye boyunca bu işleme devam eden bir Timer örneğini
oluşturur:
var oneMinuteTimer:Timer = new Timer(1000, 60);
Timer nesnesi, belirli bir aralığa her ulaşıldığında bir TimerEvent nesnesi gönderir. TimerEvent nesnesinin olay türü
timer (TimerEvent.TIMER sabitiyle tanımlı) olur. TimerEvent nesnesi, standart bir Event nesnesiyle aynı özellikleri
içerir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 133
Tarih ve saatlerle çalışma
Timer örneği sabit sayıda bir aralığa ayarlanırsa, son aralığa ulaştığında bir timerComplete olayı da
(TimerEvent.TIMER_COMPLETE sabitiyle tanımlı) gönderir.
Aşağıda, Timer sınıfını eylem halinde gösteren küçük bir örnek uygulama yer almaktadır:
package
{
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class ShortTimer extends Sprite
{
public function ShortTimer()
{
// creates a new five-second Timer
var minuteTimer:Timer = new Timer(1000, 5);
// designates listeners for the interval and completion events
minuteTimer.addEventListener(TimerEvent.TIMER, onTick);
minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
// starts the timer ticking
minuteTimer.start();
}
public function onTick(event:TimerEvent):void
{
// displays the tick count so far
// The target of this event is the Timer instance itself.
trace("tick " + event.target.currentCount);
}
public function onTimerComplete(event:TimerEvent):void
{
trace("Time's Up!");
}
}
}
ShortTimer sınıfı oluşturulduğunda, bu sınıf beş saniye boyunca saniyede bir defa ilerleyecek bir Timer örneği
oluşturur. Daha sonra zamanlayıcıya iki dinleyici ekler: biri ilerlemelerin her birini dinler, diğeri de timerComplete
olayını dinler.
Ardından zamanlayıcı ilerlemesini başlatır ve bu noktadan itibaren bir saniyelik aralıklarla onTick() yöntemi
çalıştırılır.
onTick() yöntemi geçerli ilerleme sayısını gösterir. Beş saniye geçtikten sonra, onTimerComplete() yöntemi
çalıştırılarak zamanın dolduğunu bildirir.
Bu örneği çalıştırdığınızda, konsolunuzda veya izleme pencerenizde, saniyede birer satır hızında şu satırların
görüntülenmesi gerekir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 134
Tarih ve saatlerle çalışma
tick 1
tick 2
tick 3
tick 4
tick 5
Time's Up!
flash.utils paketinde zamanlama işlevleri
ActionScript 3.0, ActionScript 2.0'dakine benzer çok sayıda zamanlama işlevi içerir. Bu işlevler, flash.utils paketinde
paket düzeyinde işlevler olarak sağlanır ve ActionScript 2.0'daki gibi çalışır.
İşlev
Açıklama
clearInterval(id:uint):void
Belirtilen bir setInterval() çağrısını iptal eder.
clearTimeout(id:uint):void
Belirtilen bir setTimeout() çağrısını iptal eder.
getTimer():int
Adobe® Flash® Player veya Adobe® AIR™ başlatıldıktan sonra geçen milisaniye
sayısını döndürür.
setInterval(closure:Function,
delay:Number, ... arguments):uint
Bir işlevi belirtilen bir aralıkta (milisaniye olarak) çalıştırır.
setTimeout(closure:Function,
delay:Number, ... arguments):uint
Belirtilen bir işlevi belirtilen bir gecikmeden sonra (milisaniye olarak) çalıştırır.
Bu işlevler, geriye doğru uyumluluk için ActionScript 3.0'da kalmıştır. Adobe, bunları yeni ActionScript 3.0
uygulamalarında kullanmanızı önermez. Genellikle uygulamalarınızda Timer sınıfının kullanılması hem daha kolay
hem de daha verimlidir.
Örnek: Basit analog saat
Basit bir analog saat örneği, bu bölümde ele alınan tarih ve saat kavramlarından ikisini gösterir:
• Geçerli tarih ve saati alma ve saat, dakika ve saniye değerlerini ayıklama
• Uygulamanın hızını ayarlamak için bir Timer öğesini kullanma
Bu örneğin uygulama dosyalarını edinmek için bkz.
www.adobe.com/go/learn_programmingAS3samples_flash_tr. SimpleClock uygulama dosyalarını
Samples/SimpleClock klasörü içinde bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:
Dosya
Açıklama
SimpleClockApp.mxml
Flash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası.
veya
SimpleClockApp.fla
com/example/programmingas3/simpleclock/SimpleClock.as
Ana uygulama dosyası.
com/example/programmingas3/simpleclock/AnalogClockFace.as
Yuvarlak bir saat yüzü çizer ve saati esas alarak akrep,
yelkovan ve saniye göstergesini çizer.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 135
Tarih ve saatlerle çalışma
SimpleClock sınıfını tanımlama
Saat örneği basit olsa da, ileride kolayca genişletebilmeniz için basit uygulamaların da organize edilmesi iyi bir fikirdir.
Bu nedenle SimpleClock uygulaması, açılış ve zaman saptama görevlerini işlemek için SimpleClock sınıfını kullanır ve
sonra da gerçekten zamanı göstermek için de AnalogClockFace adında başka bir sınıfı kullanır.
Aşağıda, SimpleClock sınıfını tanımlayıp başlatan kod yer almaktadır (Flash sürümünde, bunun yerine SimpleClock
öğesinin Sprite sınıfını genişlettiğini unutmayın):
public class SimpleClock extends UIComponent
{
/**
* The time display component.
*/
private var face:AnalogClockFace;
/**
* The Timer that acts like a heartbeat for the application.
*/
private var ticker:Timer;
Bu sınıf iki önemli özelliğe sahiptir:
• AnalogClockFace sınıfının bir örneği olan face özelliği
• Timer sınıfının bir örneği olan ticker özelliği
SimpleClock sınıfı varsayılan bir yapıcıyı kullanır. initClock() yöntemi gerçek kurulum çalışmasıyla ilgilenerek
saat yüzünden başlar ve Timer örneği ilerlemesini başlatır.
Saat yüzünü oluşturma
SimpleClock kodundaki sonraki satırlar, saati görüntülemek için kullanılan saat yüzünü oluşturur:
/**
* Sets up a SimpleClock instance.
*/
public function initClock(faceSize:Number = 200)
{
// creates the clock face and adds it to the display list
face = new AnalogClockFace(Math.max(20, faceSize));
face.init();
addChild(face);
// draws the initial clock display
face.draw();
Yüzün boyutu, initClock() yöntemine iletilebilir. Herhangi bir faceSize değeri iletilmezse, varsayılan 200 piksel
boyut kullanılır.
Daha sonra uygulama, yüzü başlatır ve DisplayObject sınıfından miras alınan addChild() yöntemini kullanarak bu
yüzü görüntüleme listesine ekler. Ve saat yüzünü bir defa görüntülemek için AnalogClockFace.draw() yöntemini
çağırarak geçerli saati gösterir.
Zamanlayıcıyı başlatma
Saat yüzü oluşturulduktan sonra, initClock() yöntemi bir zamanlayıcı ayarlar:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 136
Tarih ve saatlerle çalışma
// creates a Timer that fires an event once per second
ticker = new Timer(1000);
// designates the onTick() method to handle Timer events
ticker.addEventListener(TimerEvent.TIMER, onTick);
// starts the clock ticking
ticker.start();
İlk olarak bu yöntem, saniyede bir defa (her 1000 milisaniyede) olay gönderecek bir Timer örneği başlatır. Timer()
yapıcısına herhangi bir repeatCount parametresi iletilmediğinden, Timer sınırsız sayıda yinelemeyi sürdürür.
timer olayı alındığında, SimpleClock.onTick() yöntemi saniyede bir defa çalıştırılır:
public function onTick(event:TimerEvent):void
{
// updates the clock display
face.draw();
}
AnalogClockFace.draw() yöntemi yalnızca saat yüzünü ve akrep, yelkovan ve saniye göstergesini çizer.
Geçerli saati görüntüleme
AnalogClockFace sınıfındaki kodun büyük bir kısmı, saat yüzünün görüntüleme öğelerinin ayarlanmasını kapsar.
AnalogClockFace başlatıldığında, dairesel bir anahat çizer, her saat işaretine sayısal bir metin etiketi yerleştirir ve sonra
saatteki akrep, yelkovan ve saniye göstergesinin her biri için birer tane olmak üzere üç Shapenesnesi oluşturur.
SimpleClock uygulaması çalışmaya başladıktan sonra, aşağıdaki gibi her saniye AnalogClockFace.draw() yöntemini
çağırır:
/**
* Called by the parent container when the display is being drawn.
*/
public override function draw():void
{
// stores the current date and time in an instance variable
currentTime = new Date();
showTime(currentTime);
}
Bu yöntem geçerli saati bir değişkene kaydeder, böylece akrep, yelkovan ve saniye göstergesi çizilirken işlemin
ortasında saat değişemez. Ardından aşağıda gösterildiği gibi, akrep, yelkovan ve saniye göstergesini görüntülemek için
showTime() yöntemini çağırır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 137
Tarih ve saatlerle çalışma
/**
* Displays the given Date/Time in that good old analog clock style.
*/
public function showTime(time:Date):void
{
// gets the time values
var seconds:uint = time.getSeconds();
var minutes:uint = time.getMinutes();
var hours:uint = time.getHours();
// multiplies by 6 to get degrees
this.secondHand.rotation = 180 + (seconds * 6);
this.minuteHand.rotation = 180 + (minutes * 6);
// Multiply by 30 to get basic degrees, then
// add up to 29.5 degrees (59 * 0.5)
// to account for the minutes.
this.hourHand.rotation = 180 + (hours * 30) + (minutes * 0.5);
}
İlk olarak bu yöntem, geçerli zamanın saat, dakika ve saniye değerlerini ayıklar. Daha sonra akrep, yelkovan ve saniye
göstergesinin her birinin açısını hesaplamak için bu değerleri kullanır. Saniye göstergesi tam bir dönüşü 60 saniyede
gerçekleştirdiğinden, bu gösterge her saniyede 6 derece (360/60) dönüş yapar. Yelkovan da her dakika aynı derece
dönüş yapar.
Akrep de her dakika güncellenir, böylece dakikalar ilerledikçe o da aynı ilerlemeyi gösterebilir. Her saatte 30 derece
(360/12) dönüş yapmanın yanı sıra her dakika da yarım derece döner (60 dakika/30 derece).
138
Bölüm 7: Dizelerle çalışma
String sınıfı, metin dizeleriyle çalışmanıza olanak sağlayan yöntemleri içerir. Dizeler birçok nesneyle çalışılmasında
önemlidir. Bu bölümde açıklanan yöntemler, TextField, StaticText, XML, ContextMenu ve FileReference nesneleri
gibi nesnelerde kullanılan dizelerle çalışılmasında kullanışlıdır.
Dizeler, karakterler sırasıdır. ActionScript 3.0, ASCII ve Unicode karakterlerini destekler.
Dizelerin temelleri
Dizelerle çalışmaya giriş
Programlama dilinde dize, bir metin değeridir, başka bir deyişle, harf, sayı ve diğer karakterlerin tek bir değer olarak
birleştirilmiş sırasıdır. Örneğin, bu kod satırı, String veri türünde bir değişken oluşturur ve bu değişkene değişmez bir
dize değeri atar:
var albumName:String = "Three for the money";
Bu örnekte gösterildiği gibi, ActionScript'te, metni tırnak veya kesme işareti içine alarak bir dize değerini
belirtebilirsiniz. Aşağıda başka dize örneklerine de yer verilmiştir:
"Hello"
"555-7649"
"http://www.adobe.com/"
ActionScript'te bir metin parçasını işlediğinizde bir dize değeriyle çalışıyorsunuz demektir. ActionScript String sınıfı,
metin değerleriyle çalışmak için kullanabildiğiniz veri türüdür. String örnekleri genellikle özellikler, yöntem
parametreleri ve diğer birçok ActionScript sınıfındaki öğeler için kullanılır.
Dizelerle çalışmaya yönelik ortak görevler
Aşağıda, bu bölümde ele alınan dizelerle ilgili ortak görevlere yer verilmiştir:
• String nesneleri oluşturma
• Satır başı, sekme ve klavye dışı karakterler gibi özel karakterlerle çalışma
• Dize uzunluğunu ölçme
• Dizede tek karakterleri ayırma
• Dizeleri birleştirme
• Dizeleri karşılaştırma
• Dize bölümlerini bulma, ayıklama ve değiştirme
• Dizeleri büyük harfli veya küçük harfli duruma getirme
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:
• ASCII: Bilgisayar programlarında metin karakterlerinin ve sembollerin temsil edilmesine yönelik bir sistem. ASCII
sistemi, 26 harfli İngilizce alfabesini ve sınırlı bir ek karakter kümesini destekler.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 139
Dizelerle çalışma
• Karakter: Metin verisinin en küçük birimi (tek bir harf veya sembol).
• Bitiştirme: Birden çok dize değerini birbirine ekleyip bitiştirerek yeni bir dize değeri oluşturma.
• Boş dize: "" şeklinde yazılan, herhangi bir metin, boşluk veya karakter içermeyen bir dize. Boş dize değeri, null
değerine sahip bir String değişkeninden farklıdır—boş dize herhangi bir karakter içermeyen bir String örneğine
sahipken, null String değeri, kendisine bir String örneği atanmamış değişkendir.
• Dize: Bir metin değeri (karakterler sırası).
• Dize değişmezi (veya “değişmez dize”): Kodda açıkça yazılan, tırnak veya kesme işareti içine alınmış bir dize değeri.
• Alt dize: Başka bir dizenin parçası olan bir dize.
• Unicode: Bilgisayar programlarında metin karakterlerinin ve sembollerin temsil edilmesine yönelik standart bir
sistem. Unicode sistemi, herhangi bir yazma sisteminde tüm karakterlerin kullanılmasına olanak sağlar.
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Bu bölümdeki kod listeleri öncelikle
metnin işlenmesiyle ilgili olduğundan, örneklerin test edilmesi işlemi, değerleri Sahne Alanı'ndaki bir metin alanı
örneğine yazarak veya Çıktı paneline değerleri yazdırmak için trace() işlevini kullanarak, örneklerde kullanılan
değişkenlerin değerlerinin görüntülenmesini içerir. Bu teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34
bölümünde ayrıntılı şekilde açıklanmıştır.
Dizeler oluşturma
ActionScript 3.0'da dize (metin) verilerini temsil etmek için String sınıfı kullanılır. ActionScript dizeleri hem ASCII
hem de Unicode karakterlerini destekler. Dize oluşturmanın en basit yolu, bir dize değişmezinin kullanılmasıdır. Bir
dize değişmezi bildirmek için tırnak işareti (") veya kesme işareti (') karakterlerini kullanın. Örneğin, şu iki dize
eşdeğerdir:
var str1:String = "hello";
var str2:String = 'hello';
Ayrıca aşağıdaki gibi, new operatörünü kullanarak da bir dize bildirebilirsiniz:
var str1:String = new String("hello");
var str2:String = new String(str1);
var str3:String = new String();
// str3 == ""
Aşağıdaki iki dize eşdeğerdir:
var str1:String = "hello";
var str2:String = new String("hello");
Kesme işareti (') sınırlayıcıları ile tanımlanmış bir dize değişmesi içinde kesme işareti (') kullanmak için, ters eğik
çizgi karakterini (\) kullanın. Aynı şekilde, tırnak işareti (") sınırlayıcıları ile tanımlanmış bir dize değişmesi içinde
tırnak işareti (") kullanmak için de ters eğik çizgi karakterini (\) kullanın. Aşağıdaki iki dize eşdeğerdir:
var str1:String = "That's \"A-OK\"";
var str2:String = 'That\'s "A-OK"';
Aşağıdaki gibi, bir dize değişmezinde bulunan kesme işaretini veya tırnak işaretini esas alarak kesme işareti ya da
tırnak işareti kullanmayı seçebilirsiniz:
var str1:String = "ActionScript <span class='heavy'>3.0</span>";
var str2:String = '<item id="155">banana</item>';
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 140
Dizelerle çalışma
ActionScript'in düz kesme işareti (') ile sola veya sağa eğik kesme işaretini (' ya da ' ) ayırt ettiğini unutmayın. Tırnak
işaretinde de aynı durum geçerlidir. Dize değişmezlerini tanımlamak için düz tırnak işaretlerini kullanın. Başka bir
kaynaktan ActionScript'e metin yapıştırırken, doğru karakterleri kullandığınızdan emin olun.
Aşağıdaki tabloda gösterildiği gibi, dize değişmezlerinde diğer karakterleri tanımlamak için ters eğik çizgi karakterini
(\) kullanabilirsiniz:
Kaçış sırası
Karakter
\b
Backspace
\f
Sonraki sayfaya geçme
\n
Yeni satır
\r
Satır başı
\t
Sekme
\unnnn
nnnn onaltılık sayısıyla karakter kodu belirtilmiş Unicode karakteri; örneğin, \u263a gülen yüz
karakteridir.
\\xnn
nn onaltılık sayısıyla karakter kodu belirtilmiş ASCII karakteri
\'
Kesme işareti
\"
Tırnak işareti
\\
Tek ters eğik çizgi karakteri
length özelliği
Her dize, dizede bulunan karakter sayısına eşit olan bir length özelliğine sahiptir:
var str:String = "Adobe";
trace(str.length);
// output: 5
Aşağıdaki örnekte gösterildiği gibi, boş dize de null değerine sahip dize de 0 uzunluğuna sahiptir:
var str1:String = new String();
trace(str1.length);
// output: 0
str2:String = '';
trace(str2.length);
// output: 0
Dizelerdeki karakterlerle çalışma
Dizedeki her karakter, dizede bir dizin konumuna sahiptir (tam sayı). Birinci karakterin dizin konumu 0'dır. Örneğin,
aşağıdaki dizede, y karakteri 0 konumunda ve w karakteri de 5 konumundadır:
"yellow"
Bu örnekte olduğu gibi, charAt() yöntemini ve charCodeAt() yöntemini kullanarak çeşitli konumlardaki
karakterleri teker teker inceleyebilirsiniz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 141
Dizelerle çalışma
var str:String = "hello world!";
for (var i:int = 0; i < str.length; i++)
{
trace(str.charAt(i), "-", str.charCodeAt(i));
}
Bu kodu çalıştırdığınızda şu çıktı üretilir:
h
e
l
l
o
w
o
r
l
d
!
- 104
- 101
- 108
- 108
- 111
32
- 119
- 111
- 114
- 108
- 100
- 33
Ayrıca aşağıdaki örnekte gösterildiği gibi, fromCharCode() yöntemini kullanarak bir dizeyi tanımlamak için de
karakter kodlarını kullanabilirsiniz:
var myStr:String = String.fromCharCode(104,101,108,108,111,32,119,111,114,108,100,33);
// Sets myStr to "hello world!"
Dizeleri karşılaştırma
Dizeleri karşılaştırmak için şu operatörleri kullanabilirsiniz: <, <=, !=, ==, => ve >. Bu operatörler, aşağıdaki örnekte
gösterildiği şekilde, if ve while gibi koşul deyimleriyle kullanılabilir:
var str1:String = "Apple";
var str2:String = "apple";
if (str1 < str2)
{
trace("A < a, B < b, C < c, ...");
}
Bu operatörler dizelerle kullanıldığında, ActionScript uygulaması aşağıda olduğu gibi, dizedeki her karakterin karakter
kodu değerini dikkate alarak karakterleri soldan sağa karşılaştırır:
trace("A" < "B"); // true
trace("A" < "a"); // true
trace("Ab" < "az"); // true
trace("abc" < "abza"); // true
Aşağıdaki örnekte gösterildiği gibi, dizeleri birbiriyle ve diğer nesne türleriyle karşılaştırmak için == ve !=
operatörlerini kullanın:
var str1:String = "1";
var str1b:String = "1";
var str2:String = "2";
trace(str1 == str1b); // true
trace(str1 == str2); // false
var total:uint = 1;
trace(str1 == total); // true
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 142
Dizelerle çalışma
Diğer nesnelerin dize halinde temsilini alma
Herhangi türdeki bir nesnenin String temsilini alabilirsiniz. Tüm nesneler bu amaçla bir toString() yöntemine
sahiptir:
var n:Number = 99.47;
var str:String = n.toString();
// str == "99.47"
String nesneleri ile dize olmayan nesnelerin birleşimiyle + bitiştirme operatörünü kullandığınızda, toString()
yöntemini kullanmanız gerekir. Bitiştirmeyle ilgili ayrıntılar için bir sonraki bölüme bakın.
String() genel işlevi, belirli nesne için toString() yöntemini çağıran nesne tarafından döndürülen değerle aynı
değeri döndürür.
Dizeleri bitiştirme
Dizelerin bitiştirilmesi, iki dizenin alınıp sırayla birbirine eklenmesi anlamına gelir. Örneğin, iki dizeyi bitiştirmek için
+ operatörünü kullanabilirsiniz:
var str1:String = "green";
var str2:String = "ish";
var str3:String = str1 + str2; // str3 == "greenish"
Aşağıdaki örnekte gösterildiği gibi, aynı sonucu üretmek için += operatörünü de kullanabilirsiniz:
var str:String = "green";
str += "ish"; // str == "greenish"
Ayrıca, String sınıfı şu şekilde kullanılabilen bir concat() yöntemini içerir:
var str1:String = "Bonjour";
var str2:String = "from";
var str3:String = "Paris";
var str4:String = str1.concat(" ", str2, " ", str3);
// str4 == "Bonjour from Paris"
+ operatörünü (veya += operatörünü) bir String nesnesiyle ve dize olmayan bir nesneyle kullanırsanız, bu örnekte
gösterildiği gibi, ActionScript ifadeyi değerlendirmek için dize olmayan nesneyi bir String nesnesine dönüştürür:
var str:String = "Area = ";
var area:Number = Math.PI * Math.pow(3, 2);
str = str + area; // str == "Area = 28.274333882308138"
Ancak aşağıdaki örnekte gösterildiği gibi, + operatörü için bağlam sağlamak üzere gruplandırma için parantezleri
kullanabilirsiniz:
trace("Total: $" + 4.55 + 1.45); // output: Total: $4.551.45
trace("Total: $" + (4.55 + 1.45)); // output: Total: $6
Dizelerdeki alt dizeleri ve desenleri bulma
Alt dizeler, bir dize içindeki sıralı karakterlerdir. Örneğin, "abc" dizesi şu alt dizelere sahiptir: "", "a", "ab", "abc",
"b", "bc", "c". Bir dizenin alt dizelerini bulmak için ActionScript yöntemlerini kullanabilirsiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 143
Dizelerle çalışma
Desenler, ActionScript'te dizelerle veya normal ifadelerle tanımlanır. Örneğin, şu normal ifade belirli bir deseni
tanımlar—ardından bir rakam karakterinin geldiği A, B ve C harfleri (normal ifade sınırlayıcıları, eğik çizgilerdir):
/ABC\d/
ActionScript, dizelerdeki desenlerin bulunmasına ve bulunan eşleşmelerin yerini alan alt dizelerlerle değiştirilmesine
yönelik yöntemler içerir. Bunlar ilerleyen bölümlerde açıklanmaktadır.
Normal ifadeler karmaşık desenleri tanımlayabilir. Daha fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202.
Karakter konumuna göre bir alt dizeyi bulma
substr() ve substring() yöntemleri birbirine benzer. Her ikisi de bir dizenin alt dizesini döndürür. Her ikisi de iki
parametre alır. Her iki yöntemde de birinci parametre, belirli bir dizedeki başlangıç karakterinin konumudur. Ancak,
substr() yönteminde ikinci parametre, döndürülecek alt dizenin uzunluğuyken, substring() yönteminde ikinci
parametre, alt dizenin sonundaki karakterin (döndürülen dizeye dahil edilmeyen) konumudur. Bu örnek, bu iki
yöntem arasındaki farkı gösterir:
var str:String = "Hello from Paris, Texas!!!";
trace(str.substr(11,15)); // output: Paris, Texas!!!
trace(str.substring(11,15)); // output: Pari
slice() yöntemi, substring() yöntemine benzer şekilde çalışır. Parametre olarak iki tane negatif olmayan tam sayı
verildiğinde tamamen aynı çalışır. Ancak, slice() yöntemi negatif tam sayıları parametre olarak alabilir ve bu
durumda aşağıdaki örnekte gösterildiği gibi, karakter konumu dizenin sonundan alınır:
var str:String = "Hello from Paris,
trace(str.slice(11,15)); // output:
trace(str.slice(-3,-1)); // output:
trace(str.slice(-3,26)); // output:
trace(str.slice(-3,str.length)); //
trace(str.slice(-8,-3)); // output:
Texas!!!";
Pari
!!
!!!
output: !!!
Texas
slice() yönteminin parametreleri olarak negatif olmayan tam sayılarla negatif tam sayıları birleştirebilirsiniz.
Eşleşen bir alt dizenin karakter konumunu bulma
Aşağıdaki örnekte gösterildiği gibi, bir dizedeki eşleşen alt dizeleri bulmak için indexOf() ve lastIndexOf()
yöntemlerini kullanabilirsiniz:
var str:String = "The moon, the stars, the sea, the land";
trace(str.indexOf("the")); // output: 10
indexOf() yönteminin büyük/küçük harf duyarlı olduğuna dikkat edin.
Aşağıdaki gibi, aramanın başlatılacağı dizedeki dizin konumunu belirtmek için ikinci bir parametre belirtebilirsiniz:
var str:String = "The moon, the stars, the sea, the land"
trace(str.indexOf("the", 11)); // output: 21
lastIndexOf() yöntemi, dizedeki alt dizenin en son geçtiği yeri bulur:
var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the")); // output: 30
lastIndexOf() yöntemine ikinci bir parametre dahil ederseniz, arama geriye doğru çalışacak şekilde (sağdan sola)
dizedeki dizin konumundan yürütülür:
var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the", 29)); // output: 21
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 144
Dizelerle çalışma
Alt dizelerin sınırlayıcıyla bölünmüş bir dizisini oluşturma
Alt dizelerin sınırlayıcı esas alınarak bölünmüş bir dizisini oluşturmak için split() yöntemini kullanabilirsiniz.
Örneğin, virgül sınırlı veya sekme sınırlı dizeyi birden çok dizeye bölebilirsiniz.
Aşağıdaki örnekte, sınırlayıcı olarak ve (&) karakterinin kullanılmasıyla bir dizinin nasıl alt dizelere bölündüğü
gösterilmektedir:
var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65";
var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]
split() yönteminin isteğe bağlı olan ikinci parametresi, döndürülen dizinin maksimum boyutunu tanımlar.
Normal bir ifadeyi de sınırlayıcı olarak kullanabilirsiniz:
var str:String = "Give me\t5."
var a:Array = str.split(/\s+/); // a == ["Give","me","5."]
Daha fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202 ve ActionScript 3.0 Dil ve Bileşenler Başvurusu
Dizelerdeki desenleri bulma ve alt dizeleri değiştirme
String sınıfı, dizelerdeki desenlerle çalışılmasına yönelik şu yöntemleri içerir:
• Bir desenle eşleşen alt dizeleri bulmak için match() ve search() yöntemlerini kullanın.
• Bir desenle eşleşen alt dizeleri bulup bunları belirtilen bir alt dizeyle değiştirmek için replace() yöntemini
kullanın.
Bunlar ilerleyen bölümlerde açıklanmaktadır.
Bu yöntemlerde kullanılan desenleri tanımlamak için dizeleri veya normal ifadeleri kullanabilirsiniz. Normal ifadeler
hakkında daha fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202.
Eşleşen alt dizeleri bulma
search() yöntemi, bu örnekte gösterildiği gibi, belirli bir desenle eşleşen birinci alt dizenin dizin konumunu
döndürür:
var str:String = "The more the merrier.";
// (This search is case-sensitive.)
trace(str.search("the")); // output: 9
Bu örnekte gösterildiği gibi, eşleşen deseni tanımlamak için normal ifadeleri kullanabilirsiniz:
var pattern:RegExp = /the/i;
var str:String = "The more the merrier.";
trace(str.search(pattern)); // 0
Dizedeki birinci karakter 0 dizin konumunda olduğundan, trace() yönteminin çıktısı 0'dır. i bayrağı normal ifadede
ayarlanır, bu nedenle arama büyük/küçük harf duyarlı değildir.
Normal ifadede g (genel) bayrağı ayarlanmış olsa da, search() yöntemi yalnızca bir eşleşme bulur ve bunun başlangıç
dizin konumunu döndürür.
Aşağıdaki örnek, tırnak işareti içindeki bir dizeyle eşleşen, daha karmaşık bir normal ifadeyi gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 145
Dizelerle çalışma
var pattern:RegExp = /"[^"]*"/;
var str:String = "The \"more\" the merrier.";
trace(str.search(pattern)); // output: 4
str = "The \"more the merrier.";
trace(str.search(pattern)); // output: -1
// (Indicates no match, since there is no closing double quotation mark.)
match() yöntemi benzer şekilde çalışır. Eşleşen bir alt dizeyi arar. Ancak, aşağıdaki örnekte olduğu gibi, normal ifade
deseninde genel bayrağını kullandığınızda, match() yöntemi, eşleşen alt dizelerin bir dizisini döndürür:
var str:String = "[email protected], [email protected]";
var pattern:RegExp = /\w*@\w*\.[org|com]+/g;
var results:Array = str.match(pattern);
results dizisi şu şekilde ayarlanır:
["[email protected]","[email protected]"]
Normal ifadeler hakkında daha fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202“Normal ifadeler kullanma”
sayfa 202.
Eşleşen alt dizeleri değiştirme
Bir dizedeki belirtilen bir deseni aramak ve eşleşmeleri, belirtilen yerini alan dizeyle değiştirmek için, aşağıdaki örnekte
gösterildiği gibi, replace() yöntemini kullanabilirsiniz:
var str:String = "She sells seashells by the seashore.";
var pattern:RegExp = /sh/gi;
trace(str.replace(pattern, "sch"));
//sche sells seaschells by the seaschore.
Normal ifadede i (ignoreCase) bayrağı ayarlanmış olduğundan, eşleşen dizelerin büyük/küçük harf duyarlı
olmadığını ve g (global) bayrağı ayarlanmış olduğundan, birden çok eşleşmenin değiştirildiğini unutmayın. Daha
fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202.
Yerini alan dizeye şu $ yerini alma kodlarınıdahil edebilirsiniz. Aşağıdaki tabloda gösterilen yerini alan metin, $ yerini
alma kodunun yerine eklenir:
$ Kodu
Yerini Alan Metin
$$
$
$&
Eşlenen alt dize.
$`
Eşleşen alt dizeden önce gelen dize bölümü. Bu kod, düz kesme işaretini (') veya sola eğik kesme işaretini (' ) değil,
düz sola eğik kesme işareti karakterini (`) kullanır.
$'
Eşleşen alt dizeden sonra gelen dize bölümü. Bu kod, düz kesme işaretini (' ) kullanır.
$n
n. yakalanan parantez grubu eşleşmesi, burada n 1-9 arasında tek basamaklı bir sayıdır ve $n öğesinden sonra
ondalık bir sayı gelmez.
$nn
nn. yakalanan parantez grubu eşleşmesi, burada nn 01–99 arasında iki basamaklı ondalık bir sayıdır. nn. yakalama
tanımsızsa, yerini alan metin boş bir dizedir.
Örneğin, aşağıda, eşleşen birinci ve ikinci yakalama grubunu temsil eden$2 ve $1 yerini alma kodlarının kullanımını
göstermektedir:
var str:String = "flip-flop";
var pattern:RegExp = /(\w+)-(\w+)/g;
trace(str.replace(pattern, "$2-$1")); // flop-flip
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 146
Dizelerle çalışma
Bir işlevi replace() yönteminin ikinci parametresi olarak da kullanabilirsiniz. Eşleşen metin, işlevin döndürülen
değeriyle değiştirilir.
var str:String = "Now only $9.95!";
var price:RegExp = /\$([\d,]+.\d+)+/i;
trace(str.replace(price, usdToEuro));
function usdToEuro(matchedSubstring:String, capturedMatch1:String,
str:String):String
{
var usd:String = capturedMatch1;
usd = usd.replace(",", "");
var exchangeRate:Number = 0.853690;
var euro:Number = parseFloat(usd) * exchangeRate;
const euroSymbol:String = String.fromCharCode(8364);
return euro.toFixed(2) + " " + euroSymbol;
}
index:int,
Bir işlevi, replace() yönteminin ikinci parametresi olarak kullandığınızda, şu argümanlar işleve iletilir:
• Dizenin eşleşen bölümü.
• Herhangi bir yakalama parantez grubu eşleşmesi. Bu şekilde iletilen argüman sayısı, parantez eşleşmelerinin
sayısına bağlı olarak değişiklik gösterir. İşlev kodu içinde arguments.length - 3 öğesini kontrol ederek, parantez
eşleşmelerinin sayısını belirleyebilirsiniz.
• Eşleşmenin başladığı dize içindeki dizin konumu.
• Tam dize.
Dizeleri büyük harfe veya küçük harfe dönüştürme
Aşağıdaki örneklerde de gösterildiği gibi, toLowerCase() yöntemi ve toUpperCase() yöntemi, sırayla bir dizedeki
alfabetik karakterleri küçük harfe ve büyük harfe dönüştürür:
var str:String = "Dr. Bob Roberts, #9."
trace(str.toLowerCase()); // dr. bob roberts, #9.
trace(str.toUpperCase()); // DR. BOB ROBERTS, #9.
Bu yöntemler çalıştırıldıktan sonra, kaynak dize değişmeden kalır. Kaynak dizeyi dönüştürmek için, şu kodu kullanın:
str = str.toUpperCase();
Bu yöntemler yalnızca a–z ve A–Z karakterleriyle değil, genişletilmiş karakterlerle çalışır:
var str:String = "José Barça";
trace(str.toUpperCase(), str.toLowerCase()); // JOSÉ BARÇA josé barça
Örnek: ASCII art
Bu ASCII Art örneği, ActionScript 3.0'da String sınıfıyla çalışılmasının aşağıda örnekleri verilen birçok özelliğini
gösterir:
• String sınıfının split() yöntemi, karakter sınırlı bir dizeden (sekme sınırlı bir metin dosyasındaki görüntü
bilgileri) değerleri ayıklamak için kullanılır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 147
Dizelerle çalışma
•
split(), bitiştirme ve substring() ile substr() yöntemlerini kullanarak dizenin bir bölümünü ayıklama gibi
birçok dize işleme tekniği, görüntü başlıklarındaki her sözcüğün ilk harfini büyük harfli yapmak için kullanılır.
•
getCharAt() yöntemi, bir dizeden tek bir karakter almak için kullanılır (gri tonlamalı bitmap verisine karşılık
gelen ASCII karakterini belirlemek için).
• Dize bitiştirme, bir görüntünün bir defada tek bir karakterle ASCII art temsilini oluşturmak için kullanılır.
ASCII art terimi, bir görüntünün metin temsilini ifade eder, burada, Courier New karakterleri gibi tek boşluklu font
karakterlerinin bir ızgarası resmi çizer. Aşağıdaki görüntü, uygulama tarafından oluşturulmuş bir ASCII art örneğini
gösterir:
Grafiğin ASCII art sürümü sağda gösterilir.
Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.
ASCIIArt uygulama dosyalarını Samples/AsciiArt klasöründe bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:
Dosya
Açıklama
AsciiArtApp.mxml
Flash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası
veya
AsciiArtApp.fla
com/example/programmingas3/asciiArt/AsciiArtBuilder.as
com/example/programmingas3/asciiArt/BitmapToAsciiConverter.as
Metin dosyasından görüntü meta verisini ayıklama,
görüntüleri yükleme ve görüntü-metin dönüştürme işlemini
yönetme gibi, uygulamanın ana işlevlerini sağlayan sınıf.
Görüntü verisinin bir String sürümüne dönüştürülmesi için
parseBitmapData() yöntemini sağlayan bir sınıf.
com/example/programmingas3/asciiArt/Image.as
Yüklenen bir bitmap görüntüsünü temsil eden sınıf.
com/example/programmingas3/asciiArt/ImageInfo.as
ASCII art görüntüsünün meta verilerini (örn. başlık, görüntü
dosyası URL'si, vb.) temsil eden sınıf.
image/
Uygulama tarafından kullanılan görüntüleri içeren klasör.
txt/ImageData.txt
Uygulama tarafından yüklenecek görüntülerle ilgili bilgileri
içeren, sekme sınırlı metin dosyası.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 148
Dizelerle çalışma
Sekme sınırlı değerleri ayıklama
Bu örnek, yaygın bir uygulama olan, uygulama verilerinin uygulamadan ayrı saklanmasını kullanır; bu şekilde, veri
değişirse (örneğin, başka bir görüntü eklenirse veya bir görüntünün başlığı değişirse), SWF dosyasının yeniden
oluşturulması gerekmez. Bu durumda, görüntü başlığı, gerçek görüntü dosyasının URL'si ve görüntüyü işlemek için
kullanılan bazı değerler gibi görüntü meta verileri, bir metin dosyasında (projedeki txt/ImageData.txt dosyasında)
saklanır. Metin dosyasının içerikleri şunlardır:
FILENAMETITLEWHITE_THRESHHOLDBLACK_THRESHHOLD
FruitBasket.jpgPear, apple, orange, and bananad810
Banana.jpgA picture of a bananaC820
Orange.jpgorangeFF20
Apple.jpgpicture of an apple6E10
Dosya belirli bir sekme sınırlı formatı kullanır. Birinci satır, başlık satırıdır. Kalan satırlar, yüklenecek her bitmap için
şu verileri içerir:
• Bitmapin dosya adı.
• Bitmapin görüntü adı.
• Bitmapler için beyaz eşiği ve siyah eşiği değerleri. Bunlar bir pikselin tamamen beyaz veya tamamen siyah olarak
değerlendirilmesi için ölçüt olan onaltılık değerlerdir.
Uygulama başlatıldığı anda AsciiArtBuilder sınıfı, AsciiArtBuilder sınıfının parseImageInfo() yönteminden şu
kodu kullanarak, görüntülenecek görüntülerin "yığınını" oluşturmak için metin dosyasının içeriklerini yükler ve
ayrıştırır:
var lines:Array = _imageInfoLoader.data.split("\n");
var numLines:uint = lines.length;
for (var i:uint = 1; i < numLines; i++)
{
var imageInfoRaw:String = lines[i];
...
if (imageInfoRaw.length > 0)
{
// Create a new image info record and add it to the array of image info.
var imageInfo:ImageInfo = new ImageInfo();
// Split the current line into values (separated by tab (\t)
// characters) and extract the individual properties:
var imageProperties:Array = imageInfoRaw.split("\t");
imageInfo.fileName = imageProperties[0];
imageInfo.title = normalizeTitle(imageProperties[1]);
imageInfo.whiteThreshold = parseInt(imageProperties[2], 16);
imageInfo.blackThreshold = parseInt(imageProperties[3], 16);
result.push(imageInfo);
}
}
Metin dosyasının tüm içerikleri, tek bir String örneği olan _imageInfoLoader.data özelliğinde barındırılır.
Parametre olarak yeni satır karakteriyle ("\n") split() yöntemi kullanılarak, String örneği, öğelerinin her biri metin
dosyası satırı olan bir Array (lines) öğesine bölünür. Daha sonra kod, satırların her biriyle çalışmak için bir döngü
kullanır (gerçek içerik yerine yalnızca başlık içerdiğinden, birinci satır hariç). Döngünün içinde, tek bir satırın
içeriklerini, değerler kümesine (imageProperties adındaki Array nesnesi) bölmek için bir kez daha split()
yöntemi kullanılır. Bu durumda, her satırdaki karakterler sekme karakterleriyle ayrıldığından, split() yöntemiyle
kullanılan parametre, sekme ("\t") karakteridir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 149
Dizelerle çalışma
Görüntü başlıklarını normalleştirmek için String yöntemlerini kullanma
Bu uygulamanın tasarım kararlarından biri, görüntü başlıklarının, sözcüklerin her birinin baş harfi büyük olacak
şekilde (yaygın olarak baş harfi küçük harfle yazılan birkaç sözcük dışında) standart format kullanılarak
görüntülenmesidir. Uygulama, metin dosyasının uygun şekilde formatlanmış başlıklar içerdiğini varsaymak yerine,
metin dosyasından ayıklanırken başlıkları formatlar.
Önceki kod listesinde, tek bir görüntünün meta veri değerlerinin ayıklanmasının bir parçası olarak şu kod satırı
kullanılır:
imageInfo.title = normalizeTitle(imageProperties[1]);
Bu kodda, görüntünün başlığı ImageInfo nesnesinde saklanmadan önce normalizeTitle() yöntemiyle metin
dosyasından iletilir:
private
{
var
var
for
{
function normalizeTitle(title:String):String
words:Array = title.split(" ");
len:uint = words.length;
(var i:uint; i < len; i++)
words[i] = capitalizeFirstLetter(words[i]);
}
return words.join(" ");
}
Bu yöntem, başlığı tek tek sözcüklere bölmek için (boşluk karakteriyle ayrılmış şekilde) split() yöntemini kullanır,
capitalizeFirstLetter() yöntemi yoluyla sözcüklerin her birini iletir ve sonra sözcükleri tekrar tek bir dize
halinde birleştirmek için Array sınıfının join() yöntemini kullanır.
capitalizeFirstLetter() yöntemi, her sözcüğün birinci harfini büyük harf yapma çalışmasını gerçekleştirir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 150
Dizelerle çalışma
/**
* Capitalizes the first letter of a single word, unless it's one of
* a set of words that are normally not capitalized in English.
*/
private function capitalizeFirstLetter(word:String):String
{
switch (word)
{
case "and":
case "the":
case "in":
case "an":
case "or":
case "at":
case "of":
case "a":
// Don't do anything to these words.
break;
default:
// For any other word, capitalize the first character.
var firstLetter:String = word.substr(0, 1);
firstLetter = firstLetter.toUpperCase();
var otherLetters:String = word.substring(1);
word = firstLetter + otherLetters;
}
return word;
}
Türkçe'de, başlıkta şu sözcüklerden biri bulunuyorsa, bu sözcüklerin baş harfi büyük harfli yapılmaz: “ve”, “için”,
“ancak”, “fakat”, “veya”, “de” “da” veya “ki” (Bu, kuralların basitleştirilmiş bir sürümüdür.) Bu mantığı çalıştırmak için
kod ilk olarak bir switch deyimini kullanarak sözcüğün büyük harfli yapılmaması gereken sözcüklerden biri olup
olmadığını kontrol eder. Büyük harfli yapılmaması gereken sözcüklerden biriyse, kod switch deyimini atlar. Diğer
yandan, sözcüğün büyük harfli yapılması gerekiyorsa, bu da birkaç adım uygulanarak şu şekilde yapılır:
1 substr(0, 1) yöntemi kullanılarak sözcüğün birinci harfi ayıklanır, böylece 0 dizinindeki karakterle (0 birinci
parametresi tarafından belirtildiği gibi, dizedeki birinci harf) başlayan bir alt dize ayıklanır. Alt dize bir karakter
uzunluğundadır (1 ikinci parametresi tarafından belirtildiği gibi).
2 toUpperCase() yöntemi kullanılarak bu karakter büyük harfli yapılır.
3 Orijinal sözcüğün kalan karakterleri, substring(1) yöntemi kullanılarak ayıklanır, böylece dizin 1'de başlayan bir
alt dize (ikinci harf), dizenin sonuna doğru ayıklanır (substring() yönteminin ikinci parametresinin
bırakılmasıyla belirtildiği gibi).
4 Dize bitiştirmesi kullanılarak, yeni büyük harfli yapılan birinci harf, kalan harflerle birleştirilerek son sözcük
oluşturulur: firstLetter + otherLetters.
ASCII art metni oluşturma
BitmapToAsciiConverter sınıfı, bitmap görüntüsünün ASCII metin temsiline dönüştürülmesi işlevselliğini sağlar. Bu
işlem, kısmen burada gösterilen parseBitmapData() yöntemi tarafından gerçekleştirilir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 151
Dizelerle çalışma
var result:String = "";
// Loop through the rows of pixels top to bottom:
for (var y:uint = 0; y < _data.height; y += verticalResolution)
{
// Within each row, loop through pixels left to right:
for (var x:uint = 0; x < _data.width; x += horizontalResolution)
{
...
// Convert the gray value in the 0-255 range to a value
// in the 0-64 range (since that's the number of "shades of
// gray" in the set of available characters):
index = Math.floor(grayVal / 4);
result += palette.charAt(index);
}
result += "\n";
}
return result;
Bu kod ilk olarak, bitmap görüntüsünün ASCII art sürümünü oluşturmak için kullanılacak result adındaki bir String
örneğini tanımlar. Daha sonra, kaynak bitmap görüntüsünün tek tek pikselleri üzerinde döngü gerçekleştirir. Birçok
renk işleme tekniğini kullanarak (kısa tutmak amacıyla burada yer verilmemiştir), tek bir pikselin kırmızı, yeşil ve mavi
renk değerlerini tek bir gri tonlamalı değere (0 ile 255 arasında bir değer) dönüştürür. Daha sonra kod bu değeri 0-63
ölçeğinde bir değere dönüştürmek için 4'e böler (gösterildiği gibi) ve sonrada bu değer index dizininde saklanır. (Bu
uygulama tarafından kullanılan mevcut ASCII karakterlerinin "paleti" 64 değer içerdiğinden, 0-63 ölçeği kullanılır.)
Karakterlerin paleti, BitmapToAsciiConverter sınıfında bir String örneği olarak tanımlanır:
// The characters are in order from darkest to lightest, so that their
// position (index) in the string corresponds to a relative color value
// (0 = black).
private static const palette:String =
"@#$%&8BMW*mwqpdbkhaoQ0OZXYUJCLtfjzxnuvcr[]{}1()|/?Il!i><+_~-;,. ";
index değişkeni, paletteki hangi ASCII karakterinin bitmap görüntüsündeki geçerli piksele karşılık geldiğini
tanımladığından, charAt() yöntemi kullanılarak palette String öğesinden o karakter alınır. Daha sonra bitiştirme
ataması (+=) operatörü kullanılarak bu karakter result String örneğine eklenir. Ayrıca, her piksel satırının sonunda,
result String öğesinin sonuna yeni satır karakteri eklenerek, satır yeni bir "piksel" karakteri satırı oluşturmaya
zorlanır.
152
Bölüm 8: Dizilerle çalışma
Diziler tek bir veri yapısında birden fazla değer saklamanıza olanak sağlar. Değerleri sabit sıralı tam sayı dizinleri
kullanarak saklayan basit dizinlenmiş dizileri veya değerleri rastgele anahtarlar kullanarak saklayan karmaşık ilişkili
dizileri kullanabilirsiniz. Diziler ayrıca başka diziler içerebilir ve çok boyutlu olabilirler. Son olarak, öğeleri aynı veri
türünün örneği olan bir dizi için bir Vector öğesi kullanabilirsiniz. Bu bölümde çeşitli dizi türlerini oluşturma ve
değiştirme yöntemleri anlatılmaktadır.
Dizilerin temelleri
Dizilerle çalışmaya giriş
Genellikle programlamada, tek bir nesne yerine bir öğeler kümesiyle çalışmanız gerekir. Örneğin, bir müzik çalar
uygulamasında, oynatılmayı bekleyen bir şarkı listesinin olmasını isteyebilirsiniz. Bu listedeki her şarkı için ayrı bir
değişken oluşturmak zorunda kalmak istemezsiniz. Tüm Song nesnelerinin bir paket içinde bir arada olması ve
bunlarla bir grup olarak çalışılabilmesi tercih edilir.
Dizi, şarkı listesi gibi bir öğeler kümesi konteyneri olarak hareket eden bir programlama öğesidir. Genellikle dizideki
öğelerin tümü aynı sınıfın örnekleridir ancak bu ActionScript'te bir zorunluluk değildir. Dizideki öğelerin her biri,
dizinin öğeleri olarak bilinir. Diziyi, değişkenlere yönelik bir dosya çekmecesi olarak düşünebilirsiniz. Değişkenler,
öğeler olarak diziye eklenebilir, bu tıpkı bir dosya çekmecesine klasör yerleştirilmesine benzer. Diziyle tek bir değişken
olarak çalışabilirsiniz (çekmecenin tamamını farklı bir konuma taşımak gibi). Değişkenlerle bir grup olarak
çalışabilirsiniz (bir bilgi ararken klasörlerde teker teker gezinmek gibi). Bunlara ayrı ayrı da erişebilirsiniz (çekmeceyi
açıp tek bir klasörü seçmek gibi).
Örneğin, kullanıcının birden çok şarkıyı seçip oynatma listesine ekleyebildiği bir müzik çalar uygulaması
oluşturduğunuzu varsayın. ActionScript kodunuzda, tek bir diziyi parametre olarak kabul eden,
addSongsToPlaylist() adında bir yönteminiz vardır. Listeye kaç şarkı eklemek isterseniz isteyin (az, çok veya
yalnızca bir adet), addSongsToPlaylist() yöntemini yalnızca bir defa çağırarak, Song nesnelerini içeren diziye
iletirsiniz. addSongsToPlaylist() yönteminin içinde, dizi öğeleri (şarkılar) arasında birer birer ilerleyip bu öğeleri
gerçekten oynatma listesine eklemek için bir döngü kullanabilirsiniz.
En yaygın ActionScript dizisi türü, dizinlenmiş dizidir. Dizinlenmiş dizide her öğe numaralandırılmış bir yuvada (dizin
olarak bilinir) saklanır. Bu öğelere, adres gibi numara kullanılarak erişilir. Dizinlenmiş diziler çoğu programlama
ihtiyacı için işe yarar. Array sınıfı, dizinlenmiş diziyi temsil etmek için kullanılan yaygın bir sınıftır.
Dizinlenmiş dizi genellikle aynı türde birden çok öğeyi (aynı sınıfın örnekleri olan nesneler) saklamak için de
kullanılır. Array sınıfı, içerdiği öğelerin türünü kısıtlamaya yönelik bir araç içermez. Vector sınıfı, tek bir dizideki tüm
öğelerin aynı türde olduğu bir dizinlenmiş dizi türüdür. Array örneği yerine Vector örneğinin kullanılması,
performans artışı ve başka avantajlar da sağlar. Vector sınıfı, Flash Player 10 ve Adobe AIR 1.5'ten itibaren
kullanılabilir.
Dizinlenmiş dizinin özel bir kullanımı, çok boyutlu dizidir. Çok boyutlu dizi, öğeleri de dizinlenmiş dizi olan (böylece
başka öğeler içeren) bir dizinlenmiş dizidir.
Başka bir dizi türü de, tek tek öğeleri tanımlamak için sayısal bir dizin yerine bir anahtar dizesi kullanan
ilişkilendirilebilir dizidir. Son olarak, ActionScript 3.0 aynı zamanda bir sözlüğü temsil eden Dictionary sınıfını da
içerir. Sözlük, öğeleri ayırt etmek için herhangi türde bir nesneyi anahtar olarak kullanmanıza olanak sağlayan bir
dizidir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 153
Dizilerle çalışma
Ortak dizi görevleri
Bu bölümde, dizilerle çalışmaya yönelik şu ortak etkinlikler açıklanmaktadır:
• Array sınıfını ve Vector sınıfını kullanarak dizinlenmiş diziler oluşturma
• Dizi öğeleri ekleme ve kaldırma
• Dizi öğelerini sıralama
• Dizinin bölümlerini ayıklama
• İlişkilendirilebilir dizilerle ve sözlüklerle çalışma
• Çok boyutlu dizilerle çalışma
• Dizi öğelerini kopyalama
• Dizi alt sınıfı oluşturma
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:
• Dizi: Birden çok nesneyi gruplamak için konteyner görevi gören bir nesne
• Dizi erişimi ([]) operatörü: Benzersiz şekilde dizi öğesini tanımlayan bir dizi veya anahtarı çevreleyen köşeli ayraç
çifti. Bu sözdizimi, dizinin tamamını değil, dizinin tek bir öğesini belirtmek için bir dizi değişkeni adından sonra
kullanılır.
• İlişkilendirilebilir dizi: Tek tek öğeleri tanımlamak için dize anahtarlarını kullanan bir dizi
• Taban türü: Vector örneğinde depolanmasına izin verilen nesnelerin veri türü
• Sözlük: Öğeleri arasında anahtar ve değer olarak bilinen nesne çiftleri yer alan bir dizi. Tek bir öğeyi tanımlamak
için sayısal dizin yerine anahtar kullanılır.
• Öğe: Dizideki tek bir öğe
• Dizin: Dizinlenmiş dizideki tek bir öğeyi tanımlamak için kullanılan sayısal "adres"
• Dizinlenmiş dizi: Öğelerin her birini numaralandırılmış konumda saklayan standart bir dizi türüdür ve tek tek
öğeleri tanımlamak için numaraları (dizin) kullanır
• Anahtar: İlişkilendirilebilir dizi veya sözlükteki tek bir öğeyi tanımlamak için kullanılan dize ya da nesne
• Çok boyutlu dizi: Tek değerler yerine diziler niteliğindeki öğeleri içeren bir dizi
•
T:Taban türü ne olursa olsun, Vector örneğinin taban türünü temsil etmek için bu belgede kullanılan standart
kural. T kuralı, Type parametresi açıklamasında gösterildiği gibi, bir sınıf adını temsil etmek için kullanılır. (“T”,
“veri türü” içinde olduğu gibi “tür” sözcüğünü ifade eder)
• Type parametresi: Vector öğesinin taban türünü (depoladığı nesnelerin veri türünü) belirtmek için, Vector sınıfı
adıyla kullanılan sözdizimi. Bu sözdizimi bir nokta (.) ve ardından açılı ayraç (<>) içine alınmış veri türü adını
içerir. Tamamı şöyle görünür: Vector.<T>. Bu belgede, type parametresinde belirtilen sınıf genel olarak T ile
belirtilir.
• Vector: Öğelerinin tümü aynı veri türünde öğeler olan bir dizi türü
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 154
Dizilerle çalışma
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Temelde, bu bölümdeki tüm kod
listeleri uygun trace() işlev çağrısını içerir. Bu bölümdeki kod listelerini test etmek için:
1 Flash geliştirme aracında boş bir belge oluşturun
2 Zaman çizelgesinde bir anahtar kare seçin.
3 Eylemler panelini açın ve kod listesini Komut Dosyası bölmesine kopyalayın.
4 Kontrol Et > Filmi Test Et komutu ile programı çalıştırın.
Çıktı panelinde, trace() işlevinin sonuçlarını göreceksiniz.
Örnek kod listelerinin test edilmesine yönelik bu ve diğer teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34
bölümünde ayrıntılı şekilde açıklanmıştır.
Dizinlenmiş diziler
Dizinlenmiş diziler, verilerin her birine işaretsiz bir tam sayı değeri ile erişilebilecek şekilde bir veya birden fazla değer
dizisi saklar. İlk dizin her zaman 0 numaradır ve dizin, diziye eklenen her alt öğe için 1 artar. ActionScript 3.0'da iki
sınıf dizinlenmiş dizi olarak kullanılır: Array sınıfı ve Vector sınıfı.
Dizinlenmiş diziler, dizin sayısı için işaretsiz bir 32-bit tam sayı kullanır. Dizinlenmiş bir dizinin maksimum boyutu
232 - 1 veya 4.294.967.295'tir. Maksimum boyuttan daha büyük bir dizi oluşturma girişimi sonunda çalışma zamanı
hatası oluşur.
Dizinlenmiş dizinin tek bir öğesine erişmek için, dizi erişimi ([]) operatörünü kullanarak, erişmek istediğiniz öğenin
dizin konumunu belirtirsiniz. Örneğin, şu kod songTitles adındaki dizinlenmiş dizide bulunan birinci öğeyi (dizin
0'daki öğe) temsil eder:
songTitles[0]
Dizi değişkeni adı ile ardından gelen köşeli ayraç içindeki dizin birleşimi, tek bir tanımlayıcı olarak hareket eder.
(Başka bir deyişle, bu bir değişken adı gibi kullanılabilir.) Atama deyiminin sol tarafındaki adı ve dizini kullanarak
dizinlenmiş dizi öğesine bir değer atayabilirsiniz:
songTitles[1] = "Symphony No. 5 in D minor";
Aynı şekilde, atama deyiminin sağ tarafındaki adı ve dizini kullanarak dizinlenmiş dizi öğesinin değerini alabilirsiniz:
var nextSong:String = songTitles[2];
Ayrıca açıkça bir değer sağlamak yerine, köşeli ayraç içinde bir değişken de kullanabilirsiniz. (Değişken, uint, pozitif
int veya pozitif tam sayı olan bir Number örneği gibi negatif olmayan bir tam sayı içermelidir.) Bu teknik genellikle
dizinlenmiş dizideki öğeler üzerinde "döngü gerçekleştirmek" ve öğelerin bazılarında veya tümünde bir işlem
gerçekleştirmek için yaygın olarak kullanılır. Aşağıdaki kod listesi bu tekniği göstermektedir. Bu kod, oddNumbers
adındaki bir Array nesnesinde bulunan değerlerin her birine erişmek için bir döngü kullanır. Değerlerin her birini
“oddNumber[index] = value” biçiminde yazdırmak için trace() deyimini kullanır:
var oddNumbers:Array = [1, 3, 5, 7, 9, 11];
var len:uint = oddNumbers.length;
for (var i:uint = 0; i < len; i++)
{
trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString());
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 155
Dizilerle çalışma
Array sınıfı
Birinci dizinlenmiş dizi türü, Array sınıfıdır. Bir Array örneği herhangi bir veri türünün değerini bulundurabilir. Aynı
Array nesnesi, farklı veri türlerindeki nesneleri bulundurabilir. Örneğin, tek bir Array örneği, dizin 0'da bir String
değerine, dizin 1'de bir Number örneğine ve dizin 2'de bir XML nesnesine sahip olabilir.
Vector sınıfı
ActionScript 3.0'da kullanılabilir olan başka bir dizinlenmiş dizi türü de Vector sınıfıdır. Vector örneği türlenmiş
dizidir, başka bir deyişle, Vector örneğindeki tüm öğeler her zaman aynı veri türüne sahiptir.
Not: Vector sınıfı, Flash Player 10 ve Adobe AIR 1.5'ten itibaren kullanılabilir.
Bir Vector değişkeni bildirdiğinizde veya bir Vector nesnesini başlattığınızda, Vector öğesinin içerebildiği nesnelerin
veri türünü açıkça belirtirsiniz. Belirtilen veri türü, Vector öğesinin taban türü olarak bilinir. Çalışma zamanında ve
derleme zamanında (katı modda), Vector öğesinin değerini ayarlayan veya Vector öğesinden bir değer alan herhangi
bir kod kontrol edilir. Eklenen veya alınan nesnenin veri türü, Vector öğesinin taban türüyle eşleşmezse bir hata
oluşur.
Veri türü kısıtlamasına ek olarak, Vector sınıfının Array sınıfından ayırt edilmesini sağlayan başka kısıtlamaları vardır:
• Vector yoğun bir dizidir. Array nesnesi, 1-6 arasındaki konumlarda değer içermese de, 0 ve 7 dizinlerinde değerler
içerebilir. Ancak bir Vector öğesinin her dizinde bir değer (veya null değeri) içermesi gerekir.
• Vector isteğe bağlı olarak sabit uzunlukta olabilir. Başka bir deyişle, Vector öğesinin içerdiği öğelerin sayısı
değişemez.
• Vector öğelerine erişim sınırlarla denetlenir. Son öğeden büyük bir dizinden (length - 1) asla bir değer
okuyamazsınız. Asla geçerli son dizinin ötesinde birden çok dizin içeren bir değer ayarlayamazsınız. (Başka bir
deyişle, varolan bir dizinde veya [length] dizininde yalnızca bir değer ayarlayabilirsiniz.)
Kısıtlamaları nedeniyle Vector öğesinin, tüm öğeleri tek bir sınıfın örnekleri olan Array örneğine göre iki adet birincil
avantajı vardır:
• Performans: Array örneği yerine Vector örneği kullanıldığında, dizi öğesinin erişimi ve yinelemesi daha hızlıdır.
• Tür güvenliği: katı modda derleyici veri türü hatalarını tanımlayabilir. Bu tür hata örnekleri arasında, Vector
öğesine yanlış veri türünde bir değer atanması veya Vector öğesinden değer okunurken yanlış veri türü beklenmesi
yer alır. Çalışma zamanında, Vector nesnesine veri eklenirken veya Vector öğesinden veri okunurken de veri türleri
kontrol edilir. Ancak bir Vector öğesine değer eklemek için push() yöntemini veya unshift() yöntemini
kullandığınızda, argümanların veri türlerinin derleme zamanında kontrol edilmediğini unutmayın. Bu yöntemler
kullanılırken, değerler çalışma zamanında kontrol edilir.
Ek kısıtlama ve avantajların yanı sıra, Vector sınıfı Array sınıfına çok benzer. Bir Vector nesnesinin özellikleri ve
yöntemleri birçok durumda Array öğesinin özelliklerine ve yöntemlerine benzer. Tüm öğelerin aynı veri türüne sahip
olduğu bir Array kullanmanız durumunda, Vector örneği tercih edilebilir.
Dizi oluşturma
Array örneği veya Vector örneği oluşturmak için birçok teknik kullanabilirsiniz. Ancak, her dizi oluşturma tekniği
birbirinden farklılık gösterir.
Array örneği oluşturma
Array() yapıcısını çağırarak veya Array değişmez sözdizimini kullanarak bir Array nesnesi oluşturursunuz.
Array() yapıcısı işlevi, üç farklı şekilde kullanılabilir. İlk olarak, yapıcıyı argüman olmadan çağırırsanız, boş bir dizi
alırsınız. Dizide herhangi bir öğe olmadığını doğrulamak için Array sınıfının length özelliğini kullanabilirsiniz.
Örneğin, şu kod Array() yapıcısını argüman olmadan çağırır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 156
Dizilerle çalışma
var names:Array = new Array();
trace(names.length); // output: 0
İkinci olarak, Array() yapıcısına tek parametre olarak bir sayıyı kullanırsanız, o sayı değerinin belirttiği uzunlukta bir
dizi oluşturulur ve öğelerin her birinin değeri undefined olarak ayarlanır. Argümanın, 0 ile 4.294.967.295 arasında
işaretsiz bir tam sayı olması gerekir. Örneğin, şu kod Array() yapıcısını tek bir sayısal argüman ile çağırır:
var names:Array = new Array(3);
trace(names.length); // output: 3
trace(names[0]); // output: undefined
trace(names[1]); // output: undefined
trace(names[2]); // output: undefined
Üçüncü olarak, yapıcıyı çağırır ve parametre olarak bir öğe listesi iletirseniz, parametrelerin her birine karşılık gelen
öğelerle bir dizi oluşturulur. Şu kod, Array() yapıcısına üç argüman iletir:
var names:Array = new Array("John", "Jane", "David");
trace(names.length); // output: 3
trace(names[0]); // output: John
trace(names[1]); // output: Jane
trace(names[2]); // output: David
Array değişmezleriyle de diziler oluşturabilirsiniz. Aşağıdaki örnekte gösterildiği gibi, bir Array değişmezi doğrudan
bir dizi değişkenine atanabilir:
var names:Array = ["John", "Jane", "David"];
Vector örneği oluşturma
Vector.<T>() yapıcısını çağırarak bir Vector örneği oluşturursunuz. Vector.<T>() global işlevini çağırarak da bir
Vector oluşturabilirsiniz. Bu işlev, belirtilen bir nesneyi Vector örneğine dönüştürür. ActionScript, Array değişmez
sözdizimine eşdeğer olan bir Vector öğesi içermez.
Her Vector değişkeni (veya aynı şekilde bir Vector yöntemi parametresi ya da yöntem döndürme türü) bildirdiğinizde,
Vector değişkeninin taban türünü belirtirsiniz. Vector.<T>() yapıcısını çağırarak bir Vector örneği
oluşturduğunuzda, taban türünü de belirtirsiniz. Başka bir deyişle, ActionScript'te Vector terimini her
kullandığınızda, bir taban türü bu terime eşlik eder.
type parametresi sözdizimini kullanarak Vector öğesinin taban türünü belirtirsiniz. type parametresi, kodda Vector
sözcüğünden hemen sonra gelir. Bu örnekte gösterildiği gibi, bir nokta (.) ve ardından açılı ayraç (<>) içine alınmış
taban sınıfı adını içerir:
var v:Vector.<String>;
v = new Vector.<String>();
Örneğin birinci satırında, v değişkeni Vector.<String> örneği olarak bildirilir. Başka bir deyişle, bu yalnızca String
örneklerini barındırabilen bir dizinlenmiş diziyi temsil eder. İkinci satır, aynı Vector türünde bir örnek (başka bir
deyişle, öğelerinin tümü String örneği olan bir Vector) oluşturmak için Vector() yapıcısını çağırır. Bu nesneyi v
öğesine atar.
Vector.<T>() yapıcısını kullanma
Vector.<T>() yapıcısını argüman olmadan kullanırsanız, bu boş bir Vector örneği oluşturur. length özelliğini
kontrol ederek bir Vector öğesinin boş olup olmadığını test edebilirsiniz. Örneğin, şu kod, Vector.<T>() yapıcısını
argüman olmadan çağırır:
var names:Vector.<String> = new Vector.<String>();
trace(names.length); // output: 0
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 157
Dizilerle çalışma
Vector öğesinin başlangıçta kaç tane öğeye ihtiyacı olduğunu önceden bilirseniz, Vector öğesinde öğe sayısını önceden
tanımlayabilirsiniz. Belirli sayıda öğe içeren bir Vector öğesi oluşturmak için, öğe sayısını birinci parametre (length
parametresi) olarak iletin. Vector öğeleri boş olamayacağından, öğeler taban türünde örneklerle doldurulur. Taban
türü, null değerlerine izin veren bir başvuru türüyse, öğelerin tümü null değerini içerir. Aksi takdirde, öğelerin tümü
sınıfın varsayılan değerini içerir. Örneğin, bir uint değişkeni null olamaz. Sonuç olarak, aşağıdaki kod listesinde, her
biri 0 değerini içeren yedi öğeyle ages adındaki Vector öğesi oluşturulur:
var ages:Vector.<uint> = new Vector.<uint>(7);
trace(ages); // output: 0,0,0,0,0,0,0
Son olarak, Vector.<T>() yapıcısını kullanarak, ikinci parametre (fixed parametresi) için true değerini iletip sabit
uzunlukta bir Vector öğesi de oluşturabilirsiniz. Bu durumda, belirtilen öğe sayısına sahip bir Vector öğesi oluşturulur
ve öğelerin sayısı değiştirilemez. Ancak, yine de sabit uzunluktaki Vector öğelerinin değerlerini değiştirebildiğinizi
unutmayın.
Array sınıfının aksine, Vector öğesinin başlangıç değerlerini belirtmek için Vector.<T>() yapıcısına değerler listesi
iletemezsiniz.
Vector.<T>() global işlevini kullanma
Vector nesnesi oluşturmak için, Vector.<T>() yapıcısının yanı sıra, Vector.<T>() global işlevini de
kullanabilirsiniz. Vector.<T>() global işlevi bir dönüştürme işlevidir. Vector.<T>() global işlevini çağırdığınızda,
yöntemin döndürdüğü Vector öğesinin taban türünü belirtirsiniz. Argüman olarak tek bir dizinlenmiş dizi (Array
veya Vector örneği) iletirsiniz. Bu yöntem daha sonra belirtilen taban türüne sahip, kaynak dizi argümanındaki
değerleri içeren bir Vector öğesi döndürür. Aşağıdaki kod listesi, Vector.<T>() global işlevini çağırmaya yönelik
sözdizimini gösterir:
var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);
Vector.<T>() global işlevi, iki düzeyde veri türü dönüştürmesi gerçekleştirir. İlk olarak, bir Array örneği işleve
iletildiğinde, Vector örneği döndürülür. İkinci olarak, kaynak dizi bir Array veya Vector örneği de olsa, işlev kaynak
dizinin öğelerini taban türünün değerlerine dönüştürmeye çalışır. Dönüştürme, standart ActionScript veri türü
dönüştürme kurallarını kullanır. Örneğin, aşağıdaki kod listesi, kaynak Array öğesindeki String değerlerini sonuç
Vector öğesindeki tam sayılara dönüştürür. Birinci değerin ondalık kısmı ("1.5") kırpılır ve sayısal olmayan üçüncü
değer ("Waffles") sonuçta 0'a dönüştürülür:
var numbers:Vector.<int> = Vector.<int>("1.5", "17", "Waffles"]);
trace(numbers); // output: 1,17,0
Kaynak öğelerden herhangi biri dönüştürülemezse, bir hata oluşur.
Kod, Vector.<T>() global işlevini çağırdığında, kaynak dizideki bir öğe, belirtilen taban türünün alt sınıfının bir
örneğiyse, öğe sonuçta elde edilen Vector öğesine eklenir. (Herhangi bir hata oluşmaz.) Vector.<T>() global işlevinin
çağrılması, T taban türüne sahip bir Vector öğesinin, T öğesinin üst sınıfı olan bir taban türüne sahip Vector öğesine
dönüştürülmesinin tek yoludur.
Dizi öğeleri ekleme
Dizinlenmiş diziye bir öğe eklemenin en temel yolu, dizi erişimi ([]) operatörünün kullanılmasıdır. Dizinlenmiş dizi
öğesinin değerini ayarlamak için, Array veya Vector nesne adını ve atama deyiminin sol tarafındaki dizin sayısını
kullanın:
songTitles[5] = "Happy Birthday";
Array veya Vector öğesi, o dizinde bir öğe içermiyorsa, dizin oluşturulur ve değer orada saklanır. O dizinde değer
varsa, yeni değer varolan değerin yerini alır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 158
Dizilerle çalışma
Array nesnesi, herhangi bir dizinde öğe oluşturmanıza olanak sağlar. Ancak bir Vector nesnesiyle yalnızca varolan bir
dizine veya sonraki mevcut dizine değer atayabilirsiniz. Sonraki mevcut dizin, Vector nesnesinin length özelliğine
karşılık gelir. Vector nesnesine yeni bir öğe eklemenin en güvenli yolu, bu listeye benzer bir kod kullanılmasıdır:
myVector[myVector.length] = valueToAdd;
Array ve Vector sınıfı yöntemlerinin üçü (push(), unshift() ve splice()) bir dizinlenmiş diziye öğeler eklemenize
olanak sağlar. push() yöntemi bir dizinin sonuna bir veya daha fazla öğe ekler. Başka bir deyişle, push() yöntemi
kullanılarak bir diziye eklenen son öğe, en yüksek dizin numarasına sahip olacaktır. unshift() yöntemi bir dizinin
başına, her zaman 0 dizin numaralı olan bir veya birden fazla öğe ekler. splice() yöntemi dizideki belirli bir dizine
istenen sayıda öğe ekler.
Aşağıdaki örnek, bu yöntemlerin üçünü de göstermektedir. Gezegenlerin güneşe yakınlık sıralarına göre gezegenlerin
adlarını saklamak için planets adlı bir dizi oluşturulur. İlk olarak, Mars öğesini eklemek için push() yöntemi çağrılır.
Ardından dizinin önünde bulunan Mercury öğesini eklemek için unshift() yöntemi çağrılır. Son olarak Venus ve
Earth öğelerini, Mercury öğesinin arkasına Mars öğesinin önüne eklemek için splice() yöntemi çağrılır. splice()
öğesine gönderilen ilk argüman olan 1 tam sayısı, eklemenin dizin 1'den başlaması komutunu verir. splice() öğesine
gönderilen ikinci argüman olan 0 tam sayısı, herhangi bir öğenin silinmeyeceğini belirtir. Son olarak, splice()
öğesine gönderilen üçüncü ve dördüncü argümanlar olan Venus ve Earth eklenir.
var planets:Array = new Array();
planets.push("Mars"); // array contents: Mars
planets.unshift("Mercury"); // array contents: Mercury,Mars
planets.splice(1, 0, "Venus", "Earth");
trace(planets); // array contents: Mercury,Venus,Earth,Mars
push() ve unshift() yöntemleri, değiştirilen dizinin uzunluğunu temsil eden işaretsiz bir tam sayı döndürür.
splice() yöntemi, öğe eklemek için kullanıldığında boş bir dizi döndürür; bu her ne kadar garip gelse de splice()
yönteminin çok yönlülüğü göz önüne alındığında daha kolay anlaşılabilir. splice() yöntemini yalnızca bir diziye öğe
eklemek için değil ayrıca bir diziden öğe kaldırmak için de kullanabilirsiniz. splice() yöntemi, öğeleri kaldırmak için
kullanıldığında, kaldırılan öğeleri içeren bir dizi döndürür.
Not: Vector nesnesinin fixed özelliği true olursa, Vector öğesindeki toplam öğe sayısı değiştirilemez. Burada açıklanan
teknikleri kullanarak sabit uzunluktaki Vector öğesine yeni bir öğe eklemeyi denerseniz, bir hata oluşur.
Değerleri alma ve dizi öğelerini kaldırma
Dizinlenmiş diziden bir öğenin değerini almanın en basit yolu, dizi erişimi ([]) operatörünün kullanılmasıdır.
Dizinlenmiş dizi öğesinin değerini almak için, Array veya Vector nesne adını ve atama deyiminin sağ tarafındaki dizin
sayısını kullanın:
var myFavoriteSong:String = songTitles[3];
Herhangi bir öğenin bulunmadığı bir dizin kullanılarak Array veya Vector öğesinden değer almaya çalışılması
mümkündür. Bu durumda, Array nesnesi undefined değerini döndürür ve Vector öğesi bir RangeError istisnası atar.
Array ve Vector sınıfının üç yöntemi (pop(), shift() ve splice()) öğeleri kaldırmanıza olanak sağlar. pop()
yöntemi, dizinin sonundaki öğeyi kaldırır. Başka bir deyişle, en yüksek dizin numarasına sahip öğeyi kaldırır. shift()
yöntemi, dizinin başındaki öğeyi, başka bir deyişle, her zaman 0 dizin numarasına sahip olan öğeyi kaldırır. Öğe
eklemek için de kullanılabilen splice() yöntemi, yönteme gönderilen ilk argüman tarafından belirtilen dizin
numarasından başlayarak rastgele sayıda öğeyi kaldırır.
Aşağıdaki örnek, bir Array örneğinden öğe kaldırmaya yönelik üç yöntemi de kullanır. Geniş su kütlelerinin adlarını
saklamak için, oceans adında bir Array öğesi oluşturulur. Array öğesindeki adların bazıları okyanus olmayıp göl
olduğundan, bu adların kaldırılması gerekir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 159
Dizilerle çalışma
İlk olarak Aral ve Superior öğelerini kaldırmak ve Atlantic ve Indian öğelerini eklemek için splice() yöntemi
kullanılır. splice() öğesine gönderilen ilk argüman olan 2 tam sayısı, işlemin dizin 2'deki listede bulunan üçüncü
öğeden başlaması gerektiğini belirtir. İkinci argüman olan 2, iki öğenin kaldırılması gerektiğini belirtir. Kalan
argümanlar olan Atlantic ve Indian, dizin 2 konumuna eklenecek değerlerdir.
İkinci olarak, dizideki son öğe olan Huron öğesini kaldırmak için pop() yöntemi kullanılır. Üçüncü olarak da, dizideki
ilk öğe olan Victoria öğesini kaldırmak için shift() yöntemi kullanılır.
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];
oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior
oceans.pop(); // removes Huron
oceans.shift(); // removes Victoria
trace(oceans);// output: Pacific,Arctic,Atlantic,Indian
pop() ve shift() yöntemleri, kaldırılan öğeyi döndürür. Bir Array örneği için, diziler herhangi bir veri türünün
değerlerini bulundurabildiğinden, döndürülen değerin veri türü Object olur. Vector örneği için, döndürülen değerin
veri türü, Vector öğesinin taban türüdür. splice() yöntemi, kaldırılan değerleri içeren bir Array veya Vector öğesini
döndürür. Aşağıdaki örnekte gösterildiği gibi, splice() öğesine yapılan bir çağrı, döndürülen Array öğesini yeni bir
Array değişkenine atayacak şekilde oceans Array örneğini değiştirebilirsiniz:
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");
trace(lakes); // output: Aral,Superior
Bir Array nesnesi öğesinde delete operatörünü kullanan bir kodla karşılaşabilirsiniz. delete operatörü, bir Array
öğesinin değerini undefined olarak ayarlar ancak öğeyi Array öğesinden kaldırmaz. Örneğin, şu kod, oceans Array
içindeki üçüncü öğede delete operatörünü kullanır, ancak Array öğesinin uzunluğu 5 olarak kalır:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];
delete oceans[2];
trace(oceans);// output: Arctic,Pacific,,Indian,Atlantic
trace(oceans[2]); // output: undefined
trace(oceans.length); // output: 5
Bir dizinin length özelliğini kullanarak Array veya Vector öğesini kırpabilirsiniz. Dizinlenmiş dizinin length
özelliğini geçerli dizi uzunluğundan düşük bir uzunluğa ayarlarsanız, yeni length eksi 1 değerinden yüksek dizin
sayılarında saklanan öğeler kaldırılarak dizi kırpılır. Örneğin, oceans dizisi, tüm geçerli girişler dizinin başında olacak
şekilde sıralansaydı, şu kodda gösterildiği gibi, dizinin sonundaki girişleri kaldırmak için length özelliğini
kullanabilirdiniz:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];
oceans.length = 2;
trace(oceans); // output: Arctic,Pacific
Not: Vector nesnesinin fixed özelliği true olursa, Vector öğesindeki toplam öğe sayısı değiştirilemez. Burada açıklanan
teknikleri kullanarak sabit uzunluktaki Vector öğesinden bir öğeyi kaldırmayı veya söz konusu Vector öğesini kırpmayı
denerseniz, bir hata oluşur.
Diziyi sıralama
Sıralamayı düzenleyerek veya ters çevirerek dizinlenmiş dizinin sıralamasını değiştirmenize olanak sağlayan üç
yöntem vardır: reverse(), sort() ve sortOn() Bu yöntemlerin tümü, varolan diziyi değiştirir. Aşağıdaki tabloda,
bu yöntemler ve bu yöntemlerin Array ve Vector nesnelerine yönelik davranışı özetlenmektedir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 160
Dizilerle çalışma
Yöntem
Array davranışı
Vector davranışı
reverse()
Son öğe ilk öğe olacak ve sondan bir önceki öğe ikinci öğe olacak, vb.
şekilde dizinin sırasını değiştirir
Array davranışıyla aynıdır
sort()
Array içindeki öğeleri, alfabetik veya sayısal sıralama gibi önceden
tanımlı çeşitli şekillerde sıralamanıza olanak sağlar. Özel bir sıralama
algoritması da belirtebilirsiniz.
Öğeleri, belirttiğiniz özel sıralama
algoritmasına göre sıralar
sortOn()
Sıralama anahtarı olarak kullanmak üzere özellik veya özellikleri
belirterek bir veya birkaç ortak özelliğe sahip nesneleri sıralamanıza
olanak sağlar
Vector sınıfında kullanılamaz
reverse() yöntemi
reverse() yöntemi herhangi bir parametre almaz ve bir değer döndürmez, ancak dizinizin sırasını geçerli
durumundan tersi sıralamaya geçirmenizi sağlar. Şu örnek, oceans dizisinde listelenen okyanusların sırasını tersine
çevirir:
var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"];
oceans.reverse();
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic
sort() yöntemi ile temel sıralama (yalnızca Array sınıfı)
Array örneği için, sort() yöntemi, varsayılan sıralama düzenini kullanarak dizideki öğeleri yeniden düzenler.
Varsayılan sıralama düzeni şu özelliklere sahiptir:
• Sıralama büyük/küçük harf duyarlıdır, başka bir deyişle, büyük harfli karakterler küçük harfli karakterlerden önce
gelir. Örneğin, D harfi b harfinden önce gelir.
• Sıralama artan sıradadır, başka bir deyişle, düşük karakter kodları (örn. A), daha yüksek karakter kodlarından (örn.
B) önce gelir.
• Sıralama, aynı değerleri belirli bir sıralama olmaksızın birbiriyle bitiştirir.
• Sıralama dize tabanlıdır, başka bir deyişle, öğeler karşılaştırılmadan önce dizelere dönüştürülür. (Örneğin, "1"
dizesi, "3" dizesinden daha düşük karakter koduna sahip olduğundan, 10, 3'ten önce gelir.)
Büyük/küçük harf duyarlılığı olmadan veya azalan sırada dizinizi sıralamanız gerekebilir ya da dizinizde alfabetik değil
de sayısal olarak sıralamak istediğiniz sayılar bulunabilir. Array sınıfının sort() yöntemi, varsayılan sıralama
düzeninin her bir özelliğini değiştirmenize olanak sağlayan bir options parametresine sahiptir. Bu seçenekler,
aşağıdaki listede gösterildiği gibi, Array sınıfındaki statik sabitler kümesiyle tanımlanır:
•
Array.CASEINSENSITIVE: Bu seçenek, sıralamanın büyük/küçük harf duyarlı olmasını önler. Örneğin, küçük b
harfi, büyük D harfinden önce gelir.
•
Array.DESCENDING: Bu seçenek, varsayılan artan sıralamayı ters çevirir. Örneğin, B harfi A harfinden önce gelir.
•
Array.UNIQUESORT: Bu seçenek, iki aynı değer bulunduğunda sıralamanın durdurulmasına neden olur.
•
Array.NUMERIC: Bu seçenek sayısal sıralama sağlar, böylece 3, 10 sayısından önce gelir.
Aşağıdaki örnek, bu seçeneklerden bazılarını vurgular. Birçok farklı seçenek kullanılarak sıralanan poets adında bir
Array öğesi oluşturulur.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 161
Dizilerle çalışma
var poets:Array = ["Blake", "cummings", "Angelou", "Dante"];
poets.sort(); // default sort
trace(poets); // output: Angelou,Blake,Dante,cummings
poets.sort(Array.CASEINSENSITIVE);
trace(poets); // output: Angelou,Blake,cummings,Dante
poets.sort(Array.DESCENDING);
trace(poets); // output: cummings,Dante,Blake,Angelou
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options
trace(poets); // output: Dante,cummings,Blake,Angelou
sort() yöntemiyle özel sıralama (Array ve Vector sınıfları)
Array nesnesi için kullanılabilir olan temel sıralamaya ek olarak, özel bir sıralama kuralı da tanımlayabilirsiniz. Bu
teknik, Vector sınıfı için kullanılabilir olan tek sort() yöntemi biçimidir. Özel bir sıralama tanımlamak için, özel bir
sıralama işlevi yazıp bunu argüman olarak sort() yöntemine iletirsiniz.
Örneğin, her liste öğesinde kişinin tam adının bulunduğu bir ad listeniz varsa ve listeyi soyadına göre sıralamak
istiyorsanız, her bir öğeyi ayrıştırmak için özel bir sıralama işlevi kullanmanız ve sıralama işlevinde soyadını
kullanmanız gerekir. Aşağıdaki kod, Array.sort() yöntemine yönelik bir parametre olarak kullanılan özel bir işlevle
bunun nasıl yapılabileceğini gösterir:
var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones");
function orderLastName(a, b):int
{
var lastName:RegExp = /\b\S+$/;
var name1 = a.match(lastName);
var name2 = b.match(lastName);
if (name1 < name2)
{
return -1;
}
else if (name1 > name2)
{
return 1;
}
else
{
return 0;
}
}
trace(names); // output: John Q. Smith,Jane Doe,Mike Jones
names.sort(orderLastName);
trace(names); // output: Jane Doe,Mike Jones,John Q. Smith
orderLastName() özel sıralama işlevi, karşılaştırma işlemi için kullanılmak üzere her bir öğeden soyadını ayıklamak
için normal bir ifade kullanır. orderLastName işlev tanımlayıcısı, names dizisinde sort() yöntemi çağrılırken tek
parametre olarak kullanılır. Sıralama işlevi aynı ada iki dizi öğesinde çalıştığından, a ve b olmak üzere iki parametreyi
kabul eder. Sıralama işlevinin döndürme değeri, öğelerin nasıl sıralanması gerektiğini belirtir:
• -1 döndürme değeri, birinci parametrenin (a) ikinci parametreden (b) önce geldiğini belirtir.
• 1 döndürme değeri, ikinci parametrenin (b) birinci parametreden (a) önce geldiğini belirtir.
• 0 döndürme değeri, öğelerin eşit sıralama önceliğine sahip olduğunu belirtir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 162
Dizilerle çalışma
sortOn() yöntemi (yalnızca Array sınıfı)
sortOn() yöntemi, nesneleri içeren öğelerin bulunduğu Array nesneleri için tasarlanmıştır. Bu nesnelerde, sıralama
anahtarı olarak kullanılabilecek en az bir ortak özelliğin bulunması beklenir. Başka herhangi bir türdeki dizi için
sortOn() yönteminin kullanılması beklenmeyen sonuçlara yol açar.
Not: Vector sınıfı, sortOn() yöntemini içermez. Bu yöntem yalnızca Array nesneleri için kullanılabilir.
Aşağıdaki örnek, her bir öğe dize değil de nesne olacak şekilde poets Array öğesini değiştirir. Her nesne, şairin
soyadını ve doğum yılını içerir.
var poets:Array = new Array();
poets.push({name:"Angelou", born:"1928"});
poets.push({name:"Blake", born:"1757"});
poets.push({name:"cummings", born:"1894"});
poets.push({name:"Dante", born:"1265"});
poets.push({name:"Wang", born:"701"});
Array öğesini born özelliğine göre sıralamak için sortOn() yöntemini kullanabilirsiniz. sortOn() yöntemi şu iki
parametreyi tanımlar: fieldName ve options. fieldName argümanının dize olarak belirtilmesi gerekir. Aşağıdaki
örnekte, sortOn() öğesi "born" ve Array.NUMERIC olmak üzere iki argümanla çağrılır. Sıralamanın alfabetik değil
sayısal olarak yapılmasını sağlamak için Array.NUMERIC argümanı kullanılır. Diziye daha az veya daha çok basamaklı
bir sayı da eklense sıralamanın beklendiği gibi davranacağı kesin olduğundan, tüm sayılar aynı sayıda basamak içerse
de bu iyi bir uygulamadır.
poets.sortOn("born", Array.NUMERIC);
for (var i:int = 0; i < poets.length; ++i)
{
trace(poets[i].name, poets[i].born);
}
/* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/
Orijinal diziyi değiştirmeden sıralama (yalnızca Array sınıfı)
Genellikle, sort() ve sortOn() yöntemleri bir Array öğesini değiştirir. Varolan diziyi değiştirmeden Array öğesini
sıralamak isterseniz, options parametresinin parçası olarak Array.RETURNINDEXEDARRAY sabitini iletin. Bu seçenek,
sıralamayı yansıtan yeni bir Array öğesi döndürmesini ve orijinal Array öğesini olduğu gibi bırakmasını yöntemlere
bildirir. Yöntemler tarafından döndürülen Array öğesi, yeni sıralama düzenini yansıtan basit bir dizin sayıları Array
öğesi olup orijinal Array içindeki öğeleri içermez. Örneğin, Array öğesini değiştirmeden poets Array öğesini doğum
yılına göre sıralamak için, options parametresi için iletilen argümanın parçası olarak Array.RETURNINDEXEDARRAY
sabitini dahil edin.
Aşağıdaki örnek, döndürülen dizin bilgilerini indices adında bir Array öğesinde saklar ve şairleri doğum yılına göre
sıralanmış şekilde vermek için, indices dizisini değiştirilmemiş poets dizisiyle birlikte kullanır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 163
Dizilerle çalışma
var indices:Array;
indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY);
for (var i:int = 0; i < indices.length; ++i)
{
var index:int = indices[i];
trace(poets[index].name, poets[index].born);
}
/* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/
Diziyi sorgulama
Array ve Vector sınıfının dört yönteminin tümü (concat(), join(), slice() ve toString()) bilgi için diziyi
sorgular ancak diziyi değiştirmez. concat() ve slice() yöntemleri yeni diziler döndürürken, join() ve toString()
yöntemleri de dize döndürür. concat() yöntemi, argüman olarak yeni bir diziyi veya öğeler listesini alır ve yeni bir
dizi oluşturmak için bunları varolan diziyle birleştirir. slice() yöntemi, startIndex ve endIndex adında iki
parametre içerir ve varolan diziden "dilimli" öğelerin bir kopyasını içeren yeni bir dizi döndürür. Dilim, startIndex
parametresindeki öğeyle başlar ve endIndex parametresinden hemen önceki öğeyle sona erer. Şunu yinelemekte fayda
var: endIndex parametresindeki öğe, döndürme değerine dahil edilmez.
Aşağıdaki örnek, diğer dizilerin öğelerini kullanarak yeni diziler oluşturmak için concat() ve slice() öğelerini
kullanır:
var array1:Array = ["alpha", "beta"];
var array2:Array = array1.concat("gamma", "delta");
trace(array2); // output: alpha,beta,gamma,delta
var array3:Array = array1.concat(array2);
trace(array3); // output: alpha,beta,alpha,beta,gamma,delta
var array4:Array = array3.slice(2,5);
trace(array4); // output: alpha,beta,gamma
Diziyi sorgulayıp dizinin içeriklerini dize olarak döndürmek için join() ve toString() yöntemlerini
kullanabilirsiniz. join() yöntemi için herhangi bir parametre kullanılmıyorsa, iki yöntem de aynı şekilde hareket
ederek dizideki tüm öğelerin virgül sınırlı listesini içeren bir dize döndürür. join() yöntemi, toString()
yönteminden farklı olarak, döndürülen dizedeki her öğe arasında ayırıcı olarak kullanılacak sembolü seçmenizi
sağlayan delimiter adında bir parametreyi kabul eder.
Aşağıdaki örnek, rivers adında bir Array öğesi oluşturur ve Array öğesindeki değerleri dize olarak döndürmek için
hem join() hem de toString() öğelerini çağırır. toString() yöntemi virgül sınırlı değerler (riverCSV)
döndürmek için kullanılırken, join() yöntemi + karakteriyle ayrılmış değerler döndürmek için kullanılır.
var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"];
var riverCSV:String = rivers.toString();
trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi
var riverPSV:String = rivers.join("+");
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 164
Dizilerle çalışma
join() yöntemiyle ilgili bilinmesi gereken bir nokta, aşağıdaki örnekte gösterildiği gibi, ana dizi öğeleri için hangi
ayırıcıyı belirttiğinize bakılmaksızın, yuvalanmış Array veya Vector örneklerinin her zaman virgülle ayrılmış
değerlerle döndürülmesidir:
var nested:Array = ["b","c","d"];
var letters:Array = ["a",nested,"e"];
var joined:String = letters.join("+");
trace(joined); // output: a+b,c,d+e
İlişkilendirilebilir diziler
Bazen karma veya eşleme olarak da adlandırılan ilişkilendirilebilir bir dizi, saklanan değerleri organize etmek için
sayısal bir dizin yerine anahtarları kullanır. İlişkilendirilebilir bir dizideki her anahtar, saklanan değere erişmek için
kullanılan benzersiz bir dizedir. İlişkilendirilebilir bir dizi, Object sınıfının bir örneği olup bu, her anahtarın bir özellik
adına karşılık geldiği anlamına gelir. İlişkilendirilebilir diziler, anahtar ve değer çiftlerinin sıralanmamış
koleksiyonlarıdır. Kodunuzun belirli bir sırada olması için ilişkilendirilebilir dizinin anahtarlarını beklememesi
gerekir.
ActionScript 3.0, sözlük adında gelişmiş bir ilişkilendirilebilir dizi türünü de içerir. flash.utils paketinde Dictionary
sınıfının örnekleri olan sözlükler, herhangi bir veri türündeki anahtarları kullanır. Başka bir deyişle, sözlük anahtarları,
String türünün değerleriyle sınırlı değildir.
Dize anahtarları ile ilişkilendirilebilir diziler
ActionScript 3.0'da ilişkilendirilebilir dizi oluşturmanın iki yolu vardır. Birinci yol, Object örneği kullanılmasıdır.
Object örneği kullanarak, bir nesne değişmeziyle dizinizi başlatabilirsiniz. Object sınıfının genel nesne olarak da
adlandırılan bir örneği, ilişkilendirilebilir bir diziyle aynı işleve sahiptir. Genel nesnenin özellik adlarının her biri,
saklanan değere erişilmesini sağlayan bir anahtar görevi görür.
Aşağıdaki örnek, iki anahtar ve değer çiftiyle diziyi başlatmak için bir nesne değişmezi kullanan, monitorInfo adında
ilişkilendirilebilir bir dizi oluşturur:
var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"};
trace(monitorInfo["type"], monitorInfo["resolution"]);
// output: Flat Panel 1600 x 1200
Bildirim zamanında diziyi başlatmanız gerekmiyorsa, diziyi oluşturmak için Object yapıcısını şu şekilde
kullanabilirsiniz:
var monitorInfo:Object = new Object();
Bir nesne değişmezi veya Object sınıfı yapıcısı kullanılarak dizi oluşturulduktan sonra, dizi erişimi ([]) operatörünü
veya nokta operatörünü (.) kullanarak diziye yeni değerler ekleyebilirsiniz. Aşağıdaki örnek, monitorArray öğesine
iki yeni değer ekler:
monitorInfo["aspect ratio"] = "16:10"; // bad form, do not use spaces
monitorInfo.colors = "16.7 million";
trace(monitorInfo["aspect ratio"], monitorInfo.colors);
// output: 16:10 16.7 million
aspect ratio adındaki anahtarın bir boşluk karakteri içerdiğini unutmayın. Bu, dizi erişimi ([]) operatörüyle
mümkün olsa da, nokta operatörüyle denendiğinde hataya yol açar. Anahtar adlarınızda boşluk kullanılması
önerilmez.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 165
Dizilerle çalışma
İlişkilendirilebilir bir dizi oluşturmanın ikinci yolu, Array yapıcısı (veya herhangi bir dinamik sınıf yapıcısı)
kullanıldıktan sonra diziye anahtar ve değer çiftleri eklemek için dizi erişimi ([]) operatörünün veya nokta
operatörünün (.) kullanılmasıdır. İlişkilendirilebilir dizinizin Array türünde olmasını bildirirseniz, diziyi başlatmak
için bir nesne değişmezi kullanamazsınız. Aşağıdaki örnek, Array yapıcısını kullanarak monitorInfo adında
ilişkilendirilebilir bir dizi oluşturur ve type adında bir anahtar ile resolution adında bir anahtarı değerleriyle birlikte
ekler:
var monitorInfo:Array = new Array();
monitorInfo["type"] = "Flat Panel";
monitorInfo["resolution"] = "1600 x 1200";
trace(monitorInfo["type"], monitorInfo["resolution"]);
// output: Flat Panel 1600 x 1200
İlişkilendirilebilir bir dizi oluşturmak için Array yapıcısının kullanılması herhangi bir avantaj sağlamaz. Array
yapıcısını veya Array veri türünü kullanıyor olsanız da, ilişkilendirilebilir dizilerle Array.length özelliğini veya Array
sınıfı yöntemlerinden herhangi birini kullanamazsınız. Dizinlenmiş diziler oluşturmanın en iyi yolu Array yapıcısının
kullanılmasıdır.
Nesne anahtarları ile ilişkilendirilebilir diziler (Sözlükler)
Anahtarlar için dize yerine nesne kullanan ilişkilendirilebilir bir dizi oluşturmak üzere Dictionary sınıfını
kullanabilirsiniz. Bu diziler bazen sözlük, karma veya eşleme olarak adlandırılır. Örneğin, belirli bir konteynerle
ilişkisini esas alarak bir Sprite nesnesinin konumunu belirleyen bir uygulamayı göz önünde bulundurun. Sprite
nesnelerinin her birini bir konteynere eşlemek için Dictionary nesnesini kullanabilirsiniz.
Aşağıdaki kod, Dictionary nesnesi için anahtar görevi gören üç Sprite sınıfı örneği oluşturur. Her anahtara GroupA
veya GroupB değeri atanır. Değerler herhangi bir veri türünde olabilir ancak bu örnekte hem GroupA hem de GroupB,
Object sınıfının örnekleridir. Daha sonra, aşağıdaki kodda gösterildiği gibi, dizi erişimi ([]) operatörü ile anahtarların
her biriyle ilişkilendirilmiş değere erişebilirsiniz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 166
Dizilerle çalışma
import flash.display.Sprite;
import flash.utils.Dictionary;
var groupMap:Dictionary = new Dictionary();
// objects to use
var spr1:Sprite =
var spr2:Sprite =
var spr3:Sprite =
as keys
new Sprite();
new Sprite();
new Sprite();
// objects to use as values
var groupA:Object = new Object();
var groupB:Object = new Object();
// Create new key-value pairs in dictionary.
groupMap[spr1] = groupA;
groupMap[spr2] = groupB;
groupMap[spr3] = groupB;
if (groupMap[spr1]
{
trace("spr1 is
}
if (groupMap[spr2]
{
trace("spr2 is
}
if (groupMap[spr3]
{
trace("spr3 is
}
== groupA)
in groupA");
== groupB)
in groupB");
== groupB)
in groupB");
Nesne anahtarlarıyla yineleme
for..in döngüsü veya for each..in döngüsü ile Dictionary nesnesinin içeriklerini yineleyebilirsiniz. for..in
döngüsü, anahtarları esas alarak yineleme yapmanızı sağlarken, for each..in döngüsü, her bir anahtarla
ilişkilendirilmiş değerleri esas alarak yineleme yapmanıza olanak sağlar.
Dictionary nesnesinin nesne anahtarlarına doğrudan erişmek için for..in döngüsünü kullanın. Dizi erişimi ([])
operatörüyle Dictionary nesnesinin değerlerine de erişebilirsiniz. Aşağıdaki kod, önceki groupMap sözlüğü örneğini
kullanarak, for..in döngüsü ile Dictionary nesnesinin nasıl yinelendiğini gösterir:
for (var key:Object in groupMap)
{
trace(key, groupMap[key]);
}
/* output:
[object Sprite] [object Object]
[object Sprite] [object Object]
[object Sprite] [object Object]
*/
Dictionary nesnesinin değerlerine doğrudan erişmek için for each..in döngüsünü kullanın. Aşağıdaki kod, ayrıca
groupMap sözlüğünü kullanarak, for each..in döngüsü ile Dictionary nesnesinin nasıl yinelendiğini gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 167
Dizilerle çalışma
for each (var item:Object in groupMap)
{
trace(item);
}
/* output:
[object Object]
[object Object]
[object Object]
*/
Nesne anahtarları ve bellek yönetimi
Adobe® Flash® Player ve Adobe® AIR™, artık kullanılmayan belleği kurtarmak için bir çöp toplama sistemi kullanır. Bir
nesne kendisini işaret eden bir başvuru içermiyorsa, nesne çöp toplama için uygun hale gelmiş demektir ve çöp
toplama sistemi tekrar çalıştırıldığında bellek kurtarılır. Örneğin, aşağıdaki kod yeni bir nesne oluşturur ve o nesnenin
başvurusunu myObject değişkenine atar:
var myObject:Object = new Object();
Nesneyi işaret eden bir başvuru olduğu sürece, çöp toplama sistemi nesnenin kapladığı belleği kurtarmaz. myObject
değeri, farklı bir nesneyi işaret edecek şekilde değiştirilirse veya null değerine ayarlanırsa, yalnızca orijinal nesneyi
işaret eden başka bir başvuru olmaması durumunda orijinal nesnenin kapladığı bellek çöp toplama işlemi için uygun
hale gelir.
myObject öğesini Dictionary nesnesinde bir anahtar olarak kullanırsanız, orijinal nesneyi işaret eden başka bir
başvuru oluşturuyor olursunuz. Örneğin, şu kod, myObject değişkeni ve myMap nesnesindeki anahtar olmak üzere, bir
nesneye iki başvuru oluşturur:
import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary();
myMap[myObject] = "foo";
myObject tarafından başvurulan nesneyi çöp toplama işlemi için uygun hale getirmek istiyorsanız, bu nesneyi işaret
eden tüm başvuruları kaldırmanız gerekir. Bu durumda, aşağıdaki kodda gösterildiği gibi, myObject öğesinin değerini
değiştirmeniz ve myMap öğesinden myObject anahtarını silmeniz gerekir:
myObject = null;
delete myMap[myObject];
Alternatif olarak, tüm sözlük anahtarlarını zayıf başvurular haline getirmek için, Dictionary useWeakReference
parametresini kullanabilirsiniz. Çöp toplama sistemi, zayıf başvuruları yoksayar, başka bir deyişle, yalnızca zayıf
başvurular içeren bir nesne de çöp toplama işlemi için uygundur. Örneğin, aşağıdaki kodda, nesneyi çöp toplama
işlemi için uygun hale getirmek üzere myMap öğesinden myObject anahtarını silmeniz gerekmez:
import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary(true);
myMap[myObject] = "foo";
myObject = null; // Make object eligible for garbage collection.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 168
Dizilerle çalışma
Çok boyutlu diziler
Çok boyutlu diziler öğe olarak başka diziler içerir Örneğin, dizinlenmiş dizeler dizisi olarak saklanan bir görev listesini
göz önünde bulundurun:
var tasks:Array = ["wash dishes", "take out trash"];
Haftanın her günü için ayrı bir görevler listesi saklamak istiyorsanız, haftanın her günü için tek bir öğe içeren çok
boyutlu bir dizi oluşturabilirsiniz. Her öğe, görevler listesinin saklandığı tasks dizisine benzer şekilde dizinlenmiş bir
dizi içerir. Çok boyutlu dizilerde, dizinlenmiş veya ilişkilendirilebilir dizilerin herhangi bir birleşimini
kullanabilirsiniz. Aşağıdaki bölümlerde verilen örnekler, iki dizinlenmiş dizi veya dizinlenmiş dizilerin
ilişkilendirilebilir bir dizisini kullanır. Pratik amacıyla diğer birleşimleri de denemek isteyebilirsiniz.
İki dizinlenmiş dizi
İki dizinlenmiş dizi kullandığınızda, sonucu bir tablo veya elektronik tablo olarak görselleştirebilirsiniz. Birinci dizinin
öğeleri, tablonun satırlarını temsil ederken, ikinci dizinin öğeleri de sütunları temsil eder.
Örneğin, aşağıdaki çok boyutlu dizi, haftanın her bir günü için görev listelerini izlemek üzere iki dizinlenmiş dizi
kullanır. Array sınıfı yapıcısı kullanılarak birinci dizi (masterTaskList) oluşturulur. 0 değeri Pazartesi'yi ve 6 değeri
Pazar'ı temsil edecek şekilde, dizinin her bir öğesi haftanın bir gününü temsil eder. Bu öğeler, tablodaki satırlar olarak
değerlendirilebilir. masterTaskList dizisinde oluşturduğunu yedi öğenin her birine bir dizi değişmezi atayarak her
günün görevini oluşturabilirsiniz. Dizi değişmezleri, tablodaki sütunları temsil eder.
var masterTaskList:Array = new Array();
masterTaskList[0] = ["wash dishes", "take out trash"];
masterTaskList[1] = ["wash dishes", "pay bills"];
masterTaskList[2] = ["wash dishes", "dentist", "wash dog"];
masterTaskList[3] = ["wash dishes"];
masterTaskList[4] = ["wash dishes", "clean house"];
masterTaskList[5] = ["wash dishes", "wash car", "pay rent"];
masterTaskList[6] = ["mow lawn", "fix chair"];
Dizi erişimi ([]) operatörünü kullanarak görev listelerinden herhangi birinde bulunan tek tek öğelere erişebilirsiniz.
Birinci ayraç kümesi haftanın gününü temsil ederken, ikinci ayraç kümesi de o günün görev listesini temsil eder.
Örneğin, ikinci görevi Çarşamba'nın listesinden almak üzere Çarşamba için dizin 2'yi ve listedeki ikinci görev için
dizin 1'i kullanın.
trace(masterTaskList[2][1]); // output: dentist
Birinci görevi Pazar'ın listesinden almak üzere Pazar için dizin 6'yı ve listedeki birinci görev için dizin 0'ı kullanın.
trace(masterTaskList[6][0]); // output: mow lawn
Dizinlenmiş bir dizi ile ilişkilendirilebilir dizi
Tek tek dizileri daha kolay erişilebilir duruma getirmek üzere haftanın günleri için ilişkilendirilebilir bir dizi ve görev
listeleri için dizinlenmiş bir dizi kullanabilirsiniz. İlişkilendirilebilir bir dizi kullanılması, haftanın belirli bir günü ifade
edilirken nokta sözdizimini kullanmanıza olanak sağlar ancak bu durumda ilişkilendirilebilir dizinin her bir öğesine
erişmek için fazladan çalışma zamanı işleme maliyeti oluşur. Aşağıdaki örnek, haftanın her bir günü için bir anahtar
ve değer çiftiyle, bir görev listesinin temeli olarak ilişkilendirilebilir bir dizi kullanır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 169
Dizilerle çalışma
var masterTaskList:Object = new Object();
masterTaskList["Monday"] = ["wash dishes", "take out trash"];
masterTaskList["Tuesday"] = ["wash dishes", "pay bills"];
masterTaskList["Wednesday"] = ["wash dishes", "dentist", "wash dog"];
masterTaskList["Thursday"] = ["wash dishes"];
masterTaskList["Friday"] = ["wash dishes", "clean house"];
masterTaskList["Saturday"] = ["wash dishes", "wash car", "pay rent"];
masterTaskList["Sunday"] = ["mow lawn", "fix chair"];
Nokta sözdizimi, birden çok ayraç kümesinin önlenmesini sağlayarak kodu daha okunaklı hale getirir.
trace(masterTaskList.Wednesday[1]); // output: dentist
trace(masterTaskList.Sunday[0]);// output: mow lawn
for..in döngüsünü kullanarak görev listesini yineleyebilirsiniz, ancak her bir anahtarla ilişkilendirilmiş değere
erişmek için nokta sözdizimi yerine dizi erişimi ([]) operatörünü kullanmanız gerekir. masterTaskList öğesi
ilişkilendirilebilir bir dizi olduğundan, aşağıdaki örnekte gösterildiği gibi, öğeler mutlaka beklediğiniz sırada
alınmayabilir:
for (var day:String in masterTaskList)
{
trace(day + ": " + masterTaskList[day])
}
/* output:
Sunday: mow lawn,fix chair
Wednesday: wash dishes,dentist,wash dog
Friday: wash dishes,clean house
Thursday: wash dishes
Monday: wash dishes,take out trash
Saturday: wash dishes,wash car,pay rent
Tuesday: wash dishes,pay bills
*/
Dizileri klonlama
Array sınıfı, dizilerin kopyasının oluşturulmasına yönelik yerleşik bir yöntem içermez. Herhangi bir argüman
olmadan concat() veya slice() yöntemlerinden birini çağırarak bir dizinin basitkopyasını oluşturabilirsiniz. Basit
kopyada, orijinal dizi, nesne olan öğeler içeriyorsa, nesnelerin kendisi değil yalnızca nesnelerin başvuruları kopyalanır.
Kopya, orijinallerle aynı nesneleri işaret eder. Nesneler üzerinde yapılan tüm değişiklikler her iki dizide de yansıtılır.
Kapsamlı kopyada, orijinal dizide bulunan tüm nesneler de kopyalanır ve böylece yeni dizi, orijinal diziyle aynı
nesneleri işaret etmez. Kapsamlı kopyalamada, genellikle bir işlevin oluşturulması için çağrı yapan birden çok kod
satırı gerekir. Bu tür bir işlev, genel bir yardımcı program işlevi olarak veya Array alt sınıfının bir yöntemi olarak
oluşturulabilir.
Aşağıdaki örnek, kapsamlı kopyalama yapan clone() adında bir işlevi tanımlar. Algoritma, ortak bir Java
programlama tekniğinden alınmıştır. Bu işlev, diziyi bir ByteArray sınıfı örneğine serileştirip sonra diziyi geri yeni bir
diziye okuyarak kapsamlı bir kopya oluşturur. Bu işlev, aşağıdaki kodda gösterildiği gibi, hem dizinlenmiş dizilerle
hem ilişkilendirilebilir dizilerle kullanılabilecek şekilde bir nesneyi kabul eder:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 170
Dizilerle çalışma
import flash.utils.ByteArray;
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
Gelişmiş başlıklar
Array sınıfını genişletme
Array sınıfı, son olmayan birkaç çekirdek sınıftan biridir, başka bir deyişle, kendi Array alt sınıflarınızı
oluşturabilirsiniz. Bu bölüm, Array alt sınıfının nasıl oluşturulacağını gösteren bir örnek sağlar ve işlem sırasında
ortaya çıkabilecek bazı sorunları ele alır.
Önceden de belirtildiği gibi, ActionScript'teki diziler türlenmiş değildir ancak yalnızca belirli bir veri türündeki öğeleri
kabul eden bir Array alt sınıfı oluşturabilirsiniz. Aşağıdaki bölümlerde verilen örnek, öğelerini birinci parametrede
belirtilen veri türünün değerleriyle sınırlandıran TypedArray adında bir Array alt sınıfını tanımlar. TypedArray sınıfı
yalnızca Array sınıfının nasıl genişletildiğini gösteren bir örnek olarak sunulmuş olup birçok nedenden dolayı üretim
amaçları için uygun olmayabilir. İlk olarak, tür denetleme, derleme zamanında değil çalışma zamanında gerçekleşir.
İkinci olarak, yöntemler istisna atacak şekilde kolayca değiştirilebilse de, TypedArray yöntemi bir uyuşmazlıkla
karşılaştığında uyuşmazlık yoksayılır ve herhangi bir istisna atılmaz. Üçüncü olarak, sınıf, herhangi bir türdeki
değerleri diziye eklemek için dizi erişimi operatörünün kullanılmasını önleyemez. Dördüncü olarak, kodlama stili,
basitliği performans eniyileştirmesinden daha üstün tutar.
Not: Türlenmiş dizi oluşturmak için burada açıklanan tekniği kullanabilirsiniz. Ancak, Vector nesnesinin kullanılması
daha iyi bir yaklaşım olacaktır. Vector örneği gerçek bir türlenmiş dizi olup Array sınıfına veya herhangi bir alt sınıfa
göre daha yüksek performans ve iyileştirmeler sağlar. Bu açıklamanın amacı, Array alt sınıfının nasıl oluşturulduğunu
göstermektir.
Alt sınıfı bildirme
Sınıfın bir Array alt sınıfı olduğunu belirtmek için extends anahtar sözcüğünü kullanın. Array alt sınıfının, Array
sınıfı gibi dynamic niteliğini kullanması gerekir. Aksi takdirde, alt sınıfınız düzgün çalışmaz.
Aşağıdaki kod, veri türünü barındıran bir sabiti, yapıcı yöntemini ve diziye öğe ekleyebilen dört yöntemi içeren
TypedArray sınıfının tanımını gösterir. Her yöntemin kodu bu örnekte çıkarılmıştır ancak ilerleyen bölümlerde ele
alınıp kapsamlı şekilde açıklanacaktır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 171
Dizilerle çalışma
public dynamic class TypedArray extends Array
{
private const dataType:Class;
public function TypedArray(...args) {}
AS3 override function concat(...args):Array {}
AS3 override function push(...args):uint {}
AS3 override function splice(...args) {}
AS3 override function unshift(...args):uint {}
}
Bu örnek, -as3 derleyici seçeneğinin true değerine ve -es derleyici seçeneğinin false değerine ayarlandığını
varsaydığından, geçersiz kılınan dört yöntem de public niteliği yerine AS3 ad alanını kullanır. Adobe Flex Builder 3
ve Adobe® Flash® CS4 Professional için varsayılan ayarlar bunlardır. Daha fazla bilgi için, bkz. “AS3 ad alanı” sayfa 120.
Prototip miras kullanmayı tercih eden ileri düzey bir geliştiriciyseniz, -es derleyici seçeneği true değerine
ayarlanmış şekilde TypedArray sınıfını derlemek için bu sınıf üzerinde iki küçük değişiklik yapabilirsiniz. İlk olarak,
tüm override niteliklerini kaldırın ve AS3 ad alanını public niteliğiyle değiştirin. İkinci olarak, Array.prototype
öğesini dört super öğesinin yerine yedek olarak kullanın.
TypedArray yapıcısı
Yapıcının rastgele uzunluktaki argümanlar listesini kabul etmesi gerektiğinden, alt sınıf yapıcısı ilginç bir zorluk
ortaya çıkarır. Dizi oluşturmak için argümanların üst yapıcıya iletilme şekli zorluk yaratır. Argümanlar listesini dizi
olarak iletirseniz, üst yapıcı bunu Array türünde tek bir argüman olarak değerlendirir ve sonuçta elde edilen sizi her
zaman 1 öğe uzunluktadır. Doğrudan geçiş argümanı listeleri, geleneksel olarak Function.apply() yöntemi
kullanılarak işlenir. Bu yöntem, argümanlar dizisini ikinci parametre olarak alır ancak işlevi çalıştırırken bunu bir
argümanlar dizisine dönüştürür. Ne yazık ki, Function.apply() yöntemi yapıcılarla kullanılamaz.
Kalan tek seçenek, TypedArray yapıcısında Array yapıcısının mantığını yeniden oluşturmaktır. Aşağıdaki kod, Array
sınıfı yapıcısında kullanılan algoritmayı gösterir; bu algoritmayı Array alt sınıfı yapıcınızda yeniden kullanabilirsiniz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 172
Dizilerle çalışma
public dynamic class Array
{
public function Array(...args)
{
var n:uint = args.length
if (n == 1 && (args[0] is Number))
{
var dlen:Number = args[0];
var ulen:uint = dlen;
if (ulen != dlen)
{
throw new RangeError("Array index is not a 32-bit unsigned integer ("+dlen+")");
}
length = ulen;
}
else
{
length = n;
for (var i:int=0; i < n; i++)
{
this[i] = args[i]
}
}
}
}
TypedArray yapıcısı, kod üzerinde yalnızca dört değişiklikle Array yapıcısındaki kodun büyük bir kısmını paylaşır. İlk
olarak parametre listesi, dizinin veri türünün belirtimine olanak sağlayan yeni bir gerekli Class türü parametresini
içerir. İkinci olarak, yapıcıya iletilen veri türü, dataType değişkenine atanır. Üçüncü olarak, else deyiminde, for
döngüsünden sonra length özelliğinin değeri atanır, böylece length yalnızca uygun türdeki argümanları içerir.
Dördüncü olarak, for döngüsünün gövdesi push() yönteminin geçersiz kılınmış sürümünü kullanır, böylece yalnızca
doğru veri türündeki argümanlar diziye eklenir. Aşağıdaki örnek, TypedArray yapıcı işlevini gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 173
Dizilerle çalışma
public dynamic class TypedArray extends Array
{
private var dataType:Class;
public function TypedArray(typeParam:Class, ...args)
{
dataType = typeParam;
var n:uint = args.length
if (n == 1 && (args[0] is Number))
{
var dlen:Number = args[0];
var ulen:uint = dlen
if (ulen != dlen)
{
throw new RangeError("Array index is not a 32-bit unsigned integer ("+dlen+")")
}
length = ulen;
}
else
{
for (var i:int=0; i < n; i++)
{
// type check done in push()
this.push(args[i])
}
length = this.length;
}
}
}
TypedArray geçersiz kılınmış yöntemler
TypedArray sınıfı, bir diziye öğe ekleyebilen Array sınıfının dört yöntemini geçersiz kılar. Her durumda, geçersiz
kılınan yöntem, doğru veri türünde olmayan öğelerin eklenmesini önleyen bir tür denetimi ekler. Sonra da her yöntem
kendisinin üst sınıf sürümünü çağırır.
push() yöntemi bir for..in döngüsüyle argümanlar listesini yineler ve her argümanda tür denetimi gerçekleştirir.
Doğru veri türünde olmayan tüm argümanlar, splice() yöntemiyle args dizisinden kaldırılır. for..in döngüsü
sona erdikten sonra, args dizisi yalnızca dataType türündeki değerleri içerir. Daha sonra, aşağıdaki kodun gösterdiği
gibi, güncellenmiş args dizisiyle push() öğesinin üst sınıf sürümü çağrılır:
AS3 override function push(...args):uint
{
for (var i:* in args)
{
if (!(args[i] is dataType))
{
args.splice(i,1);
}
}
return (super.push.apply(this, args));
}
concat() yöntemi, tür denetiminden geçen argümanları saklamak için passArgs adında geçici bir TypedArray
oluşturur. Bu, push() yönteminde bulunan tür denetimi kodunun yeniden kullanılmasına olanak sağlar. for..in
döngüsü, args dizisini yineler ve her argümanda push() öğesini çağırır. passArgs öğesi TypedArray olarak türlenmiş
olduğundan, push() öğesinin TypedArray sürümü çalıştırılır. Daha sonra concat() yöntemi, aşağıdaki kodun
gösterdiği gibi, kendi üst sınıf sürümünü çağırır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 174
Dizilerle çalışma
AS3 override function concat(...args):Array
{
var passArgs:TypedArray = new TypedArray(dataType);
for (var i:* in args)
{
// type check done in push()
passArgs.push(args[i]);
}
return (super.concat.apply(this, passArgs));
}
splice() yöntemi, argümanların rastgele bir listesini alır ancak ilk iki argüman her zaman bir dizin sayısını ve
silinecek öğe sayısını ifade eder. Geçersiz kılınmış splice() yönteminin yalnızca dizin konumu 2 veya daha
yukarısındaki args dizi öğeleri için tür denetimi yapmasının nedeni de budur. Koddaki ilgi çekici bir nokta da, for
döngüsü içinde splice() öğesine yinelemeli çağrı yapıldığı halde, args öğesi TypedArray değil de Array türünde
olduğundan, başka bir deyişle, args.splice() öğesine yapılan çağrı, yöntemin üst sınıf sürümüne yapılan bir çağrı
olduğundan, bunun yinelemeli bir çağrı olmamasıdır. for..in döngüsü tamamlandıktan sonra, aşağıdaki kodda
gösterildiği gibi, args dizisi yalnızca 2 veya daha yüksek dizin konumlarındaki doğru türdeki değerleri içerir ve
splice() öğesi kendi üst sınıf sürümünü çağırır:
AS3 override function splice(...args):*
{
if (args.length > 2)
{
for (var i:int=2; i< args.length; i++)
{
if (!(args[i] is dataType))
{
args.splice(i,1);
}
}
}
return (super.splice.apply(this, args));
}
Dizinin başına öğe ekleyen unshift() yöntemi de argümanların rastgele bir listesini kabul eder. Geçersiz kılınmış
unshift() yöntemi, aşağıdaki örnek kodda gösterildiği gibi, push() yönteminin kullandığına benzer bir algoritma
kullanır:
AS3 override function unshift(...args):uint
{
for (var i:* in args)
{
if (!(args[i] is dataType))
{
args.splice(i,1);
}
}
return (super.unshift.apply(this, args));
}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 175
Dizilerle çalışma
Örnek: PlayList
PlayList örneği, şarkı listesini yöneten bir müzik çalma listesi uygulaması bağlamında dizilerle çalışma tekniklerini
gösterir. Bu teknikler şunlardır:
• Dizinlenmiş bir dizi oluşturma
• Dizinlenmiş bir diziye öğeler ekleme
• Farklı sıralama seçeneklerini kullanarak nesne dizisini farklı özelliklerine göre sıralama
• Bir diziyi karakter sınırlı bir dizeye dönüştürme
Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.
PlayList uygulama dosyası, Samples/PlayList klasöründe bulunabilir. Uygulama aşağıdaki dosyaları içerir:
Dosya
Açıklama
PlayList.mxml
Flash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası.
veya
PlayList.fla
com/example/programmingas3/playlist/PlayList.as
Bir şarkı listesini temsil eden sınıf. Listeyi saklamak için bir Array
kullanır ve listenin öğelerinin sıralamasını yönetir.
com/example/programmingas3/playlist/Song.as
Tek bir şarkı hakkındaki bilgileri temsil eden bir değer nesnesi.
PlayList sınıfı tarafından yönetilen öğeler Song örnekleridir.
com/example/programmingas3/playlist/SortProperty.as
Kullanılabilir değerleri, Song nesnelerinin listesinin
sıralanmasında ölçüt olarak kullanılabilen Song sınıfının
özelliklerini temsil eden sahte numaralandırma.
PlayList sınıfına genel bakış
PlayList sınıfı, Song nesnelerinin kümesini yönetir. Oynatma listesine şarkı ekleme (addSong() yöntemi) ve listedeki
şarkıları sıralama (sortList() yöntemi) işlevleriyle genel yöntemler içerir. Ayrıca sınıf, oynatma listesindeki gerçek
şarkı kümesine erişilmesini sağlayan salt okunur bir erişimci özelliği (songList) içerir. Dahili olarak, PlayList sınıfı
özel bir Array değişkenini kullanarak şarkılarını izler:
public class PlayList
{
private var _songs:Array;
private var _currentSort:SortProperty = null;
private var _needToSort:Boolean = false;
...
}
PlayList sınıfı tarafından şarkı listesini izlemek üzere kullanılan _songs Array değişkenine ek olarak, başka iki özel
değişken de listenin sıralanması gerekip gerekmediğini (_needToSort) ve şarkı listesinin belirli bir zamanda hangi
özelliğe göre sıralandığını (_currentSort) izler.
Tüm nesnelerde olduğu gibi, Array örneğinin bildirilmesi, Array oluşturulması işleminin yalnızca yarısıdır. Bir Array
örneğinin özelliklerine veya yöntemlerine erişilmeden önce, PlayList sınıfının yapıcısında Array örneğinin
başlatılması gerekir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 176
Dizilerle çalışma
public function PlayList()
{
this._songs = new Array();
// Set the initial sorting.
this.sortList(SortProperty.TITLE);
}
Yapıcının ilk satırı, kullanıma hazır olması için _songs değişkenini başlatır. Ayrıca, ilk sıralama özelliğini ayarlamak
için sortList() yöntemi çağrılır.
Listeye şarkı ekleme
Kullanıcı uygulamaya yeni bir şarkı girdiğinde, veri girişi formundaki kod, PlayList sınıfının addSong() yöntemini
çağırır.
/**
* Adds a song to the playlist.
*/
public function addSong(song:Song):void
{
this._songs.push(song);
this._needToSort = true;
}
addSong() içinde, _songs dizisinin push() yöntemi çağrılır ve böylece addSong() öğesine iletilen Song nesnesi o
diziye yeni bir öğe olarak eklenir. push() yöntemiyle, önceden uygulanmış olabilecek herhangi bir sıralama dikkate
alınmaksızın, yeni öğe dizinin sonuna eklenir. Başka bir deyişle, push() yöntemi çağrıldıktan sonra, şarkı listesi artık
doğru şekilde sıralanmaz, bu nedenle _needToSort değişkeni true değerine ayarlanır. Teoride, sortList() yöntemi
hemen çağrılabilir, böylece listenin belirli bir zamanda sıralanıp sıralanmadığını izleme gereği ortadan kalkar.
Pratikteyse, alınmadan hemen önce şarkı listesinin sıralanması gerekmez. Sıralama işlemi ertelendiğinde, uygulama
gereksiz olan sıralama işlemini (örneğin, alınmadan önce listeye birçok şarkı eklendiğinde) gerçekleştirmez.
Şarkı listesini sıralama
Oynatma listesi tarafından yönetilen Song örnekleri karmaşık nesneler olduğundan, uygulama kullanıcıları, şarkı
başlığı veya yayınlama yılı gibi farklı özelliklere göre oynatma listesini sıralamak isteyebilir. PlayList uygulamasında,
şarkı listesini sıralama görevi üç bölüm içerir: listenin sıralanma ölçütü olan özelliği tanımlama, bu özelliğe göre
sıralama yapılırken hangi sıralama seçeneklerinin kullanılması gerektiğini belirtme ve gerçek sıralama işlemini
gerçekleştirme.
Sıralama özellikleri
Song nesnesi, şarkı başlığı, sanatçı, yayınlama yılı, dosya adı ve kullanıcı tarafından seçilen, şarkının ait olduğu bir tür
kümesi gibi birçok özelliği izler. Bunlar arasından yalnızca ilk üçü sıralama için pratik ölçütlerdir. Geliştiriciler için
kolaylık sağlaması açısından örnek, sıralama için kullanılabilir özellikleri temsil eden değerlerle numaralandırma
olarak hareket eden SortProperty sınıfını içerir.
public static const TITLE:SortProperty = new SortProperty("title");
public static const ARTIST:SortProperty = new SortProperty("artist");
public static const YEAR:SortProperty = new SortProperty("year");
SortProperty sınıfı üç sabit içerir: TITLE, ARTIST ve YEAR; bunların her biri sıralama için kullanılabilen
ilişkilendirilmiş Song sınıfı özelliğinin gerçek adını içeren bir String öğesini sağlar. Kodun geri kalanında, her sıralama
özelliği belirtildiğinde, bu işlem numaralandırma üyesi kullanılarak yapılır. Örneğin, PlayList yapıcısında, aşağıdaki
gibi başlangıçta sortList() yöntemi çağrılarak liste sıralanır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 177
Dizilerle çalışma
// Set the initial sorting.
this.sortList(SortProperty.TITLE);
Sıralama özelliği SortProperty.TITLE olarak belirtildiğinden, şarkılar başlığa göre sıralanır.
Özelliğe göre sıralama ve sıralama seçeneklerini belirtme
Şarkı listesini gerçekten sıralama çalışması, aşağıdaki gibi, sortList() yöntemindeki PlayList sınıfı tarafından
gerçekleştirilir:
/**
* Sorts the list of songs according to the specified property.
*/
public function sortList(sortProperty:SortProperty):void
{
...
var sortOptions:uint;
switch (sortProperty)
{
case SortProperty.TITLE:
sortOptions = Array.CASEINSENSITIVE;
break;
case SortProperty.ARTIST:
sortOptions = Array.CASEINSENSITIVE;
break;
case SortProperty.YEAR:
sortOptions = Array.NUMERIC;
break;
}
// Perform the actual sorting of the data.
this._songs.sortOn(sortProperty.propertyName, sortOptions);
// Save the current sort property.
this._currentSort = sortProperty;
// Record that the list is sorted.
this._needToSort = false;
}
Başlığa veya sanatçıya göre sıralama yapılırken sıralamanın alfabetik olması akıllıcayken, yıla göre sıralama yapılırken
sayısal sıralama yapılması akıllıcadır. switch deyimi, sortProperty parametresinde belirtilen değere göre
sortOptions değişkeninde saklanan uygun sıralama seçeneğini tanımlamak için kullanılır. Burada da, sabit değerler
yerine özellikleri birbirinden ayırmak için, adlandırılmış numaralandırma üyeleri kullanılır.
Sıralama özelliği ve sıralama seçenekleri belirlenmiş durumdayken, sortOn() yöntemi çağrılıp bu iki değerin
parametre olarak iletilmesiyle _songs dizisi gerçekten sıralanır. Şarkı listesi geçerli olarak sıralandığı gibi geçerli
sıralama özelliği kaydedilir.
Dizi öğelerini karakter sınırlı bir dizeye birleştirme
Dizilerin, şarkı listesini PlayList sınıfında tutmak için kullanılmasına ek olarak, bu örnekte, belirli bir şarkının ait
olduğu tür listesinin yönetilmesine yardımcı olmak için de Song sınıfında diziler kullanılır. Song sınıfının tanımındaki
bu kod parçasını göz önünde bulundurun:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 178
Dizilerle çalışma
private var _genres:String;
public function Song(title:String, artist:String, year:uint, filename:String, genres:Array)
{
...
// Genres are passed in as an array
// but stored as a semicolon-separated string.
this._genres = genres.join(";");
}
Yeni bir Song örneği oluşturulurken, şarkının ait olduğu türü (veya türleri) belirtmek için kullanılan genres
parametresi, bir Array örneği olarak tanımlanır. Böylece, birden çok türün yapıcıya iletilebilen tek bir değişken
şeklinde gruplanması yararlı hale gelir. Ancak, dahili olarak Song sınıfı, özel _genres değişkenindeki türleri noktalı
virgülle ayrılmış bir String örneği olarak tutar. Belirtilen sınırlayıcı olarak ";" değişmez dize değeriyle join() yöntemi
çağrılarak, Array parametresi noktalı virgülle ayrılmış bir dizeye dönüştürülür.
Aynı işaretle, genres erişimcileri, türlerin Array olarak ayarlanmasına veya alınmasına olanak sağlar:
public function get genres():Array
{
// Genres are stored as a semicolon-separated String,
// so they need to be transformed into an Array to pass them back out.
return this._genres.split(";");
}
public function set genres(value:Array):void
{
// Genres are passed in as an array,
// but stored as a semicolon-separated string.
this._genres = value.join(";");
}
genresset erişimcileri yapıcıyla tamamen aynı şekilde hareket eder; bir Array öğesini kabul eder ve bunu noktalı
virgülle ayrılmış bir String öğesine dönüştürmek için join() yöntemini çağırır. get erişimcisi tam tersi işlemi
gerçekleştirir: _genres değişkeninin split() yöntemi çağrılır, böylece String öğesi, belirtilen sınırlayıcı (daha önceki
gibi ";" değişmez dize değeri) kullanılarak değerler dizesine ayrılır.
179
Bölüm 9: Hataları işleme
Hata "işleme", bir uygulama derlendiğinde veya derlenen bir uygulama çalışırken oluşturulan bir hatayı yanıtlayan ya
da gideren mantığın uygulamanıza oluşturulması anlamına gelir. Uygulamanız hataları işlerken, herhangi bir yanıt
verilmeden hatayı oluşturan işlevin sessizce başarısız olmasının tersine, hata oluştuğunda yanıt olarak bir şey
gerçekleşir. Hata işleme doğru şekilde kullanıldığında, uygulamanızı ve kullanıcıları beklenmeyen davranışlara karşı
korumanıza yardımcı olur.
Ancak hata işleme, derleme sırasında veya çalışma zamanında atılan birçok türde hatayı yanıtlayan geniş bir
kategoridir. Bu bölümde, ActionScript 3.0'da çalışma zamanı hatalarının nasıl işlendiği, oluşturulabilecek farklı hata
türleri ve yeni hata işleme sisteminin avantajları ele alınmaktadır. Ayrıca uygulamalarınız için kendi özel hata işleme
stratejilerinizin nasıl uygulandığı da bu bölümde açıklanmaktadır.
Hata işlemenin temelleri
Hata işlemeye giriş
Çalışma zamanı hatası, ActionScript kodunuzda yanlış giden ve ActionScript içeriğinin Adobe® Flash® Player veya
Adobe® AIR™ uygulamasında çalışmasını durduran bir şeydir. ActionScript kodunuzun kullanıcılar için sorunsuzca
çalışmasını sağlamak amacıyla, uygulamanızda hatayı işleyen, başka bir deyişle hatayı gideren, geçici bir çözüm
oluşturan veya en azından kullanıcının hata oluştuğunu bilmesini sağlayan bir kod yazmalısınız. Bu işleme hata işleme
adı verilir.
Hata işleme, derleme sırasında veya çalışma zamanında atılan birçok türde hatayı yanıtlayan geniş bir kategoridir.
Derleme zamanında gerçekleşen hataların tanımlanması genellikle daha kolaydır—SWF dosyası oluşturma işlemini
tamamlamak için bu hataları gidermeniz gerekir. Bu bölümde, derleme zamanı hataları ele alınmamaktadır; derleme
zamanı hataları içermeyen bir kod yazılmasıyla ilgili daha fazla bilgi için, bkz. “ActionScript dili ve sözdizimi” sayfa 37
ve “ActionScript'te nesne tabanlı programlama” sayfa 89. Bu bölümde, çalışma zamanı hataları ele alınmaktadır.
Çalışma zamanı hatalarının gerçekleşmesi için kodun gerçekten çalışıyor olması gerektiğinden, çalışma zamanı
hatalarının algılanması daha zor olabilir. Programınızın bir parçasında birçok kod dalı (bir if..then..else deyimi
gibi) varsa, kodunuzun hatasız olduğunu onaylamak için, gerçek kullanıcıların kullanabileceği tüm olası değerlerle her
olası koşulu test etmeniz gerekir.
Çalışma zamanı hataları iki kategoriye ayrılır: program hataları, ActionScript kodunuzdaki hatalardır, örn. bir yöntem
parametresi için yanlış veri türünün belirtilmesi; mantıksal hatalar, programınızın mantığındaki (veri denetleme ve
değer işleme) hatalardır, örn. bankacılık uygulamasında faiz oranlarını hesaplamak için yanlış formülün kullanılması.
Bu iki hata türü de, genellikle uygulamanızın test edilmesiyle zaman içerisinde algılanıp düzeltilebilir.
İdeal olarak uygulamanızdaki tüm hataları son kullanıcılara yayınlanmadan tanımlayıp kaldırmak istersiniz. Ancak
tüm hatalar önceden görülüp önlenemez. Örneğin, ActionScript uygulamanızın denetiminiz dışındaki belirli bir web
sitesinden bilgi yüklediğini varsayın. Bir noktada bu web sitesi kullanılabilir olmazsa, uygulamanızın bu harici veriye
dayanan kısmı doğru şekilde davranmaz. Hata işlemenin en önemli bölümünü bu bilinmeyen durumlara
hazırlanılması ve kullanıcıların uygulamanızı kullanmaya devam edebilmesi için bu durumların işlenmesi veya en
azından uygulamanın neden çalışmadığını açıklayan bir hata mesajının iletilmesi oluşturur.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 180
Hataları işleme
Çalışma zamanı hataları ActionScript'te iki şekilde temsil edilir:
• Hata sınıfları: Çoğu hatanın kendisiyle ilişkilendirilmiş bir hata sınıfı vardır. Bir hata oluştuğunda, Flash Player
veya Adobe AIR, söz konusu hatayla ilişkilendirilmiş belirli hata örneğini oluşturur. Kodunuz, hataya uygun bir
yanıt oluşturmak için bu hata nesnesinde bulunan bilgileri kullanabilir.
• Hata olayları: Bazen Flash Player veya Adobe AIR normalde bir olayı tetikleyecekken bir hata gerçekleşir. Bu
durumlarda, Flash Player ve Adobe AIR bir hata olayı tetikler. Diğer olaylar gibi, her hata olayı da kendisiyle
ilişkilendirilmiş bir sınıfa sahiptir ve Flash Player ve Adobe AIR, hata olayına abone olan yöntemlere bu sınıfın bir
örneğini iletir.
Belirli bir yöntemin bir hata veya hata olayını tetikleyip tetikleyemeyeceğini belirlemek için, ActionScript 3.0 Dil ve
Bileşenler Başvurusu'nda yöntemin girişine bakın.
Ortak hata işleme görevleri
Bunlar, kodunuzla gerçekleştirmeniz gerekebilecek hatayla ilgili ortak görevlerdir:
• Hata işlemek için kod yazma
• Hataları test etme, yakalama ve yeniden atma
• Kendi hata sınıfınızı tanımlama
• Hata ve durum olaylarını yanıtlama
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:
• Eşzamansız: Hemen sonuç sağlamayan, bunun yerine olay şeklinde bir sonuç (veya hata) veren bir yöntem çağrısı
gibi program komutu.
• Yakalamak: Bir istisna (çalışma zamanı hatası) gerçekleşip kodunuz istisnayı fark ettiğinde bu kod istisnayı
yakalamış olur. Bir istisna yakalandıktan sonra, Flash Player ve Adobe AIR, diğer ActionScript koduna istisnayı
bildirmeyi durdurur.
• Hata ayıklayıcı sürüm: Kullanıcılara çalışma zamanı hatalarını bildirmeye yönelik kod içeren özel bir Flash Player
veya Adobe AIR (ADL) sürümü. Standart Flash Player veya Adobe AIR sürümünde (çoğu kullanıcının kullandığı),
ActionScript kodunuz tarafından işlenmeyen hatalar yoksayılır. Hata ayıklayıcı sürümlerde (Adobe Flash CS4
Professional ve Adobe Flex uygulamalarına dahil edilmiştir), işlenmemiş hata oluştuğunda bir uyarı mesajı
görüntülenir.
• İstisna: Bir program çalışıyorken oluşan ve çalışma zamanı ortamının (başka bir deyişle, Flash Player veya Adobe
AIR uygulamasının) tek başına çözümleyemediği bir hata.
• Yeniden atma: Kodunuz bir istisna yakaladığında, Flash Player ve Adobe AIR artık diğer nesnelere istisnayı
bildirmez. Diğer nesnelere istisnanın bildirilmesi önemliyse, kodunuzun bildirim işlemini tekrar başlatmak için
istisnayı yeniden atması gerekir.
• Eşzamanlı: Hemen sonuç sağlayan (veya hemen bir hata atan), başka bir deyişle yanıtın aynı kod bloğunda
kullanılabildiği bir yöntem çağrısı gibi program komutu.
• Atmak: Flash Player veya Adobe AIR uygulamasına bir hata oluştuğunu bildirme (ve bunun sonucunda diğer
nesnelere ve ActionScript koduna da bildirme) eylemi, hata atma olarak bilinir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 181
Hataları işleme
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Temelde, bu bölümdeki tüm kod
listeleri uygun trace() işlev çağrısını içerir. Bu bölümdeki kod listelerini test etmek için:
1 Boş bir Flash belgesi oluşturun.
2 Zaman çizelgesinde bir anahtar kare seçin.
3 Eylemler panelini açın ve kod listesini Komut Dosyası bölmesine kopyalayın.
4 Kontrol Et > Filmi Test Et komutu ile programı çalıştırın.
Kod listesinin trace() işlevlerinin sonuçlarını Çıktı panelinde görürsünüz.
Daha sonraki kod listelerinden bazıları daha karmaşık olup bir sınıf olarak yazılır. Bu örnekleri test etmek için:
1 Boş bir Flash belgesi oluşturun ve bu belgeyi bilgisayarınıza kaydedin.
2 Yeni bir ActionScript dosyası oluşturun ve bu dosyayı Flash belgesiyle aynı dizine kaydedin. Dosyanın adı ile, kod
listesindeki sınıf adının eşleşmesi gerekir. Örneğin, kod listesi, ErrorTest adında bir sınıfı tanımlıyorsa,
ActionScript dosyasını kaydetmek için ErrorTest.as adını kullanın.
3 Kod listesini ActionScript dosyasına kopyalayın ve dosyayı kaydedin.
4 Belgenin Özellik denetçisini etkinleştirmek için, Flash belgesinde Sahne Alanı'nın boş bir bölümünü veya çalışma
alanını tıklatın.
5 Özellik denetçisinde Belge Sınıfı alanına, metinden kopyaladığınız ActionScript sınıfının adını girin.
6 Kontrol Et > Filmi Test Et komutu ile programı çalıştırın
Çıktı panelinde (örnek trace() işlevini kullanıyorsa) veya örnek kod tarafından oluşturulan bir metin alanında
örneğin sonuçlarını görürsünüz.
Örnek kod listelerinin test edilmesine yönelik bu teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34
bölümünde daha ayrıntılı şekilde açıklanmıştır.
Hata türleri
Uygulamaları geliştirip çalıştırdığınızda, farklı hata türleri ve hata terminolojisiyle karşılaşırsınız. Aşağıdaki listede
önemli hata türleri ve terimler verilmiştir:
• Derleme zamanı hataları, kod derlemesi sırasında ActionScript derleyicisi tarafından verilir. Kodunuzdaki
sözdizimi hataları uygulamanızın oluşturulmasını önlediğinde derleme zamanı hataları oluşur.
• Çalışma zamanı hataları, uygulamanızı derledikten sonra çalıştırdığınızda oluşur. Çalışma zamanı hataları, bir
SWF dosyası Adobe Flash Player veya Adobe AIR uygulamasında oynatılırken ortaya çıkan hataları temsil eder.
Çoğu durumda çalışma zamanı hatalarını oluştuğunda işleyebilerek bunları kullanıcıya bildirebilir ve
uygulamanızın çalışmaya devam etmesi için gerekli adımları uygulayabilirsiniz. Söz konusu hata kritik bir hataysa
(örn. uzak bir web sitesine bağlanılamaması veya gerekli verilerin yüklenememesi), uygulamanızın düzgün biçimde
sonlandırılmasını sağlamak için hata işlemeyi kullanabilirsiniz.
• Eşzamanlı hatalar, bir işlev çağrıldığında gerçekleşen çalışma zamanı hatalarıdır—örneğin, belirli bir yöntemi
kullanmayı denediğinizde ve yönteme ilettiğiniz argüman geçersiz olduğunda Flash Player veya Adobe AIR bir
istisna atar. Hataların çoğu eşzamanlı—deyim çalıştırıldığında—oluşur ve denetim akışı hemen en uygun catch
deyimine iletilir.
Örneğin, program dosyayı karşıya yüklemeden önce browse() yöntemi çağrılmadığından, aşağıdaki kod alıntısı
bir çalışma zamanı hatası atar:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 182
Hataları işleme
var fileRef:FileReference = new FileReference();
try
{
fileRef.upload("http://www.yourdomain.com/fileupload.cfm");
}
catch (error:IllegalOperationError)
{
trace(error);
// Error #2037: Functions called in incorrect sequence, or earlier
// call was unsuccessful.
}
Bu durumda, Flash Player dosya karşıya yükleme işleminden önce browse() yönteminin çağrılmadığını
belirlediğinden, eşzamanlı olarak bir çalışma zamanı hatası atılır.
Eşzamanlı hata işleme hakkında ayrıntılı bilgi için, bkz. “Bir uygulamada eşzamanlı hataları işleme” sayfa 185.
• Eşzamansızhatalar, çalışma zamanında çeşitli noktalarda gerçekleşen çalışma zamanı hatalarıdır; bunlar genellikle
olaylar oluşturur ve olay dinleyicileri tarafından yakalanır. Eşzamansız işlem, bir işlevin bir işlemi başlatıp işlemin
tamamlanmasını beklemediği bir işlemdir. Uygulamanın veya kullanıcının bazı işlemleri denemesini beklemek için
bir hata olayı dinleyicisi oluşturabilirsiniz ve böylece işlem başarısız olursa, olay dinleyicisiyle hatayı yakalayıp hata
olayına yanıt verirsiniz. Daha sonra olay dinleyicisi hata olayına düzgün şekilde yanıt vermek için bir olay işleyicisi
işlevini çağırır. Örneğin, olay işleyicisi, kullanıcıdan hatayı çözümlemesini isteyen bir iletişim kutusunu
başlatabilir.
Daha önce sunulan dosya karşıya yükleme eşzamanlı hatası örneğini göz önünde bulundurun. Dosya karşıya
yüklemesine başlamadan önce browse() yöntemini başarıyla çağırırsanız, Flash Player birçok olay gönderir.
Örneğin, karşıya yükleme başladığında open olayı gönderilir. Dosya karşıya yükleme işlemi başarıyla
tamamlandığında, complete olayı gönderilir. Olay işleme eşzamansız olduğundan (başka bir deyişle, belirli,
bilinen ve önceden belirlenmiş zamanlarda oluşmadığından), aşağıdaki kodun da gösterdiği gibi, bu belirli olayları
dinlemek için addEventListener() yöntemini kullanmanız gerekir:
var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(Event.OPEN, openHandler);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
fileRef.browse();
function selectHandler(event:Event):void
{
trace("...select...");
var request:URLRequest = new URLRequest("http://www.yourdomain.com/fileupload.cfm");
request.method = URLRequestMethod.POST;
event.target.upload(request.url);
}
function openHandler(event:Event):void
{
trace("...open...");
}
function completeHandler(event:Event):void
{
trace("...complete...");
}
Eşzamansız hata işleme hakkında ayrıntılı bilgi almak için, bkz. “Hata olaylarını ve durumunu yanıtlama”
sayfa 190.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 183
Hataları işleme
• Yakalanmamış istisnalar, kendilerine yanıt verilmesi için karşılık gelen bir mantık olmadan atılan hatalardır
(catch deyimi gibi). Uygulamanız bir hata atarsa ve hatayı işlemek için geçerli veya daha yüksek düzeyde uygun
bir catch deyimi veya olay işleyicisi bulunamazsa, hata, yakalanmamış istisna olarak değerlendirilir.
Kullanıcılar bir hatayı mutlaka kendi başlarına çözümleyemeyebileceğinden, çalışma zamanında Flash Player
tasarımı gereği yakalanmamış hataları yoksayar ve hata geçerli SWF dosyasını durdurmazsa, oynatma işlemini
sürdürmeye çalışır. Yakalanmamış bir hatayı yoksayma işlemi "sessizce başarısız olma" olarak bilinir ve hata
ayıklama uygulamalarını karmaşık hale getirebilir. Flash Player'ın hata ayıklayıcı sürümü, geçerli komut dosyasını
sonlandırıp trace deyimi çıktısında yakalanmamış hatayı görüntüleyerek veya hata mesajını bir günlük dosyasına
yazarak yakalanmamış hatayı yanıtlar. İstisna nesnesi, Error sınıfının veya bu sınıfın alt sınıflarından birinin
örneğiyse, getStackTrace() yöntemi çağrılır ve izleme deyimi çıktısında veya bir günlük dosyasında da yığın
izleme bilgileri görüntülenir. Flash Player uygulamasının hata ayıklayıcı sürümünün kullanılmasıyla ilgili daha
fazla bilgi için, bkz. “Flash Player ve AIR uygulamalarının hata ayıklayıcı sürümleriyle çalışma” sayfa 184.
ActionScript 3.0'da hata işleme
Uygulamaların çoğu hata işleme mantığı oluşturulmadan çalıştırılabildiğinden, geliştiriciler kendi uygulamalarında
hata işleme oluşturulmasını erteleyebilir. Ancak hata işleme olmazsa, bir şeyler beklendiği gibi çalışmadığında bir
uygulama kullanıcıya kolayca rahatsızlık verebilir. ActionScript 2.0'da belirli bir mesajla istisna atmak için özel
işlevlerde mantık oluşturmanıza olanak sağlayan bir Error sınıfı vardır. Hata işleme, kullanıcı dostu bir uygulama
oluşturulmasında kritik bir faktör olduğundan, ActionScript 3.0'da hataların yakalanması için genişletilmiş bir mimari
vardır.
Not: ActionScript 3.0 Dil ve Bileşenler Başvurusu'nda, birçok yöntem tarafından atılan istisnalar açıklansa da, her
yöntem için olası istisnaların tümü bulunmayabilir. Yöntem açıklamasında bir yöntemin attığı istisnaların bazıları
listelense de, bir yöntem, sözdizimi hataları için veya yöntem açıklamasında açıkça bildirilmeyen başka sorunlar için
istisna atabilir.
ActionScript 3.0 hata işleme öğeleri
ActionScript 3.0, hata işleme için arasında şunların da yer aldığı birçok aracı içerir:
• Error sınıfları. ActionScript 3.0, hata nesneleri üretebilecek durumların kapsamını genişletmek için geniş bir Error
sınıfı aralığına sahiptir. Her Error sınıfı, istem hatalarıyla (MemoryError koşulu gibi), kodlama hatalarıyla
(ArgumentError koşulu gibi), ağ iletişimi ve iletişim hatalarıyla (URIError koşulu gibi) veya diğer durumlarla ilgili
belirli hata koşullarının işlenmesine ve yanıtlanmasına yardımcı olur. Sınıfların her biriyle ilgili daha fazla bilgi
almak için, bkz. “Error sınıflarını karşılaştırma” sayfa 193.
• Daha az sessiz arıza Önceki Flash Player sürümlerinde, yalnızca throw deyimini açıkça kullandığınızda hatalar
oluşturulup bildirilirdi. Flash Player 9 ve sonrası ile Adobe AIR için yerel ActionScript yöntemleri ve özellikleri,
istisna gerçekleştiğinde bu istisnaları daha etkili şekilde işlemenize olanak sağlayan çalışma zamanı hataları atar ve
daha sonra da istisnaların her birini ayrı ayrı yanıtlar.
• Hata ayıklama sırasında görüntülenen hata mesajlarını temizleyin. Flash Player veya Adobe AIR uygulamasının
hata ayıklayıcı sürümünü kullandığınızda sorunlu kod veya durumlar dayanıklı hata mesajları oluşturur ve bu da
belirli bir kod bloğunun başarısız olma nedenlerini kolayca tanımlamanıza yardımcı olur. Böylece hataların
giderilmesi daha etkili hale gelir. Daha fazla bilgi için, bkz. “Flash Player ve AIR uygulamalarının hata ayıklayıcı
sürümleriyle çalışma” sayfa 184.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 184
Hataları işleme
• Kesin hatalar, çalışma zamanında kullanıcılara net hata mesajlarının görüntülenmesine olanak sağlar. Önceki Flash
Player sürümlerinde FileReference.upload() yöntemi, upload() çağrısı başarısız olduğunda bir false
Boolean değeri döndürerek beş olası hatadan birini belirtirdi. ActionScript 3.0'da upload() yöntemini
çağırdığınızda bir hata oluşursa, dört belirli hatadan birini atabilirsiniz, bu da son kullanıcılara daha kesin hata
mesajları görüntülemenize yardımcı olur.
• Daraltılmış hata işleme. Birçok yaygın durum için belirgin hatalar atılır. Örneğin, ActionScript 2.0'da, bir
FileReference nesnesi doldurulmadan önce, name özelliği null değerine sahip olur. (Böylece, name özelliğini
kullanabilmeniz veya görüntüleyebilmeniz için öncelikle bu değerin ayarlanmış olduğundan ve null olmadığından
emin olmanız gerekir.) ActionScript 3.0'da, name özelliği doldurulmadan bu özelliğe erişmeyi denerseniz, Flash
Player veya AIR uygulaması, değerin ayarlanmamış olduğunu size bildiren bir IllegalOperationError hatasını atar
ve siz de try..catch..finally bloklarını kullanarak hatayı işleyebilirsiniz. Daha fazla bilgi için, bkz.
“try..catch..finally deyimlerini kullanma” sayfa 185.
• Önemli performans sorunlarının olmaması Hataları işlemek için try..catch..finally bloklarının kullanılması,
önceki ActionScript sürümlerine göre çok daha az ek kaynak tüketir veya hiç ek kaynak tüketmez.
• Belirli eşzamansız hata olayları için dinleyiciler oluşturmanıza olanak sağlayan bir ErrorEvent sınıfı. Daha fazla
bilgi için, bkz. “Hata olaylarını ve durumunu yanıtlama” sayfa 190.
Hata işleme stratejileri
Kodunuzda hata işleme mantığı oluşturmasanız da, sorun yaratan bir koşulla karşılaşmadığı sürece uygulamanız
başarılı şekilde çalışabilir. Ancak hataları etkin şekilde işlemezseniz ve uygulamanız bir sorunla karşılaşırsa,
kullanıcılarınız uygulamanızın neden başarısız olduğunu asla bilmez.
Uygulamanızda hata işlemeye yönelik çeşitli yöntemler vardır. Aşağıdaki listede, üç önemli hata işleme seçeneği
özetlenmektedir:
•
try..catch..finally deyimlerini kullanma. Bu ifadeler oluştukları zaman eşzamanlı hataları yakalar. Kod
çalıştırmasının çeşitli düzeylerinde istisnaları yakalamak için, deyimlerinizi bir hiyerarşide yuvalayabilirsiniz. Daha
fazla bilgi için, bkz. “try..catch..finally deyimlerini kullanma” sayfa 185.
• Kendi özel hata nesnelerinizi oluşturma. Uygulamanızda, yerleşik hata türlerinin kapsamadığı belirli işlemleri
izlemek üzere kendi özel hata nesnelerinizi oluşturmak için Error sınıfını kullanabilirsiniz. Daha sonra özel hata
nesnelerinizde try..catch..finally deyimlerini kullanabilirsiniz. Daha fazla bilgi için, bkz. “Özel hata sınıfları
oluşturma” sayfa 189.
• Hata olaylarını yanıtlamak için olay dinleyicileri ve işleyicileri yazma. Bu stratejiyi kullanarak,
try..catch..finally bloklarında çok sayıda kod kopyalamadan benzer olayları işlemenize olanak sağlayan
genel hata işleyicileri oluşturabilirsiniz. Ayrıca bu yaklaşımı kullanarak eşzamansız hataları daha fazla
yakalayabilirsiniz. Daha fazla bilgi için, bkz. “Hata olaylarını ve durumunu yanıtlama” sayfa 190.
Flash Player ve AIR uygulamalarının hata ayıklayıcı
sürümleriyle çalışma
Adobe, hata ayıklama çalışmalarına yardımcı olmak için geliştiricilere özel Flash Player ve Adobe AIR sürümleri
sağlar. Adobe Flash CS4 Professional veya Adobe Flex Builder 3 uygulamasını yüklediğinizde, Flash Player'ın hata
ayıklayıcı sürümünün bir kopyasını edinirsiniz. Bu araçlardan herhangi birini yüklediğinizde veya Adobe AIR
SDK'nin parçası olarak yükleme yaptığınızda, ADL adı verilen Adobe AIR'in hata ayıklayıcı sürümünü de edinirsiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 185
Hataları işleme
Flash Player ve Adobe AIR uygulamalarının hata ayıklayıcı sürümlerinin ve yayınlama sürümlerinin hata belirtme
şekillerinde dikkate değer bir fark vardır. Hata ayıklayıcı sürümleri, hata türünü (örn. genel Error, IOError veya
EOFError), hata sayısını ve okunabilir bir hata mesajını gösterir. Yayınlama sürümleri yalnızca hata türünü ve hata
sayısını gösterir. Örneğin, şu kodu göz önünde bulundurun:
try
{
tf.text = myByteArray.readBoolean();
}
catch (error:EOFError)
{
tf.text = error.toString();
}
Flash Player uygulamasının hata ayıklayıcı sürümünde readBoolean() yöntemi bir EOFError hatası attıysa, tf metin
alanında şu mesaj görüntülenir: “EOFError: Error #2030: End of file was encountered.”
Flash Player veya Adobe AIR uygulamasının yayınlama sürümünde aynı kod şu metni görüntüler: “EOFError: Error
#2030.”
Yayınlama sürümlerinde kaynakları ve boyutu minimum tutmak için hata mesajı dizeleri verilmez. Bir hata mesajıyla
ilişkisini bulmak için belgelerde (ActionScript 3.0 Dil ve Bileşenler Başvurusu ekleri) hata sayısına bakabilirsiniz.
Alternatif olarak, tam mesajı görmek için Flash Player ve AIR uygulamasının hata ayıklayıcı sürümlerini kullanarak
hatayı yeniden oluşturabilirsiniz.
Bir uygulamada eşzamanlı hataları işleme
En yaygın hata işleme, eşzamanlı hata işleme mantığıdır, burada çalışma zamanında eşzamanlı hataları yakalamak için
kodunuza deyimler eklersiniz. Bu hata işleme türü, işlevler başarısız olduğunda uygulamanızın çalışma zamanı
hatalarını fark etmesine ve gidermesine olanak sağlar. Eşzamanlı hata yakalama mantığı, try..catch..finally
deyimlerini içerir, bu ifadeler bir işlemi dener, Flash Player veya Adobe AIR uygulamasından herhangi bir hata yanıtını
yakalar ve son olarak başarısız olan işlemi işlemek için başka bir işlemi çalıştırır.
try..catch..finally deyimlerini kullanma
Eşzamanlı çalışma zamanı hatalarıyla çalışırken, hataları yakalamak için try..catch..finally deyimlerini kullanın.
Çalışma zamanı hatası oluştuğunda, Flash Player veya Adobe AIR bir istisna atar, başka bir deyişle, normal çalıştırmayı
askıya alır ve Error türü için özel bir nesne oluşturur. Daha sonra Error nesnesi kullanılabilir birinci catch bloğuna
atılır.
try deyimi, hata oluşturma olasılığına sahip deyimleri kapsar. Her zaman try deyimiyle catch deyimini kullanırsınız.
try deyim bloğundaki deyimlerden birinde bir hata algılanırsa, o try deyimine eklenen catch deyimleri çalıştırılır.
finally deyimi, try bloğunda bir hata oluşsa da oluşmasa da çalıştırılacak olan deyimleri kapsar. Herhangi bir hata
yoksa, try blok deyimleri tamamlandıktan sonra finally bloğundaki deyimler çalıştırılır. Bir hata varsa, ilk olarak
catch deyimi sonra da finally bloğundaki deyimler çalıştırılır.
Aşağıdaki kod, try..catch..finally deyimlerinin kullanılmasına yönelik sözdizimini gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 186
Hataları işleme
try
{
// some code that could throw an error
}
catch (err:Error)
{
// code to react to the error
}
finally
{
// Code that runs whether or not an error was thrown. This code can clean
// up after the error, or take steps to keep the application running.
}
Her catch deyimi, işlediği belirli bir istisna türünü tanımlar. catch deyimi yalnızca Error sınıfının alt sınıfları olan
hata sınıflarını belirtebilir. Her catch deyimi sırayla denetlenir. Yalnızca atılan hata türüyle eşleşen ilk catch deyimi
çalıştırılır. Başka bir deyişle, ilk olarak yüksek düzey Error sınıfını ve sonra da Error sınıfının bir alt sınıfını
denetlerseniz, yalnızda yüksek düzeydeki Error sınıfı eşleşir. Aşağıdaki kod bu noktayı gösterir:
try
{
throw new ArgumentError("I am an ArgumentError");
}
catch (error:Error)
{
trace("<Error> " + error.message);
}
catch (error:ArgumentError)
{
trace("<ArgumentError> " + error.message);
}
Önceki kod, şu çıktıyı görüntüler:
<Error> I am an ArgumentError
ArgumentError hatasını doğru şekilde yakalamak için, aşağıdaki kodun gösterdiği gibi, en özel hata türlerinin ilk
sırada ve daha genel hata türlerinin daha aşağıda listelendiğinden emin olmanız gerekir:
try
{
throw new ArgumentError("I am an ArgumentError");
}
catch (error:ArgumentError)
{
trace("<ArgumentError> " + error.message);
}
catch (error:Error)
{
trace("<Error> " + error.message);
}
Flash Player API'sindeki birçok yöntem ve özellik, çalıştırılırken hatalarla karşılaşırsa çalışma zamanı hataları atar.
Örneğin, aşağıdaki kodda gösterildiği gibi, yöntem ses akışını kapatamazsa, Sound sınıfındaki close() yöntemi bir
IOError hatası atar:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 187
Hataları işleme
var mySound:Sound = new Sound();
try
{
mySound.close();
}
catch (error:IOError)
{
// Error #2029: This URLStream object does not have an open stream.
}
ActionScript 3.0 Dil ve Bileşenler Başvurusu ile ilgili daha fazla bilgi sahibi oldukça, her yöntemin açıklamasında
ayrıntılı şekilde anlatıldığı için, hangi yöntemlerin istisna attığını öğreneceksiniz.
throw deyimi
Flash Player ve Adobe AIR, çalışma zamanında uygulamanızda hatalarla karşılaştığında istisna atar. Ayrıca, throw
deyimini kullanarak kendiniz de açıkça istisnalar atabilirsiniz. Adobe, açıkça hata atarken Error sınıfının veya bu
sınıfın alt sınıflarının örneklerini atmanızı önerir. Aşağıdaki kod, Error sınıfının bir örneğini (MyErr) atan ve hata
atıldıktan sonra yanıt vermek için bir işlev (myFunction()) çağıran throw deyimini gösterir:
var MyError:Error = new Error("Encountered an error with the numUsers value", 99);
var numUsers:uint = 0;
try
{
if (numUsers == 0)
{
trace("numUsers equals 0");
}
}
catch (error:uint)
{
throw MyError; // Catch unsigned integer errors.
}
catch (error:int)
{
throw MyError; // Catch integer errors.
}
catch (error:Number)
{
throw MyError; // Catch number errors.
}
catch (error:*)
{
throw MyError; // Catch any other error.
}
finally
{
myFunction(); // Perform any necessary cleanup here.
}
catch deyimlerinin, en belirli veri türleri ilk sırada olacak şekilde sıralandığına dikkat edin. Number veri türü için
catch deyimi ilk sırada listelenseydi, uint veri türü için catch deyimi ve int veri türü için catch deyimi çalıştırılamazdı.
Not: Java programlama dilinde, bir istisna atabilen her işlevin bu gerçeği bildirmesi ve atabildiği istisna sınıflarını işlev
bildirimine eklenen bir throws deyiminde listelemesi gerekir. ActionScript, bir işlev tarafından atılabilen istisnaları
belirtmenizi gerektirmez.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 188
Hataları işleme
Basit bir hata mesajını görüntüleme
Yeni istisna ve hata olayı modelinin en büyük avantajlarından biri, kullanıcılara eylemin ne zaman ve neden başarısız
olduğunu bildirmenize olanak sağlamasıdır. Sizin göreviniz, mesajı görüntülemek ve yanıt olarak seçenekler sunmak
için kod yazmaktır.
Aşağıdaki kod, hatayı bir metin alanında görüntülemek için basit bir try..catch deyimini gösterir:
package
{
import flash.display.Sprite;
import flash.text.TextField;
public class SimpleError extends Sprite
{
public var employee:XML =
<EmpCode>
<costCenter>1234</costCenter>
<costCenter>1-234</costCenter>
</EmpCode>;
public function SimpleError()
{
try
{
if (employee.costCenter.length() != 1)
{
throw new Error("Error, employee must have exactly one cost center assigned.");
}
}
catch (error:Error)
{
var errorMessage:TextField = new TextField();
errorMessage.autoSize = TextFieldAutoSize.LEFT;
errorMessage.textColor = 0xFF0000;
errorMessage.text = error.message;
addChild(errorMessage);
}
}
}
}
ActionScript 3.0, daha çeşitli hata sınıflarını ve yerleşik derleyici hatalarını kullanarak, bir şeyin neden başarısız
olduğuna dair önceki ActionScript sürümlerinden daha fazla bilgi sunar. Bu da daha iyi hata işleme özelliğine sahip
daha kararlı uygulamalar oluşturmanıza olanak sağlar.
Hataları yeniden atma
Uygulama oluşturduğunuzda, hatayı düzgün şekilde işleyemezseniz hatayı yeniden atmanızı gerektirecek birçok
durum vardır. Örneğin, aşağıdaki kod yuvalanmış bir try..catch bloğunu gösterir, bu, yuvalanmış blok catch bloğu
hatayı işleyemezse özel bir ApplicationError hatasını yeniden atar:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 189
Hataları işleme
try
{
try
{
trace("<< try >>");
throw new ArgumentError("some error which will be rethrown");
}
catch (error:ApplicationError)
{
trace("<< catch >> " + error);
trace("<< throw >>");
throw error;
}
catch (error:Error)
{
trace("<< Error >> " + error);
}
}
catch (error:ApplicationError)
{
trace("<< catch >> " + error);
}
Önceki kod parçasındaki çıktı şöyle olur:
<<
<<
<<
<<
try >>
catch >> ApplicationError: some error which will be rethrown
throw >>
catch >> ApplicationError: some error which will be rethrown
Yuvalanmış try bloğu, sonraki catch bloğu tarafından yakalanan özel bir ApplicationError hatası atar. Bu yuvalanmış
catch bloğu, hatayı işlemeye çalışır ve başarısız olursa, kapsayan try..catch bloğuna ApplicationError nesnesini atar.
Özel hata sınıfları oluşturma
ActionScript'te kendi özelleştirilmiş hata sınıflarınızı oluşturmak için standart Error sınıflarından birini
genişletebilirsiniz. Kendi hata sınıflarınızı oluşturmanızın birçok nedeni vardır:
• Uygulamanız için benzersiz olan belirli hataları veya hata gruplarını tanımlamak için.
Örneğin, Flash Player veya Adobe AIR tarafından yakalanan bu hatalara ek olarak kendi kodunuz tarafından atılan
hatalar için farklı eylemler uygulamak isteyebilirsiniz. try..catch bloklarında yeni hata veri türünü izlemek için
Error sınıfının bir alt sınıfını oluşturabilirsiniz.
• Uygulamanız tarafından oluşturulan hatalara yönelik benzersiz hata görüntüleme yetenekleri sağlamak için.
Örneğin, hata mesajlarınızı belirli bir şekilde formatlayan yeni bir toString() yöntemi oluşturabilirsiniz. Ayrıca
bir hata kodunu alıp kullanıcının dil tercihine göre uygun mesajı alan bir lookupErrorString() yöntemini de
tanımlayabilirsiniz.
Özelleştirilmiş bir hata sınıfının çekirdek ActionScript Error sınıfını genişletmesi gerekir. Aşağıda, Error sınıfını
genişleten özelleştirilmiş bir AppError sınıfı örneği verilmiştir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 190
Hataları işleme
public class AppError extends Error
{
public function AppError(message:String, errorID:int)
{
super(message, errorID);
}
}
Aşağıda, projenizde AppError öğesinin kullanılmasına bir örnek gösterilmektedir:
try
{
throw new AppError("Encountered Custom AppError", 29);
}
catch (error:AppError)
{
trace(error.errorID + ": " + error.message)
}
Not: Alt sınıfınızda Error.toString() yöntemini geçersiz kılmak isterseniz, bu yönteme bir ...(rest) parametresi
vermeniz gerekir. ActionScript 3.0'ın esas aldığı ECMAScript dil belirtimi, Error.toString() yöntemini bu şekilde
tanımlar ve ActionScript 3.0, geriye doğru uyumluluk için bu yöntemi bu şekilde tanımlar. Bu nedenle,
Error.toString() yöntemini geçersiz kıldığınızda parametreleri tamamen aynı şekilde eşleştirmeniz gerekir. Bu
parametreler yoksayıldığından, çalışma zamanında toString() yönteminize herhangi bir parametre iletmek
istemezsiniz.
Hata olaylarını ve durumunu yanıtlama
ActionScript 3.0'da hata işleme konusunda en dikkate değer iyileştirmelerden biri, eşzamansız çalışma zamanı
hatalarını yanıtlamak için hata olayı işleme desteğidir. (Eşzamansız hataların bir tanımı için, bkz. “Hata türleri”
sayfa 181.)
Hata olaylarını yanıtlamak için olay dinleyicileri ve olay işleyicileri oluşturabilirsiniz. Sınıfların çoğu, diğer olayları
gönderdikleri şekilde hata olaylarını da gönderir. Örneğin, XMLSocket sınıfının bir örneği normalde üç olay türü
gönderir: Event.CLOSE, Event.CONNECT ve DataEvent.DATA. Ancak bir sorun oluştuğunda, XMLSocket sınıfı,
IOErrorEvent.IOError veya SecurityErrorEvent.SECURITY_ERROR öğesini gönderebilir. Olay dinleyicileri ve
olay işleyicileri hakkında daha fazla bilgi için, bkz. “Olayları işleme” sayfa 243.
Hata olayları, iki kategoriden birisine girer:
• ErrorEvent sınıfını genişleten hata olayları
flash.events.ErrorEvent sınıfı, ağ iletişimi ve iletişim işlemleriyle ilgili çalışma zamanı hatalarının yönetilmesine
yönelik özellikleri ve yöntemleri içerir. AsyncErrorEvent, IOErrorEvent ve SecurityErrorEvent sınıfları, ErrorEvent
sınıfını genişletir. Flash Player veya Adobe AIR uygulamasının hata ayıklayıcı sürümünü kullanıyorsanız, bir
iletişim kutusu, oynatıcının karşılaştığı dinleyici işlevleri olmadan çalışma zamanında hata olaylarını size bildirir.
• Durum tabanlı hata olayları
Durum tabanlı hata olayları, ağ iletişimi ve iletişim sınıflarının netStatus ve status özellikleriyle ilgilidir. Flash
Player veya Adobe AIR, veri okurken ya da yazarken bir sorunla karşılaşırsa, netStatus.info.level veya
status.level özelliklerinin değeri (kullandığınız sınıf nesnesine bağlı olarak), "error" değerine ayarlanır. level
özelliğinin, olay işleyicisi işlevinizde "error" değerini içerip içermediğini kontrol ederek bu hatayı yanıtlarsınız.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 191
Hataları işleme
Hata olaylarıyla çalışma
ErrorEvent sınıfı ve bu sınıfın alt sınıfları, veri okumaya veya yazmaya çalıştıkça, Flash Player ve Adobe AIR tarafından
gönderilen hataların işlenmesine yönelik hata türlerini içerir.
Aşağıdaki örnek, yerel bir dosya okunmaya çalışılırken algılanan hataları görüntülemek için, bir try..catch deyimini
ve hata olayı işleyicilerini kullanır. Kullanıcıya seçenekler sağlamak için daha gelişmiş işleme kodu ekleyebilir veya
“your error-handling code here”: yorumunun belirttiği yerde otomatik olarak hatayı işleyebilirsiniz.
package
{
import
import
import
import
import
import
import
import
import
flash.display.Sprite;
flash.errors.IOError;
flash.events.IOErrorEvent;
flash.events.TextEvent;
flash.media.Sound;
flash.media.SoundChannel;
flash.net.URLRequest;
flash.text.TextField;
flash.text.TextFieldAutoSize;
public class LinkEventExample extends Sprite
{
private var myMP3:Sound;
public function LinkEventExample()
{
myMP3 = new Sound();
var list:TextField = new TextField();
list.autoSize = TextFieldAutoSize.LEFT;
list.multiline = true;
list.htmlText = "<a href=\"event:track1.mp3\">Track 1</a><br>";
list.htmlText += "<a href=\"event:track2.mp3\">Track 2</a><br>";
addEventListener(TextEvent.LINK, linkHandler);
addChild(list);
}
private function playMP3(mp3:String):void
{
try
{
myMP3.load(new URLRequest(mp3));
myMP3.play();
}
catch (err:Error)
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 192
Hataları işleme
{
trace(err.message);
// your error-handling code here
}
myMP3.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
}
private function linkHandler(linkEvent:TextEvent):void
{
playMP3(linkEvent.text);
// your error-handling code here
}
private function errorHandler(errorEvent:IOErrorEvent):void
{
trace(errorEvent.text);
// your error-handling code here
}
}
}
Durum değişikliği olaylarıyla çalışma
Flash Player ve Adobe AIR, level özelliğini destekleyen sınıflar için netStatus.info.level veya status.level
özelliklerinin değerini dinamik olarak değiştirir. netStatus.info.level özelliğine sahip sınıflar, NetConnection,
NetStream ve SharedObject sınıflarıdır. status.level özelliğine sahip sınıflar, HTTPStatusEvent, Camera,
Microphone ve LocalConnection sınıflarıdır. level değerindeki değişikliğe yanıt vermek ve iletişim hatalarını izlemek
için bir işleyici işlevi yazabilirsiniz.
Aşağıdaki örnek, level özelliğinin değerini test etmek için bir netStatusHandler() işlevini kullanır. level özelliği
bir hatayla karşılaşıldığını belirtirse, kod “Video stream failed” mesajını izler.
package
{
import
import
import
import
import
import
flash.display.Sprite;
flash.events.NetStatusEvent;
flash.events.SecurityErrorEvent;
flash.media.Video;
flash.net.NetConnection;
flash.net.NetStream;
public class VideoExample extends Sprite
{
private var videoUrl:String = "Video.flv";
private var connection:NetConnection;
private var stream:NetStream;
public function VideoExample()
{
connection = new NetConnection();
connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
connection.connect(null);
}
private function netStatusHandler(event:NetStatusEvent):void
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 193
Hataları işleme
{
if (event.info.level == "error")
{
trace("Video stream failed")
}
else
{
connectStream();
}
}
private function securityErrorHandler(event:SecurityErrorEvent):void
{
trace("securityErrorHandler: " + event);
}
private function connectStream():void
{
var stream:NetStream = new NetStream(connection);
var video:Video = new Video();
video.attachNetStream(stream);
stream.play(videoUrl);
addChild(video);
}
}
}
Error sınıflarını karşılaştırma
ActionScript, önceden tanımlı birçok Error sınıfı sağlar. Bu sınıfların çoğu Flash Player ve Adobe AIR tarafından
kullanılır ancak kendi kodunuzda da aynı Error sınıflarını kullanabilirsiniz. ActionScript 3.0'da iki ana Error sınıfı türü
vardır: ActionScript çekirdek Error sınıfları ve flash.error paketi Error sınıfları. Çekirdek Error sınıfları, ECMAScript
(ECMA-262) sürüm 3 taslak dil belirtimi tarafından saptanmıştır. flash.error paketinin içerikleri, ActionScript 3.0
uygulama geliştirmesi ve hata ayıklamasına yardımcı olmak üzere sunulan ek sınıflardır.
ECMAScript çekirdek Error sınıfları
ECMAScript çekirdek hata sınıfları arasında, Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError
ve URIError sınıfları yer alır. Bu sınıfların her biri üst düzey ad alanında bulunur.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 194
Hataları işleme
Sınıf adı
Açıklama
Notlar
Error
Error sınıfı, istisnalar atmak için kullanılabilir ve
ECMAScript'te tanımlanmış diğer istisna sınıfları için
temel sınıftır: EvalError, RangeError, ReferenceError,
SyntaxError, TypeError ve URIError.
Error sınıfı, Flash® Player ve Adobe® AIR® uygulamaları
tarafından atılan tüm çalışma zamanı hataları için temel sınıf
görevi görür ve tüm özel hata sınıfları için önerilen temel sınıftır.
EvalError
Function sınıfının yapıcısına herhangi bir parametre
iletilirse veya kullanıcı kodu eval() işlevini çağırırsa
bir EvalError istisnası atılır.
ActionScript 3.0'da, eval() işlevi desteği kaldırılmış olup bu
işlevi kullanma girişimleri de bir hatanın atılmasına yol açar.
Önceki Flash Player sürümleri, ada göre değişkenlere,
özelliklere, nesnelere veya film kliplerine erişmek için eval()
işlevini kullanırdı.
RangeError
Sayısal bir değer, kabul edilebilir aralığın dışında
kalırsa bir RangeError istisnası atılır.
Örneğin, bir gecikme negatif olunca veya sonlu olmayınca
Timer sınıfı tarafından bir RangeError atılırdı. Ayrıca geçersiz
derinlikte bir görüntüleme nesnesini eklemeyi denediğinizde
de bir RangeError atılabilirdi.
ReferenceError
Mühürlü (dinamik olmayan) bir nesnede tanımsız bir
özelliğe başvurulduğunda ReferenceError istisnası
atılır. ActionScript 3.0'dan önceki ActionScript
derleyici sürümleri, undefined bir özelliğe
erişilmeye çalışıldığında bir hata atmazdı. Ancak
ActionScript 3.0, bu koşulda ReferenceError istisnasını
atar.
Tanımsız değişkenlerin istisnaları, olası hataları işaret ederek
yazılım kalitesini yükseltmenize yardımcı olur. Ancak
değişkenlerinizi başlatmak zorunda olmaya alışkın değilseniz,
bu yeni ActionScript davranışı, kodlama alışkanlıklarınızda bazı
değişiklikler yapmanızı gerektirebilir.
SyntaxError
ActionScript kodunuzda bir ayrıştırma hatası
oluştuğunda SyntaxError istisnası atılır.
SyntaxError hatası şu koşullarda atılabilir:
Daha fazla bilgi için, www.ecmainternational.org/publications/standards/Ecma262.htm adresinde ECMAScript (ECMA-262) sürüm 3
dil belirtimi, Bölüm 15.11.6.4'e ve www.ecmainternational.org/publications/standards/Ecma357.htm adresinde XML için ECMAScript (E4X)
belirtimi (ECMA-357 sürüm 2), Bölüm 10.3.1'e bakın.
TypeError
Bir işlenenin gerçek türü beklenen türden farklı
olduğunda TypeError istisnası atılır.
Daha fazla bilgi için, www.ecmainternational.org/publications/standards/Ecma262.htm adresinde ECMAScript belirtimi, Bölüm
15.11.6.5'e ve www.ecmainternational.org/publications/standards/Ecma357.htm adresinde E4X belirtimi, Bölüm 10.3'e bakın.
•
RegExp sınıfı tarafından geçersiz bir normal ifade
ayrıştırıldığında, ActionScript SyntaxError istisnalarını atar.
•
XMLDocument sınıfı tarafından geçersiz XML
ayrıştırıldığında, ActionScript SyntaxError istisnalarını atar.
TypeError hatası şu koşullarda atılabilir:
•
Bir işlevin veya yöntemin gerçek parametresi, biçimsel
parametre türüne zorlanamadığında.
•
Bir değişkene bir değer atandığında ve bu değer değişkenin
türüne zorlanamadığında.
•
is veya instanceof operatörünün sağ tarafı geçerli bir tür
olmadığında.
URIError
Genel URI işleme işlevlerinden biri, tanımına
uymayacak şekilde kullanıldığında URIError istisnası
atılır.
Daha fazla bilgi için, www.ecmainternational.org/publications/standards/Ecma262.htm adresinde ECMAScript belirtimi, Bölüm
15.11.6.6'ya bakın.
•
super anahtar sözcüğü kuraldışı olarak kullanıldığında.
•
Özellik arama birden çok bağlamaya yol açtığından belirsiz
olduğunda.
•
Uyumsuz bir nesnede yöntem çağrıldığında. Örneğin,
RegExp sınıfındaki bir yöntem genel bir nesneye "eklenip"
sonra çağrıldığında bir TypeError istisnası atılır.
URIError hatası şu koşullarda atılabilir:
Geçerli bir URI bekleyen Flash Player API'si işlevi için,
Socket.connect() gibi geçersiz bir URI belirtildiğinde.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 195
Hataları işleme
ActionScript çekirdek Error sınıfları
ActionScript, ActionScript'e özgü hata koşulları ve hata işleme işlevselliği için çekirdek ECMAScript Error sınıflarına
ek olarak, çok sayıda kendi sınıfını da ekler.
Bu sınıflar, ECMAScript sürüm 3 dil belirtimine yönelik, belirtim için ilgi çekici eklemeler olabilecek ActionScript dil
uzantıları olduğundan, flash.error gibi bir pakete yerleştirilmek yerine üst düzeyde tutulur.
Sınıf adı
Açıklama
ArgumentError
ArgumentError sınıfı, bir işlev çağrısı sırasında sağlanan Argüman hatalarının bazı örnekleri arasında şunlar yer alır:
parametre değerleri, o işlev için tanımlanmış
parametrelerle eşleşmediğinde gerçekleşen bir hatayı • Bir yönteme çok az veya çok fazla argüman sağlanması.
temsil eder.
• Bir argümanın bir numaralandırma üyesi olmasının
beklenmesi ancak olmaması.
SecurityError
Bir güvenlik ihlali gerçekleşip erişim reddedildiğinde
SecurityError istisnası atılır.
VerifyError
Yanlış biçimlendirilmiş veya bozuk bir SWF dosyasıyla
karşılaşıldığında VerifyError istisnası atılır.
Notlar
Güvenlik hatalarının bazı örnekleri arasında şunlar yer alır:
•
Sanal güvenlik alanı sınırından yetkisiz bir özellik erişimi
veya yöntem çağrısı yapılması.
•
Sanal güvenlik alanının izin vermediği bir URL'ye erişim
girişiminde bulunulması.
•
Bir bağlantı noktasına soket bağlantısı yapılmaya
çalışılmış ancak gerekli soket ilke dosyası
bulunmamıştır.
•
Kullanıcının kamera veya mikrofonuna erişim
girişiminde bulunulması ve aygıta erişim isteğinin
kullanıcı tarafından reddedilmesi.
Bir SWF dosyası başka bir SWF dosyasını yüklediğinde, üst
SWF, yüklenen SWF tarafından oluşturulan bir VerifyError
hatasını yakalayabilir.
flash.error paketi Error sınıfları
flash.error paketi, Flash Player API'sinin parçası olarak değerlendirilen Error sınıflarını içerir. Henüz açıklanan Error
sınıflarının tersine, flash.error paketi, Flash Player veya Adobe AIR uygulamasına özgü hata olaylarıyla iletişim kurar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 196
Hataları işleme
Sınıf adı
Açıklama
Notlar
EOFError
Kullanılabilir verilerin sonunun ötesini okumaya
çalıştığınızda bir EOFError istisnası atılır.
Örneğin, IDataInput arabiriminde okuma
yöntemlerinden biri çağrıldığında ve okuma isteğini
karşılamak için yeterli veri olmadığında bir EOFError
atılır.
IllegalOperationError
Bir yöntem uygulanmadığında veya uygulama
geçerli kullanımı kapsamadığında, bir
IllegalOperationError istisnası atılır.
Kuraldışı işlem hatası istisnalarının örnekleri arasında
şunlar yer alır:
•
DisplayObjectContainer gibi bir temel sınıfın, Sahne
Alanı'nın destekleyemeyeceği kadar çok işlevsellik
sağlaması. Örneğin, Sahne Alanı'nda bir maske
almayı veya ayarlamayı denerseniz (stage.mask
öğesini kullanarak), Flash Player ve Adobe AIR
uygulaması, “The Stage class does not implement
this property or method” mesajıyla birlikte
IllegalOperationError atar.
•
Bir alt sınıfın gerektirmediği ve desteklemek
istemediği bir yöntemi miras alması.
•
Erişilebilirlik desteği olmadan Flash Player
derlendiğinde belirli yöntemlerin çağrılması.
•
Flash Player uygulamasının çalışma zamanı
sürümünden yalnızca geliştirme özelliklerinin
çağrılması.
•
Zaman çizelgesine yerleştirilmiş bir nesnenin adını
ayarlamaya çalışmanız.
IOError
Bir G/Ç istisnası gerçekleştiğinde IOError istisnası
atılır.
Örneğin, bağlanmamış veya bağlantısı kesilmiş bir
sokette salt okunur bir işlem girişiminde
bulunulduğunda bu hatayı alırsınız.
MemoryError
Bellek ayırma isteği başarısız olduğunda bir
MemoryError istisnası atılır.
Varsayılan olarak, ActionScript Virtual Machine 2, bir
ActionScript programının ayırabileceği bellek
miktarına bir sınırlama getirmez. Masaüstü bir
bilgisayarda bellek ayırma özellikleri daha azdır. Sistem
bir işlem için gerekli belleği ayıramadığında bir hata
atıldığını görürsünüz. Bu nedenle, masaüstü bir
bilgisayarda ayırma isteği aşırı yüksek miktarda
olmadığı sürece bu istisna çok nadir atılır; örneğin, 32bit Microsoft® Windows® programı yalnızca adres
alanının 2 GB'ına erişebildiğinden 3 milyar bayt isteği
imkansızdır.
ScriptTimeoutError
15 saniyelik komut dosyası zaman aşımı aralığına
ulaşıldığında bir ScriptTimeoutError istisnası atılır.
ScriptTimeoutError istisnasını yakalayarak komut
dosyası zaman aşımını daha düzgün şekilde
işleyebilirsiniz. Herhangi bir istisna işleyicisi yoksa,
yakalanmayan istisna işleyicisi bir hata mesajı
içeren bir iletişim kutusunu görüntüler.
Kötü amaçlı bir geliştiricinin istisnayı yakalayıp sonsuz
döngüde kalmasını önlemek için, yalnızca belirli bir
komut dosyasında atılan birinci ScriptTimeoutError
istisnası yakalanabilir. Sonraki bir ScriptTimeoutError
istisnası kodunuz tarafından yakalanamaz ve hemen
yakalanmamış istisna işleyicisine gider.
StackOverflowError
Komut dosyası için kullanılabilir olan yığın
tükendiğinde StackOverflowError istisnası atılır.
StackOverflowError istisnası, sonsuz bir yineleme
oluştuğunu belirtebilir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 197
Hataları işleme
Örnek: CustomErrors uygulaması
CustomErrors uygulaması, bir uygulama oluşturulurken özel hatalarla çalışma tekniklerini gösterir. Bu teknikler
şunlardır:
• XML paketini doğrulama
• Özel bir hata yazma
• Özel hatalar atma
• Bir hata atıldığında bunu kullanıcılara bildirme
Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.
CustomErrors uygulama dosyaları, Samples/CustomError klasöründe bulunabilir. Uygulama aşağıdaki dosyaları
içerir:
Dosya
Açıklama
CustomErrors.mxml
Flash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası
veya
CustomErrors.fla
com/example/programmingas3/errors/ApplicationError.as
Hem FatalError hem de WarningError sınıfları için temel hata sınıfı görevi
gören bir sınıf.
com/example/programmingas3/errors/FatalError.as
Uygulama tarafından atılabilen bir FatalError hatasını tanımlayan bir
sınıf. Bu sınıf özel ApplicationError sınıfını genişletir.
com/example/programmingas3/errors/Validator.as
Kullanıcı tarafından sağlanan bir çalışan XML paketini doğrulayan tek bir
yöntemi tanımlayan sınıf.
com/example/programmingas3/errors/WarningError.as
Uygulama tarafından atılabilen bir WarningError hatasını tanımlayan bir
sınıf. Bu sınıf özel ApplicationError sınıfını genişletir.
CustomErrors uygulamasına genel bakış
Uygulama yüklendiğinde, Flex'te initApp() yöntemi çağrılır veya Flash'ta zaman çizelgesi (işlev olmayan) kodu
çalıştırılır. Bu kod, Validator sınıfı tarafından doğrulanacak örnek bir XML paketini tanımlar. Aşağıdaki kod
çalıştırılır:
employeeXML =
<employee id="12345">
<firstName>John</firstName>
<lastName>Doe</lastName>
<costCenter>12345</costCenter>
<costCenter>67890</costCenter>
</employee>;
}
XML paketi daha sonra Sahne Alanı'nda bir TextArea bileşen örneğinde görüntülenir. Bu da XML paketini yeniden
doğrulama girişiminde bulunmadan önce XML paketini değiştirmenize olanak sağlar.
Kullanıcı Doğrulama düğmesini tıklattığında, validateData() yöntemi çağrılır. Bu yöntem, Validator sınıfında
validateEmployeeXML() yöntemini kullanarak çalışan XML paketini doğrular. Aşağıdaki kod, validateData()
yöntemini gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 198
Hataları işleme
function validateData():void
{
try
{
var tempXML:XML = XML(xmlText.text);
Validator.validateEmployeeXML(tempXML);
status.text = "The XML was successfully validated.";
}
catch (error:FatalError)
{
showFatalError(error);
}
catch (error:WarningError)
{
showWarningError(error);
}
catch (error:Error)
{
showGenericError(error);
}
}
İlk olarak, xmlText TextArea bileşen örneğinin içerikleri kullanılarak geçici bir XML nesnesi oluşturulur. Ardından,
özel Validator sınıfında (com.example.programmingas3/errors/Validator.as) validateEmployeeXML() yöntemi
çağrılır ve geçici XML nesnesini parametre olarak iletir. XML paketi geçerliyse, status Label bileşen örneği bir başarı
mesajını görüntüler ve uygulamadan çıkılır. validateEmployeeXML() yöntemi özel bir hata atarsa (başka bir deyişle,
bir FatalError, WarningError veya genel Error oluşursa), uygun catch deyimi çalıştırılır ve showFatalError(),
showWarningError() veya showGenericError() yöntemlerinden birini çağırır. Bu yöntemlerden her biri,
kullanıcıya belirli bir hatanın oluştuğunu bildirmek için statusText adındaki bir metin alanında uygun bir mesajı
görüntüler. Ayrıca her yöntem, status Label bileşen örneğini belirli bir mesajla günceller.
Çalışan XML paketini doğrulama girişimi sırasında kritik bir hata oluşursa, aşağıdaki kodun gösterdiği gibi, hata
mesajı statusText metin alanında görüntülenir ve xmlText TextArea bileşen örneği ile validateBtn Button bileşen
örneği devre dışı bırakılır:
function showFatalError(error:FatalError):void
{
var message:String = error.message + "\n\n";
var title:String = error.getTitle();
statusText.text = message + " " + title + "\n\nThis application has ended.";
this.xmlText.enabled = false;
this.validateBtn.enabled = false;
hideButtons();
}
Kritik hata yerine bir uyarı hatası oluşursa, hata mesajı statusText TextArea örneğinde görüntülenir ancak xmlText
TextField ve Button bileşen örnekleri devre dışı bırakılmaz. showWarningError() yöntemi, özel hata mesajını
statusText metin alanında görüntüler. Ayrıca mesaj, kullanıcıdan XML doğrulama işlemine devam etmeyi mi yoksa
komut dosyasını durdurmayı mı istediğine karar vermesini ister. Aşağıdaki alıntı, showWarningError() yöntemini
gösterir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 199
Hataları işleme
function showWarningError(error:WarningError):void
{
var message:String = error.message + "\n\n" + "Do you want to exit this application?";
showButtons();
var title:String = error.getTitle();
statusText.text = message;
}
Kullanıcı Evet veya Hayır düğmesini tıklattığında, closeHandler() yöntemi çağrılır. Aşağıdaki alıntı,
closeHandler() yöntemini gösterir:
function closeHandler(event:CloseEvent):void
{
switch (event.detail)
{
case yesButton:
showFatalError(new FatalError(9999));
break;
case noButton:
statusText.text = "";
hideButtons();
break;
}
}
Kullanıcı Evet'i tıklatarak komut dosyasını durdurmayı seçerse bir FatalError atılarak uygulamanın sonlandırılmasına
neden olur.
Özel bir doğrulayıcı oluşturma
Özel Validator sınıfı tek bir yöntemi içerir: validateEmployeeXML(). validateEmployeeXML() yöntemi,
doğrulamak istediğiniz XML paketi olan tek bir argümanı (employee) alır. validateEmployeeXML() yöntemi
şöyledir:
public static function validateEmployeeXML(employee:XML):void
{
// checks for the integrity of items in the XML
if (employee.costCenter.length() < 1)
{
throw new FatalError(9000);
}
if (employee.costCenter.length() > 1)
{
throw new WarningError(9001);
}
if (employee.ssn.length() != 1)
{
throw new FatalError(9002);
}
}
Bir çalışanın doğrulanması için bir (ve tek) maliyet merkezine ait olması gerekir. Çalışan herhangi bir maliyet
merkezine ait değilse, yöntem bir FatalError atar ve bu da ana uygulama dosyasında validateData() yöntemine
köpürür. Çalışan birden çok maliyet merkezine aitse, bir WarningError atılır. XML doğrulayıcısındaki son denetim,
kullanıcının tanımlanmış bir sosyal güvenlik numarasına sahip olmasıdır (XML paketinde ssn düğümü). Tam olarak
bir ssn düğümü yoksa, bir FatalError hatası atılır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 200
Hataları işleme
Örneğin, ssn düğümünün geçerli bir sayı içerdiğinden veya çalışanın tanımlanmış en az bir telefon numarasının ve eposta adresinin bulunduğundan ve her iki değerin de geçerli olduğundan emin olmak için validateEmployeeXML()
yöntemine ek denetimler ekleyebilirsiniz. Ayrıca her çalışanın benzersiz olan ve yöneticilerinin kimliğini tanımlayan
bir kimliği olacak şekilde XML'i değiştirebilirsiniz.
ApplicationError sınıfını tanımlama
ApplicationError sınıfı hem FatalError hem de WarningError sınıfları için temel hata sınıfı görevini görür.
ApplicationError sınıfı, Error sınıfını genişletir ve hata kimliği, önem derecesi ve özel hata kodlarını ve mesajlarını
içeren bir XML nesnesi de dahil olmak üzere kendi özel yöntemlerini ve özelliklerini tanımlar. Bu sınıf aynı zamanda
her hata türünün önem derecesini tanımlamak için kullanılan iki statik sabiti de tanımlar.
ApplicationError sınıfının yapıcı yöntemi şöyledir:
public function ApplicationError()
{
messages =
<errors>
<error code="9000">
<![CDATA[Employee must be assigned to a cost center.]]>
</error>
<error code="9001">
<![CDATA[Employee must be assigned to only one cost center.]]>
</error>
<error code="9002">
<![CDATA[Employee must have one and only one SSN.]]>
</error>
<error code="9999">
<![CDATA[The application has been stopped.]]>
</error>
</errors>;
}
XML nesnesindeki her hata düğümü benzersiz bir sayısal kod ve hata mesajı içerir. Aşağıdaki getMessageText()
yönteminde de görüldüğü gibi, hata mesajları E4X kullanılarak hata koduna göre kolayca aranabilir:
public function getMessageText(id:int):String
{
var message:XMLList = messages.error.(@code == id);
return message[0].text();
}
getMessageText() yöntemi tek bir tam sayı argümanını (id) alır ve bir dize döndürür. id argümanı, aranacak
hatanın hata kodudur. Örneğin, id olarak 9001 değerinin iletilmesi, çalışanların yalnızca bir maliyet merkezine
atanması gerektiğini belirten hatayı alır. Birden çok hata aynı hata koduna sahipse, ActionScript, yalnızca bulunan
birinci sonucun hata mesajını (döndürülen XMLList nesnesinde message[0]) döndürür.
Bu sınıfta bulunan sonraki yöntem (getTitle()) herhangi bir parametre almaz ve bu belirli hatanın hata kimliğini
içeren bir dize değerini döndürür. XML paketinin doğrulaması sırasında gerçekleşen tam hatayı kolayca
tanımlamanıza yardımcı olmak için bu değer kullanılır. Aşağıdaki alıntı, getTitle() yöntemini gösterir:
public function getTitle():String
{
return "Error #" + id;
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 201
Hataları işleme
ApplicationError sınıfındaki son yöntem şudur: toString(). Bu yöntem, Error sınıfında tanımlanan işlevi geçersiz
kılar, böylece hata mesajının sunumunu özelleştirebilirsiniz. Söz konusu yöntem, oluşan belirli hata sayısını ve
mesajını tanımlayan bir dize döndürür.
public override function toString():String
{
return "[APPLICATION ERROR #" + id + "] " + message;
}
FatalError sınıfını tanımlama
FatalError sınıfı, özel ApplicationError sınıfını genişletir ve üç yöntemi tanımlar: FatalError yapıcısı, getTitle() ve
toString(). Birinci yöntem olan FatalError yapıcısı, tek bir tam sayı argümanını (errorID) alır ve ApplicationError
sınıfında tanımlanan statik sabit değerlerini kullanarak hatanın önem derecesini ayarlar, ardından ApplicationError
sınıfında getMessageText() yöntemini çağırarak belirli hatanın hata mesajını alır. FatalError yapıcısı şöyledir:
public function FatalError(errorID:int)
{
id = errorID;
severity = ApplicationError.FATAL;
message = getMessageText(errorID);
}
FatalError sınıfındaki sonraki yöntem olan getTitle(), ApplicationError sınıfında önceden tanımlanan
getTitle() yöntemini geçersiz kılar ve kullanıcıya kritik bir hata oluştuğunu bildirmek için başlığın sonuna “-FATAL” metnini ekler. getTitle() yöntemi şöyledir:
public override function getTitle():String
{
return "Error #" + id + " -- FATAL";
}
Bu sınıftaki son yöntem olan toString(), ApplicationError sınıfında tanımlanan toString() yöntemini geçersiz
kılar. toString() yöntemi
public override function toString():String
{
return "[FATAL ERROR #" + id + "] " + message;
}
WarningError sınıfını tanımlama
WarningError sınıfı, ApplicationError sınıfını genişletir ve FatalError sınıfıyla neredeyse aynıdır, tek farkı, aşağıdaki
kodda görüldüğü gibi, birkaç küçük dize değişikliğinin yanı sıra hata önem derecesini ApplicationError.FATAL olarak
değil, ApplicationError.WARNING olarak ayarlamasıdır:
public function WarningError(errorID:int)
{
id = errorID;
severity = ApplicationError.WARNING;
message = super.getMessageText(errorID);
}
202
Bölüm 10: Normal ifadeler kullanma
Normal ifade, dizelerde eşleşen metinleri bulup işlemek için kullanılan bir deseni açıklar. Normal ifadeler dizelere
benzer ancak bunlar desenleri ve yinelemeyi açıklamak için özel kodlar içerebilir. Örneğin, aşağıdaki normal ifade, A
karakteriyle başlayan ve arkasından bir veya birkaç sıralı rakam gelen bir dizeyle eşleşir:
/A\d+/
Bu bölümde, normal ifadeler oluşturulmasına yönelik temel sözdizimi açıklanmaktadır. Ancak normal ifadeler birçok
karmaşıklık ve küçük farklar içerebilir. Normal ifadelerle ilgili ayrıntılı kaynakları web'de ve kitapçılarda bulabilirsiniz.
Farklı programlama ortamlarının normal ifadeleri farklı şekillerde uyguladığını unutmayın. ActionScript 3.0, normal
ifadeleri, ECMAScript sürüm 3 dil belirtiminde (ECMA-262) tanımlandığı şekilde uygular.
Normal ifadelerin temelleri
Normal ifadeleri kullanmaya giriş
Normal ifade, karakterlerin bir desenini açıklar. Normal ifadeler genellikle bir metin değerinin belirli bir desene
uyduğunu doğrulamak (örn. kullanıcının girdiği telefon numarasının uygun sayıda basamak içerdiğini doğrulamak)
veya metin değerinin belirli bir desenle eşleşen kısımlarını değiştirmek için kullanılır.
Normal ifadeler basit olabilir. Örneğin, belirli bir dizenin "ABC" ile eşleştiğini doğrulamak istediğinizi veya bir dizede
geçen tüm "ABC" metinlerinin yerine başka bir metin getirmek istediğinizi varsayın. Bu durumda, sırayla A, B ve C
harflerini içeren deseni tanımlayan şu normal ifadeyi kullanabilirsiniz:
/ABC/
Normal ifade değişmezinin eğik çizgi (/) karakteriyle ayrıldığını unutmayın.
Normal ifade desenleri aşağıdaki geçerli e-posta adresiyle eşleşme ifadesi gibi karmaşık ve bazen de şifreli görünebilir:
/([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z][email protected]([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}/
Normal ifadeleri en çok dizelerde desenleri aramak ve karakterleri değiştirmek için kullanırsınız. Bu durumlarda, bir
normal ifade nesnesi oluşturur ve bu nesneyi birçok String sınıfı yöntemlerinden birinin parametresi olarak
kullanırsınız. Aşağıdaki String sınıfı yöntemleri, parametre olarak normal ifadeleri alır: match(), replace(),
search() ve split(). Bu yöntemlerle ilgili daha fazla bilgi için, bkz. “Dizelerdeki desenleri bulma ve alt dizeleri
değiştirme” sayfa 144.
RegExp sınıfı şu yöntemleri içerir: test() ve exec(). Daha fazla bilgi için, bkz. “Dizelerle normal ifadeleri kullanma
yöntemleri” sayfa 216.
Ortak normal ifade görevleri
Normal ifadelerin, bu bölümde ayrıntılı şekilde açıklanan birçok ortak kullanımları vardır:
• Normal ifade deseni oluşturma
• Desenlerde özel karakterler kullanma
• Çoklu karakter sırası tanımlama (örn. “iki basamaklı sayı” veya “yedi ile on harf arasında”)
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 203
Normal ifadeler kullanma
• Harf veya sayı aralığı içinde karakterleri tanımlama (örn. “a ile m arasında herhangi bir harf” )
• Olası bir karakter kümesinde bir karakteri tanımlama
• Sıraları (bir desen içindeki parçalar) tanımlama
• Desenleri esas alarak metin eşleştirme ve değiştirme
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesi, bu bölümde kullanılan önemli terimleri içerir:
• Kaçış karakteri: Ardından gelecek karakterin, değişmez karakter olarak değil, meta karakter olarak
değerlendirilmesi gerektiğini belirten bir karakter. Normal ifade sözdiziminde, ters eğik çizgi (\) kaçış karakteridir,
bu nedenle, ardından başka bir karakter gelen ters eğik çizgi, yalnızca bir karakter değil, özel bir koddur.
• Bayrak: Normal ifade deseninin nasıl kullanılması gerektiği hakkında bazı seçenekleri (örn. büyük harfli ve küçük
harfli karakterler arasında ayrım yapılıp yapılmayacağı) tanımlayan bir karakter.
• Meta karakter: Desende harfi harfine karakteri temsil etmeyip normal ifade deseninde özel bir anlam içeren
karakter.
• Nicelik belirteci: Bir desen bölümünün kaç defa yinelenmesi gerektiğini belirten bir karakter (veya birkaç karakter).
Örneğin, ABD posta kodunun beş veya dokuz sayı içermesi gerektiğini belirtmek için bir nicelik belirteci kullanılır.
• Normal ifade: Diğer dizelerin bir karakter deseniyle eşleştiğini doğrulamak veya dizenin belirli bölümlerini
değiştirmek için kullanılabilecek ilgili karakter desenini tanımlayan bir program deyimi.
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Bu bölümdeki kod listeleri öncelikle
normal ifade desenlerini içerdiğinden, örneklerin test edilmesi için birkaç adım uygulanır:
1 Yeni bir Flash belgesi oluşturun.
2 Bir anahtar kare seçin ve Eylemler panelini açın.
3 Şunun gibi bir RegExp (normal ifade) değişkeni oluşturun:
var pattern:RegExp = /ABC/;
4 Deseni örnekten kopyalayın ve RegExp değişkeninizin değeri olarak atayın. Örneğin, önceki kod satırındaki desen,
eşittir işaretinin sağındaki kodun noktalı virgül hariç olan kısmıdır (/ABC/).
5 Normal ifadenizin test edilmesi için uygun dizeleri içeren bir veya daha fazla String değişkeni oluşturun. Örneğin,
geçerli e-posta adreslerini test etmek için normal bir ifade oluşturuyorsanız, geçerli ve hatalı e-posta adreslerini
içeren birkaç String değişkeni oluşturun:
var goodEmail:String = "[email protected]";
var badEmail:String = "[email protected]$2.99";
6 String değişkenlerinin normal ifade deseniyle eşleşip eşleşmediğiniz test etmek için kod satırları ekleyin. Bunlar,
trace() işlevini kullanarak veya Sahne Alanı'ndaki bir metin alanına yazarak ekrana vermek istediğiniz
değerlerdir.
trace(goodEmail, " is valid:", pattern.test(goodEmail));
trace(badEmail, " is valid:", pattern.test(badEmail));
Örneğin, pattern öğesinin geçerli e-posta adresleri için normal ifade desenini tanımladığı varsayılarak, önceki kod
satırları Çıktı paneline bu metni yazar:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 204
Normal ifadeler kullanma
[email protected] is valid: true
[email protected]$2.99 is valid: false
Değerleri Çıktı panelinde yazdırmak üzere Sahne Alanı'nda metin alanı örneğine değerleri yazarak veya trace()
işlevini kullanarak değerleri test etme hakkında daha fazla bilgi için, bkz. “Bölüm içi örnek kod listelerini test etme”
sayfa 34.
Normal ifade sözdizimi
Bu bölümde, ActionScript normal ifade sözdiziminin tüm öğeleri açıklanmaktadır. Gördüğünüz gibi, normal ifadeler
birçok karmaşıklık ve küçük farklar içerebilir. Normal ifadelerle ilgili ayrıntılı kaynakları web'de ve kitapçılarda
bulabilirsiniz. Farklı programlama ortamlarının normal ifadeleri farklı şekillerde uyguladığını unutmayın.
ActionScript 3.0, normal ifadeleri, ECMAScript sürüm 3 dil belirtiminde (ECMA-262) tanımlandığı şekilde uygular.
Genellikle, basit bir karakterler dizisi yerine daha karmaşık desenlerle eşleşen normal ifadeleri kullanırsınız. Örneğin,
aşağıdaki normal ifade, sırayla A, B, ve C harflerini ve bunların ardından herhangi bir rakamı içeren deseni tanımlar:
/ABC\d/
\d kodu, "herhangi bir rakamı” temsil eder. Eğik çizgi (\) karakteri, kaçış karakteri olarak adlandırılır ve ardından
gelen karakterle (bu durumda d) birlikte, normal ifadede özel bir anlam içerir. Bu bölümde, bu kaçış karakteri sıraları
ve diğer normal ifade sözdizimi özellikleri açıklanmaktadır.
Aşağıdaki normal ifade, ardından herhangi bir rakam (yıldız işaretine dikkat edin) gelen ABC harfleri desenini
tanımlar:
/ABC\d*/
Yıldız karakteri (*) meta karakterdir. Meta karakter, normal ifadelerde özel anlam içeren bir karakterdir. Yıldız, nicelik
belirteci adı verilen özel bir meta karakter türü olup bir karakterin veya karakterler grubunun yineleme sayısını
belirtmek için kullanılır. Daha fazla bilgi için, bkz. “Nicelik belirteçleri” sayfa 209.
Normal ifade, desenine ek olarak, normal ifadenin nasıl eşleşeceğini belirten bayraklar da içerebilir. Örneğin, aşağıdaki
normal ifade, normal ifadenin eşleşen dizelerde büyük/küçük duyarlılığını yoksaydığını belirten i bayrağını kullanır:
/ABC\d*/i
Daha fazla bilgi için, bkz. “Bayraklar ve özellikler” sayfa 213.
Normal ifadeleri şu String sınıfı yöntemleriyle kullanabilirsiniz: match(), replace() ve search(). Bu yöntemlerle
ilgili daha fazla bilgi için, bkz. “Dizelerdeki desenleri bulma ve alt dizeleri değiştirme” sayfa 144.
Normal ifadenin bir örneğini oluşturma
Normal ifade örneği oluşturmanın iki yolu vardır. Birinci yolda, normal ifadeleri ayırmak için eğik çizgi karakterleri
(/) kullanılır; ikinci yolda ise new yapıcısı kullanılır. Örneğin, şu normal ifadeler birbirine eşdeğerdir:
var pattern1:RegExp = /bob/i;
var pattern2:RegExp = new RegExp("bob", "i");
Tırnak işaretlerinin bir dize değişmezini ayırdığı gibi, eğik çizgiler de normal ifade değişmezini ayırır. Normal ifadenin
eğik çizgi içinde kalan kısmı deseni tanımlar. Normal ifade, son ayırıcı eğik çizgiden sonra bayraklar da içerebilir. Bu
bayraklar, normal ifadenin bir parçası olarak değerlendirilir ancak bunlar normal ifadenin deseninden bağımsızdır.
new yapıcısını kullanırken, normal ifadeyi tanımlamak için iki dize kullanırsınız. Aşağıdaki örnekte gösterildiği gibi,
birinci dize deseni tanımlar ve ikinci dize de bayrakları tanımlar:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 205
Normal ifadeler kullanma
var pattern2:RegExp = new RegExp("bob", "i");
Eğik çizgi ayırıcıları kullanılarak tanımlanan bir normal ifade içine eğik çizgi dahil ederken, eğik çizginin önüne ters
eğik çizgi (\) kaçış karakteri getirmeniz gerekir. Örneğin, aşağıdaki normal ifade, 1/2 deseniyle eşleşir:
var pattern:RegExp = /1\/2/;
new yapıcısıyla tanımlanan bir normal ifade içine tırnak işaretleri dahil etmek için, tırnak işaretlerinden önce ters eğik
çizgi (\) kaçış karakteri eklemeniz gerekir (herhangi bir String değişmezi tanımlanırken olduğu gibi). Örneğin,
aşağıdaki normal ifadeler, eat at "joe's" deseniyle eşleşir:
var pattern1:RegExp = new RegExp("eat at \"joe's\"", "");
var pattern2:RegExp = new RegExp('eat at "joe\'s"', "");
Eğik çizgi ayırıcıları kullanılarak tanımlanan normal ifadelerde, tırnak işaretleriyle ters eğik çizgi kaçış karakterini
kullanmayın. Aynı şekilde, new yapıcısıyla tanımlanan normal ifadelerde de eğik çizgilerle kaçış karakterini
kullanmayın. Aşağıdaki normal ifadeler eşdeğerdir ve ikisi de 1/2 "joe's" desenini tanımlar:
var pattern1:RegExp = /1\/2 "joe's"/;
var pattern2:RegExp = new RegExp("1/2 \"joe's\"", "");
var pattern3:RegExp = new RegExp('1/2 "joe\'s"', '');
Ayrıca, new yapıcısıyla tanımlanan bir normal ifadede, \d (herhangi bir rakamla eşleşir) gibi ters eğik çizgi (\)
karakteriyle başlayan bir meta sırası kullanmak için, ters eğik çizgiyi iki defa yazın:
var pattern:RegExp = new RegExp("\\d+", ""); // matches one or more digits
RegExp() yapıcı yönteminin birinci parametresi bir dize olduğundan ve dize değişmezinde tek bir ters eğik çizgi
karakteri olarak tanınması için iki defa ters eğik çizgi yazmanız gerektiğinden, bu durumda ters eğik çizgi karakterini
iki defa yazmanız gerekir.
İlerleyen bölümlerde, normal ifade desenlerinin tanımlanmasına yönelik sözdizimi açıklanmaktadır.
Bayraklar hakkında daha fazla bilgi almak için, bkz. “Bayraklar ve özellikler” sayfa 213.
Karakterler, meta karakterler ve meta sıralar
En basit normal ifade, aşağıdaki örnekte olduğu gibi, bir karakterler sırasıyla eşleşen ifadedir:
var pattern:RegExp = /hello/;
Ancak meta karakterler olarak bilinen şu karakterler, normal ifadelerde özel anlam içerir:
^ $ \ . * + ? ( ) [ ] { } |
Örneğin, aşağıdaki normal ifade, sırayla A harfi, ardından B harfinin sıfır veya birkaç örneği (yıldız meta karakteri bu
yinelemeyi belirtir) ve sonra da C harfi gelen bir desenle eşleşir:
/AB*C/
Bir normal ifade desenine, özel anlamı olmadan bir meta karakter dahil etmek için, ters eğik çizgi (\) kaçış karakterini
kullanmanız gerekir. Örneğin, aşağıdaki normal ifade, sırayla A harfi, B harfi, yıldız işareti ve C harfini içeren bir
desenle eşleşir:
var pattern:RegExp = /AB\*C/;
Meta sıra da meta karakter gibi, normal ifadede özel anlam içerir. Meta sıra bir veya daha çok karakterden oluşur.
İlerleyen bölümlerde, meta karakterlerin ve meta sıraların kullanılmasıyla ilgili ayrıntılar sağlanmaktadır.
Meta karakterler hakkında
Aşağıdaki tabloda, normal ifadelerde kullanabildiğiniz meta karakterler özetlenmektedir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 206
Normal ifadeler kullanma
Meta karakter
Açıklama
^ (şapka)
Dizenin başında eşleşir. m (multiline) bayrağı ayarlanmış durumdayken, şapka karakteri satırın
başlangıcıyla da eşleştirilir (bkz. “Bayraklar ve özellikler” sayfa 213). Karakter sınıfının başında kullanıldığında,
şapka karakterinin dize başlangıcını değil, değilleme belirttiğini unutmayın. Daha fazla bilgi için, bkz.
“Karakter sınıfları” sayfa 207.
$(dolar işareti)
Dizenin sonunda eşleşir. m (multiline) bayrağı ayarlıyken, $ işareti, yeni satır (\n) karakterinden önceki
konumla da eşleşir. Daha fazla bilgi için, bkz. “Bayraklar ve özellikler” sayfa 213.
\ (ters eğik çizgi)
Özel karakterlerin meta karakter anlamından kaçınılmasını sağlar.
Ayrıca, normal ifade değişmezinde eğik çizgi kullanmak istiyorsanız ters eğik çizgi karakterini kullanın, örn.
/1\/2/ (sırayla 1 karakteri, eğik çizgi karakteri ve 2 karakterinden oluşan bir desenle eşleşmek için).
. (nokta)
Herhangi bir tek karakterle eşleşir.
Nokta yalnızca s (dotall) bayrağı ayarlandığında yeni satır karakteriyle (\n) eşleşir. Daha fazla bilgi için, bkz.
“Bayraklar ve özellikler” sayfa 213.
* (yıldız)
Sıfır veya birkaç kere yinelenen önceki öğeyle eşleşir.
Daha fazla bilgi için, bkz. “Nicelik belirteçleri” sayfa 209.
+ (artı)
Bir veya birkaç kere yinelenen önceki öğeyle eşleşir.
Daha fazla bilgi için, bkz. “Nicelik belirteçleri” sayfa 209.
? (soru işareti)
Sıfır veya bir kere yinelenen önceki öğeyle eşleşir.
Daha fazla bilgi için, bkz. “Nicelik belirteçleri” sayfa 209.
( ve )
Normal ifade içindeki grupları tanımlar. Şunlar için grupları kullanın:
•
| değiştiricisinin kapsamını sınırlamak için: /(a|b|c)d/
•
Nicelik belirtecinin kapsamını tanımlamak için: /(walla.){1,2}/
•
Geribaşvurularda. Örneğin, aşağıdaki normal ifadede bulunan \1 öğesi, desenin birinci parantez
grubunda eşleşen her şeyle eşleşir:
•
/(\w*) is repeated: \1/
Daha fazla bilgi için, bkz. “Gruplar” sayfa 210.
[ ve ]
Tek bir karakter için olası eşleşmeleri tanımlayacak şekilde bir karakter sınıfını tanımlar:
/[aeiou]/, belirtilen karakterlerden herhangi biriyle eşleşir.
Karakter sınıfları içinde, karakterlerin aralığını belirlemek için kısa çizgi (-) kullanın:
/[A-Z0-9]/, büyük harfli A - Z veya 0 - 9 ile eşleşir.
Karakter sınıfları içinde, ] ve - karakterlerinin özel anlamından kaçınmak için
ters eğik çizgi ekleyin.
/[+\-]\d+/, bir veya daha çok rakamdan önce gelen + ya da - öğesiyle eşleşir.
Karakter sınıfları için, normalde meta karakter olan diğer karakterler, ters eğik çizgiye gerek kalmadan
normal karakterler (meta karakter olmayan) olarak değerlendirilir:
/[$]/£, $ veya £ öğesiyle eşleşir.
Daha fazla bilgi için, bkz. “Karakter sınıfları” sayfa 207.
| (çubuk)
Sol taraftaki bölümle veya sağ taraftaki bölümle eşleşmek üzere değişim için kullanılır:
/abc|xyz/, abc veya xyz öğesiyle eşleşir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 207
Normal ifadeler kullanma
Meta sıralar hakkında
Meta sıralar, normal bir ifade deseninde özel anlam içeren karakterler sırasıdır. Aşağıdaki tabloda, bu meta sıralar
açıklanmaktadır:
Meta sıra
Açıklama
{n}
Önceki öğe için sayısal nicelik belirtecini veya nicelik belirteci aralığını belirtir:
{n,}
/A{27}/, 27 kere yinelenen A karakteriyle eşleşir.
ve
/A{3,}/, en az 3 kere yinelenen A karakteriyle eşleşir.
{n,n}
/A{3,5}/, 3 ile 5 defa yinelenen A karakteriyle eşleşir.
Daha fazla bilgi için, bkz. “Nicelik belirteçleri” sayfa 209.
\b
Sözcük karakteri ile sözcük olmayan bir karakter arasındaki konumla eşleşir. Dizedeki birinci ve sonuncu
karakter bir sözcükse, ayrıca dizenin başıyla veya sonuyla da eşleşir.
\B
İki sözcük karakteri arasındaki konumda eşleşir. Ayrıca sözcük olmayan iki karakter arasındaki konumla da
eşleşir.
\d
Ondalık bir basamakla eşleşir.
\D
Rakam dışında bir karakterle eşleşir.
\f
Sonraki sayfaya geçme karakteriyle eşleşir.
\n
Yeni satır karakteriyle eşleşir.
\r
Döndürme karakteriyle eşleşir.
\s
Herhangi bir boşluk karakteriyle (boşluk, sekme, yeni satır veya döndürme karakteri) eşleşir.
\S
Boşluk karakteri dışındaki herhangi bir karakterle eşleşir.
\t
Sekme karakteriyle eşleşir.
\unnnn
nnnn onaltılık sayısıyla karakter kodu belirtilmiş Unicode karakteriyle eşleşir. Örneğin, \u263a, gülen yüz
karakteridir.
\v
Dikey besleme karakteriyle eşleşir.
\w
Bir sözcük karakteriyle (AZ–, az–, 0-9 veya _) eşleşir. \w öğesinin, é , ñ veya ç gibi İngilizce olmayan
karakterlerle eşleşmediğini unutmayın.
\W
Sözcük karakteri dışında herhangi bir karakterle eşleşir.
\\xnn
nn onaltılık sayısıyla tanımlandığı şekilde ASCII değeri belirtilmiş karakterle eşleşir.
Karakter sınıfları
Normal ifadedeki tek bir konumla eşleşecek karakterlerin bir listesini belirtmek için karakter sınıflarını kullanırsınız.
Karakter sınıflarını köşeli ayraçlarla ( [ ve ] ) tanımlarsınız. Örneğin, aşağıdaki normal ifade, bag, beg, big, bog veya
bug ile eşleşen bir karakter sınıfını tanımlar:
/b[aeiou]g/
Karakter sınıflarında kaçış sıraları
Normalde bir normal ifadede özel anlamlar içeren meta karakterlerin ve meta sıraların çoğu, karakter sınıfında bu aynı
anlamları içermez. Örneğin, normal bir ifadede, yineleme için yıldız işareti kullanılır, ancak karakter sınıfında yıldız
görüntülendiğinde bu kural geçerli değildir. Aşağıdaki karakter sınıfı, listelenen diğer karakterlerle birlikte harfi
harfine yıldız ile eşleşir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 208
Normal ifadeler kullanma
/[abc*123]/
Ancak, aşağıdaki tabloda listelenen üç karakter, karakter sınıflarında da özel anlamlarını içerecek şekilde meta
karakterler olarak çalışır:
Meta karakter
Karakter sınıflarındaki anlamı
]
Karakter sınıfının sonunu tanımlar.
-
Karakter aralığını tanımlar. (İlerleyen bölümlerdeki "Karakter sınıflarında karakter aralıkları” konusuna bakın.)
\
Meta sıraları tanımlar ve meta karakterlerin özel anlamını geri alır.
Bu karakterlerden herhangi birinin değişmez karakter olarak (özel meta karakter anlamı olmadan) tanınması için,
karakterin önüne ters eğik çizgi kaçış karakterini getirmeniz gerekir. Örneğin, aşağıdaki normal ifade, dört sembolden
herhangi biriyle ($, \, ] veya -) eşleşen bir karakter sınıfını içerir:
/[$\\\]\-]/
Özel anlamlarını koruyan meta karakterlere ek olarak, aşağıdaki meta sıralar da karakter sınıfları içinde meta sıralar
olarak çalışır:
Meta sıra
Karakter sınıflarındaki anlamı
\n
Yeni satır karakteriyle eşleşir.
\r
Döndürme karakteriyle eşleşir.
\t
Sekme karakteriyle eşleşir.
\unnnn
Unicode kod punto değeri (nnnn onaltılık sayısıyla tanımlandığı şekilde) belirtilmiş karakterle eşleşir.
\\xnn
ASCII değeri (nn onaltılık sayısıyla tanımlandığı şekilde) belirtilmiş karakterle eşleşir.
Diğer normal ifade meta sıraları ve meta karakterleri, karakter sınıfı içinde normal karakterler olarak değerlendirilir.
Karakter sınıflarında karakter aralıkları
A-Z, a-z veya 0-9 gibi bir karakter aralığı belirtmek için kısa çizgi kullanın. Bu karakterlerin, karakter kümesi içinde
geçerli bir aralık oluşturması gerekir. Örneğin, aşağıdaki karakter sınıfı, a-z aralığındaki karakterlerden herhangi
biriyle veya bir rakamla eşleşir:
/[a-z0-9]/
ASCII değerine göre bir aralık belirtmek için, \\xnn ASCII karakter kodunu da kullanabilirsiniz. Örneğin, aşağıdaki
karakter sınıfı, genişletilmiş ASCII karakterleri kümesinden herhangi bir karakterle (örn. é ve ê ) eşleşir:
\\x
Değilleme uygulanmış karakter sınıfları
Karakter sınıfının başında bir başlık (^) karakteri kullandığınızda bu, sınıfa değilleme işlemi uygular—listelenmeyen
tüm karakterler bir eşleşme olarak değerlendirilir. Aşağıdaki karakter sınıfı, küçük harfler (az–) veya rakamlar dışında
herhangi bir karakterle eşleşir:
/[^a-z0-9]/
Değillemeyi belirtmek için karakter sınıfının başına şapka (^) karakterini yazmanız gerekir. Aksi takdirde, yalnızca
karakter sınıfındaki karakterlere şapka karakteri eklemiş olursunuz. Örneğin, aşağıdaki karakter sınıfı, şapka da dahil
olmak üzere, sembol karakterlerinden herhangi biriyle eşleşir:
/[!.,#+*%$&^]/
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 209
Normal ifadeler kullanma
Nicelik belirteçleri
Aşağıdaki gibi, desenlerde karakterlerin veya sıraların yinelemesini belirtmek için nicelik belirteçlerini kullanırsınız:
Nicelik belirteci meta
karakteri
Açıklama
* (yıldız)
Sıfır veya birkaç kere yinelenen önceki öğeyle eşleşir.
+ (artı)
Bir veya birkaç kere yinelenen önceki öğeyle eşleşir.
? (soru işareti)
Sıfır veya bir kere yinelenen önceki öğeyle eşleşir.
{n}
Önceki öğe için sayısal nicelik belirtecini veya nicelik belirteci aralığını belirtir:
{n,}
/A{27}/, 27 kere yinelenen A karakteriyle eşleşir.
ve
/A{3,}/, en az 3 kere yinelenen A karakteriyle eşleşir.
{n,n}
/A{3,5}/, 3 ile 5 defa yinelenen A karakteriyle eşleşir.
Tek bir karaktere, karakter sınıfına veya bir gruba nicelik belirteci uygulayabilirsiniz:
•
/a+/, en az bir kere yinelenen a karakteriyle eşleşir.
•
/\d+/, bir veya daha fazla rakamla eşleşir.
•
/[abc]+/, her biri a, b veya c olacak şekilde bir veya birkaç karakterin yinelemesiyle eşleşir.
•
/(very, )*/ , ardından sıfır veya birkaç kere virgül ve boşluk gelen very sözcüğüyle eşleşir.
Nicelik belirteci uygulanmış parantez grupları içinde nicelik belirteçleri kullanabilirsiniz. Örneğin, aşağıdaki nitelik
belirteci, word ve word-word-word öğeleriyle eşleşir:
/\w+(-\w+)*/
Varsayılan olarak, normal ifadeler doyumsuz eşleşme olarak bilinen bir eşleşme gerçekleştirir. Normal ifadedeki
herhangi bir alt desen (örn. .*) normal ifadenin diğer bölümüne ilerlemeden önce dizede olabildiğince çok karakterle
eşleşmeye çalışır. Örneğin, şu normal ifadeyi ve dizeyi göz önünde bulundurun:
var pattern:RegExp = /<p>.*<\/p>/;
str:String = "<p>Paragraph 1</p> <p>Paragraph 2</p>";
Normal ifade, dizenin tamamıyla eşleşir:
<p>Paragraph 1</p> <p>Paragraph 2</p>
Ancak yalnızca tek bir <p>...</p> grubuyla eşleşme yapmak istediğinizi varsayın. Bunu şu şekilde yapabilirsiniz:
<p>Paragraph 1</p>
Herhangi bir nicelik belirtecinden sonra soru işareti (?) ekleyerek, bu nicelik belirtecini tembel nicelik belirteci olarak
değiştirin. Örneğin, tembel *? nicelik belirtecini kullanan şu normal ifade, sırayla <p> ve olabildiğince az sayıda
karakter (tembel) ve sonra </p> içeren bir dizeyle eşleşir:
/<p>.*?<\/p>/
Nicelik belirteçleriyle ilgili olarak şu noktaları unutmayın:
•
{0} ve {0,0} nicelik belirteçleri, bir öğeyi eşleşmeden hariç tutmaz.
•
/abc+*/ öğesinde olduğu gibi, birden çok nicelik belirtecini birleştirmeyin.
• Nokta (.), ardından * nicelik belirteci gelse de, s (dotall) bayrağı ayarlanmadan satırlara yayılmaz. Örneğin, şu
kodu göz önünde bulundurun:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 210
Normal ifadeler kullanma
var str:String = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = /<p>.*<\/p>/;
trace(str.match(re)); // null;
re = /<p>.*<\/p>/s;
trace(str.match(re));
// output: <p>Test
//
Multiline</p>
Daha fazla bilgi için, bkz. “Bayraklar ve özellikler” sayfa 213.
Değiştirme
Normal ifade motorunun eşleşme alternatiflerini göz önünde bulundurmasını sağlamak için, normal ifadede | (boru)
karakterini kullanın. Örneğin, aşağıdaki normal ifade, cat, dog, pig, rat sözcüklerinden herhangi biriyle eşleşir:
var pattern:RegExp = /cat|dog|pig|rat/;
| değiştiricisinin kapsamını kısıtlamak üzere gruplar tanımlamak için parantezler kullanabilirsiniz. Aşağıdaki normal
ifade, ardından nap veya nip gelen cat öğesiyle eşleşir:
var pattern:RegExp = /cat(nap|nip)/;
Daha fazla bilgi için, bkz. “Gruplar” sayfa 210.
Biri | değiştiricisini ve diğeri bir karakter sınıfını kullanan ([ ve ] ile tanımlı) şu iki normal ifade eşdeğerdir:
/1|3|5|7|9/
/[13579]/
Daha fazla bilgi için, bkz. “Karakter sınıfları” sayfa 207.
Gruplar
Aşağıdaki gibi, parantezleri kullanarak normal ifadede bir grup belirtebilirsiniz:
/class-(\d*)/
Grup, bir desenin alt bölümüdür. Şunları yapmak için grupları kullanabilirsiniz:
• Birden çok karaktere nicelik belirteci uygulama.
• Uygulanacak alt desenleri, değiştirme yoluyla (| karakterini kullanarak) ayırma.
• Alt dize eşleşmelerini yakalama (örneğin, önceden eşleşen bir grupla eşleşme sağlamak için normal ifadede \1
öğesini kullanarak veya String sınıfının replace() yönteminde aynı şekilde $1 öğesini kullanarak).
İlerleyen bölümlerde, grupların bu kullanımlarıyla ilgili ayrıntılar sağlanmaktadır.
Nicelik belirteçleriyle grupları kullanma
Bir grup kullanmazsanız, aşağıda gösterildiği gibi, nicelik belirteci kendisinden önceki karakter veya karakter sınıfı için
geçerli olur:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 211
Normal ifadeler kullanma
var pattern:RegExp = /ab*/ ;
// matches the character a followed by
// zero or more occurrences of the character b
pattern = /a\d+/;
// matches the character a followed by
// one or more digits
pattern = /a[123]{1,3}/;
// matches the character a followed by
// one to three occurrences of either 1, 2, or 3
Ancak, birden çok karakter veya karakter sınıfına nicelik belirteci uygulamak için bir grup kullanabilirsiniz:
var pattern:RegExp = /(ab)*/;
// matches zero or more occurrences of the character a
// followed by the character b, such as ababab
pattern = /(a\d)+/;
// matches one or more occurrences of the character a followed by
// a digit, such as a1a5a8a3
pattern = /(spam ){1,3}/;
// matches 1 to 3 occurrences of the word spam followed by a space
Nicelik belirteçleri hakkında daha fazla bilgi için, bkz. “Nicelik belirteçleri” sayfa 209.
Değiştirici (|) karakteriyle grupları kullanma
Aşağıdaki gibi, değiştirici (|) karakteri uygulamak istediğiniz karakterler grubunu tanımlamak için grupları
kullanabilirsiniz:
var pattern:RegExp = /cat|dog/;
// matches cat or dog
pattern = /ca(t|d)og/;
// matches catog or cadog
Alt dize eşleşmelerini yakalamak için grupları kullanma
Bir desende standart bir parantez grubu tanımladığınızda, daha sonra normal ifadede bu gruba başvurabilirsiniz. Bu,
geribaşvuru olarak bilinir ve bu tür gruplar da yakalama grupları olarak adlandırılır. Örneğin, aşağıdaki normal
ifadede \1 sırası, yakalama parantez grubunun eşleştiği tüm alt dizelerle eşleşir:
var pattern:RegExp = /(\d+)-by-\1/;
// matches the following: 48-by-48
\1, \2, ... , \99 yazarak normal ifadede bu geribaşvuruların en fazla 99 tanesini belirtebilirsiniz.
Aynı şekilde, String sınıfının replace() yönteminde, yerini alan dizeye yakalanan grup alt dizesi eşleşmelerini
eklemek için $1$99 öğesini kullanabilirsiniz:
var pattern:RegExp = /Hi, (\w+)\./;
var str:String = "Hi, Bob.";
trace(str.replace(pattern, "$1, hello."));
// output: Bob, hello.
Ayrıca, yakalama gruplarını kullanırsanız, RegExp sınıfının exec() yöntemi ve String sınıfının match() yöntemi,
yakalama gruplarıyla eşleşen alt dizeleri döndürür:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 212
Normal ifadeler kullanma
var pattern:RegExp = /(\w+)@(\w+).(\w+)/;
var str:String = "[email protected]";
trace(pattern.exec(str));
// [email protected],bob,example,com
Yakalama yapmayan grupları ve ileri yönlü grupları kullanma
Yakalama yapmayan grup, yalnızca gruplandırma için kullanılır; "toplanmaz" ve numaralandırılmış geribaşvurularla
eşleşmez. Yakalama yapmayan grupları tanımlamak için şu şekilde (?: ve ) öğelerini kullanın:
var pattern = /(?:com|org|net);
Örneğin, bir yakalama grubuna ve yakalama yapmayan gruba (com|org) öğesinin koyulması arasındaki farka dikkat
edin (exec() yöntemi, tam eşleşmeden sonra yakalama gruplarını listeler):
var pattern:RegExp = /(\w+)@(\w+).(com|org)/;
var str:String = "[email protected]";
trace(pattern.exec(str));
// [email protected],bob,example,com
//noncapturing:
var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/;
var str:String = "[email protected]";
trace(pattern.exec(str));
// [email protected],bob,example
Yakalama yapmayan grubun özel bir türü ileri yönlü grup olup bunun da iki türü vardır: pozitif ileri yönlü grup ve
negatif ileri yönlü grup.
Gruptaki alt desenin konumda eşleşmesi gerektiğini belirten bir pozitif ileri yönlü grup tanımlamak için (?= ve )
öğelerini kullanın. Ancak, dizenin pozitif ileri yönlü grupla eşleşen kısmı, normal ifadede kalan diğer desenlerle
eşleşebilir. Örneğin, aşağıdaki kodda (?=e) bir pozitif ileri yönlü grup olduğundan, bunun eşleştiği e karakteri,
normal ifadenin sonraki kısmıyla da (bu durumda yakalama grubu, \w*)) eşleşebilir:
var pattern:RegExp = /sh(?=e)(\w*)/i;
var str:String = "Shelly sells seashells by the seashore";
trace(pattern.exec(str));
// Shelly,elly
Gruptaki alt desenin konumda eşleşmemesi gerektiğini belirten bir negatif ileri yönlü grup tanımlamak için, (?! ve )
öğelerini kullanın. Örneğin:
var pattern:RegExp = /sh(?!e)(\w*)/i;
var str:String = "She sells seashells by the seashore";
trace(pattern.exec(str));
// shore,ore
Adlandırılmış grupları kullanma
Adlandırılmış grup, normal ifadede, adlandırılmış bir tanımlayıcı verilmiş grup türüdür. Adlandırılmış grubu
tanımlamak için, (?P<name> ve ) öğelerini kullanın. Örneğin, aşağıdaki normal ifade, digits adında tanımlayıcıyla
adlandırılmış bir grup içerir:
var pattern = /[a-z]+(?P<digits>\d+)[a-z]+/;
exec() yöntemini kullandığınızda, eşleşen ada sahip bir grup result dizisinin bir özelliği olarak eklenir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 213
Normal ifadeler kullanma
var myPattern:RegExp = /([a-z]+)(?P<digits>\d+)[a-z]+/;
var str:String = "a123bcd";
var result:Array = myPattern.exec(str);
trace(result.digits); // 123
Aşağıda, name ve dom tanımlayıcılarıyla, adlandırılmış iki grup kullanan başka bir örnek verilmiştir:
var emailPattern:RegExp =
/(?P<name>(\w|[_.\-])+)@(?P<dom>((\w|-)+))+\.\w{2,4}+/;
var address:String = "[email protected]";
var result:Array = emailPattern.exec(address);
trace(result.name); // bob
trace(result.dom); // example
Not: Adlandırılmış gruplar, ECMAScript dil belirtiminin parçası değildir. Bunlar ActionScript 3.0'a eklenen bir
özelliktir.
Bayraklar ve özellikler
Aşağıdaki tabloda, normal ifadeler için ayarlayabildiğiniz beş bayrak listelenmektedir. Normal ifade nesnesinin bir
özelliği olarak her bayrağa erişilebilir.
Bayrak
Özellik
Açıklama
g
global
Birden çok eşleşme yapar.
i
ignoreCase
Büyük/küçük harf duyarlı eşleşme. A—Z ve a—z karakterleri için geçerlidir ancak É ve é gibi
genişletilmiş karakterler için geçerli değildir.
m
multiline
Bu bayrak ayarlıyken, $ ve ^ öğeleri sırayla bir satırın başıyla ve bir satırın sonuyla eşleşebilir.
s
dotall
Bu bayrak ayarlıyken, . (nokta), yeni satır karakteriyle (\n) eşleşebilir.
x
extended
Genişletilmiş normal ifadelere izin verir. Desenin parçası olarak yoksayılan boşlukları normal ifadeye
yazabilirsiniz. Bu, normal ifade kodunuzu daha okunaklı yazmanıza olanak sağlar.
Bu özelliklerin salt okunur olduğunu unutmayın. Aşağıdaki gibi, normal ifade değişkeni ayarladığınızda, bayrakları (g,
i, m, s, x) ayarlayabilirsiniz:
var re:RegExp = /abc/gimsx;
Ancak, adlandırılmış özellikleri doğrudan ayarlayamazsınız. Örneğin, aşağıdaki kod bir hataya yol açar:
var re:RegExp = /abc/;
re.global = true; // This generates an error.
Varsayılan olarak, bayrakları normal ifade bildiriminde belirtmemeniz durumunda, bayraklar ayarlanmaz ve karşılık
gelen özellikler de false değerine ayarlanır.
Ayrıca, normal ifadenin iki başka özelliği daha vardır:
•
lastIndex özelliği, normal ifadenin exec() veya test() yöntemine yapılan sonraki çağrı için dizede kullanılacak
dizin konumunu belirtir.
•
source özelliği, normal ifadenin desen bölümünü tanımlayan dizeyi belirtir.
g (global) bayrağı
g (global) bayrağı dahil edilmediğinde, normal ifade birden çok eşleşme yapmaz. Örneğin, normal ifadeye g bayrağı
dahil edilmediğinde, String.match() yöntemi yalnızca bir eşleşen alt dize döndürür:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 214
Normal ifadeler kullanma
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/;
trace(str.match(pattern)) // output: she
g bayrağı ayarlandığında, Sting.match() yöntemi aşağıdaki gibi birden çok eşleşme döndürür:
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/g;
// The same pattern, but this time the g flag IS set.
trace(str.match(pattern)); // output: she,shells,shore
i (ignoreCase) bayrağı
Varsayılan olarak, normal ifade eşleşmeleri büyük/küçük harf duyarlıdır. i (ignoreCase) bayrağını ayarladığınızda,
büyük/küçük harf duyarlılığı yoksayılır. Örneğin, normal ifadedeki küçük harfli s öğesi, dizenin birinci karakteri olan
büyük harfli S öğesiyle eşleşmez:
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/)); // output: 13 -- Not the first character
Ancak i bayrağı ayarlıyken, normal ifade, baş harf olan S öğesiyle eşleşir:
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/i)); // output: 0
i bayrağı yalnızca A–Z ve a–z karakterleri için büyük/küçük harf duyarlılığını yoksayar ancak É ve é gibi genişletilmiş
karakterler için büyük/küçük duyarlılığını uygulamaya devam eder.
m (multiline) bayrağı
m (multiline) bayrağı ayarlanmazsa, ^ öğesi dizenin başıyla ve $ öğesi de dizenin sonuyla eşleşir. m bayrağı
ayarlanırsa, bu karakterler sırayla satırın başıyla ve satırın sonuyla eşleşir. Bir yeni satır karakteri içeren şu dizeyi göz
önünde bulundurun:
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/g)); // Match a word at the beginning of the string.
Normal ifadede g (global) bayrağı ayarlansa da, ^ için yalnızca bir eşleşme (dizenin başı) bulunduğundan, match()
yöntemi yalnızca bir alt dizeyle eşleşir. Çıktı şudur:
Test
Burada, aynı kod m bayrağı ayarlanmış şekilde verilmiştir:
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/gm)); // Match a word at the beginning of lines.
Bu defa, çıktı her iki satırın başındaki sözcükleri içerir:
Test,Multiline
Yalnızca \n karakterinin satır sonunu işaret ettiğini unutmayın. Aşağıdaki karakterler satır sonunu işaret etmez:
• Döndürme (\r) karakteri
• Unicode satır ayırıcı (\u2028) karakteri
• Unicode paragraf ayırıcı (\u2029) karakteri
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 215
Normal ifadeler kullanma
s (dotall) bayrağı
s (dotall veya “dot all”) bayrağı ayarlanmazsa, normal ifadedeki bir nokta (.) yeni satır karakteriyle (\n) eşleşmez.
Bu nedenle de aşağıdaki örnekte bir eşleşme yoktur:
var str:String = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = /<p>.*?<\/p>/;
trace(str.match(re));
Ancak, s bayrağı ayarlanırsa, nokta yeni satır karakteriyle eşleşir:
var str:String = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = /<p>.*?<\/p>/s;
trace(str.match(re));
Bu durumda eşleşme, yeni satır karakteri de dahil olacak şekilde <p> etiketleri içindeki alt dizenin tamamı olur:
<p>Test
Multiline</p>
x (extended) bayrağı
Özellikle de çok fazla meta sembol ve meta sıralar içeriyorsa, normal ifadelerin okunması zor olabilir. Örneğin:
/<p(>|(\s*[^>]*>)).*?<\/p>/gi
Normal ifadede x (extended) bayrağını kullandığınızda, desene yazdığınız tüm boşluklar yoksayılır. Örneğin,
aşağıdaki normal ifade bir önceki örnekle aynıdır:
/
<p
(>
|
(\s*
[^>]*
>))
.*?
<\/p>
/gix
x bayrağı ayarlanmışsa ve boşluk karakteriyle eşleşme olmasını istiyorsanız, boşluğun önüne ters eğik çizgi getirin.
Örneğin, şu iki normal ifade birbirine eşdeğerdir:
/foo bar/
/foo \ bar/x
lastIndex özelliği
lastIndex özelliği, dizede, bir sonraki aramanın başlayacağı dizin konumunu belirtir. Bu özellik, g bayrağı true
değerine ayarlanmış bir normal ifadede çağrılan exec() ve test() yöntemlerini etkiler. Örneğin, şu kodu göz
önünde bulundurun:
var pattern:RegExp = /p\w*/gi;
var str:String = "Pedro Piper picked a peck of pickled peppers.";
trace(pattern.lastIndex);
var result:Object = pattern.exec(str);
while (result != null)
{
trace(pattern.lastIndex);
result = pattern.exec(str);
}
lastIndex özelliği varsayılan olarak 0 değerine ayarlanır (aramayı dizenin başından başlatmak için). Her eşleşmeden
sonra, bu özellik eşleşmeden sonraki dizin konumuna ayarlanır. Bu nedenle de önceki kodun çıktısı şöyledir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 216
Normal ifadeler kullanma
0
5
11
18
25
36
44
global bayrağı false değerine ayarlanırsa, exec() ve test() yöntemleri lastIndex özelliğini kullanmaz veya
ayarlamaz.
String sınıfının match(), replace() ve search() yöntemlerinin tümü, yöntem çağrısında kullanılan normal ifadenin
lastIndex özelliğinin ayarına bakılmaksızın, tüm aramaları dizenin başından başlatır. (Ancak, match() yöntemi
lastIndex öğesini 0 değerine ayarlar.)
lastIndex özelliğini normal ifade eşlemesi için dizedeki başlangıç konumunu belirlemek üzere ayarlayabilirsiniz.
source özelliği
source özelliği, normal ifadenin desen bölümünü tanımlayan dizeyi belirtir. Örneğin:
var pattern:RegExp = /foo/gi;
trace(pattern.source); // foo
Dizelerle normal ifadeleri kullanma yöntemleri
RegExp sınıfı iki yöntem içerir: exec() ve test().
String sınıfı, RegExp sınıfının exec() ve test() yöntemlerine ek olarak, dizelerde normal ifadelerle eşleşme
yapmanıza olanak sağlayan şu yöntemleri de içerir: match(), replace(), search() ve splice().
test() yöntemi
RegExp sınıfının test() yöntemi, aşağıdaki örnekte gösterildiği gibi, sağlanan dizede normal ifadeyle eşleşme olup
olmadığını kontrol eder:
var pattern:RegExp = /Class-\w/;
var str = "Class-A";
trace(pattern.test(str)); // output: true
exec() yöntemi
RegExp sınıfının exec() yöntemi, sağlanan dizede normal ifadeyle eşleşme olup olmadığını kontrol eder ve şunlarla
bir dizi döndürür:
• Eşleşen alt dize
• Normal ifadede herhangi bir parantez grubuyla alt dize eşleşmeleri
Dizi ayrıca, alt dize eşleşmesinin başının dizin konumunu belirten bir index özelliğini de içerir.
Örneğin, şu kodu göz önünde bulundurun:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 217
Normal ifadeler kullanma
var pattern:RegExp = /\d{3}\-\d{3}-\d{4}/; //U.S phone number
var str:String = "phone: 415-555-1212";
var result:Array = pattern.exec(str);
trace(result.index, " - ", result);
// 7-415-555-1212
Normal ifade için g (global) bayrağı ayarlandığında, birden çok alt dizeyle eşleşme yapmak için birçok defa exec()
yöntemini kullanın:
var pattern:RegExp = /\w*sh\w*/gi;
var str:String = "She sells seashells by the seashore";
var result:Array = pattern.exec(str);
while (result != null)
{
trace(result.index, "\t", pattern.lastIndex, "\t", result);
result = pattern.exec(str);
}
//output:
// 0 3 She
// 10 19 seashells
// 27 35 seashore
RegExp parametrelerini kullanan String yöntemleri
Aşağıdaki String sınıfı yöntemleri, parametre olarak normal ifadeleri alır: match(), replace(), search() ve
split(). Bu yöntemlerle ilgili daha fazla bilgi için, bkz. “Dizelerdeki desenleri bulma ve alt dizeleri değiştirme”
sayfa 144.
Örnek: Wiki ayrıştırıcı
Bu basit Wiki metin dönüştürme örneğinde, birçok normal ifade kullanımı gösterilmektedir:
• Kaynak Wiki deseniyle eşleşen metin satırlarını uygun HTML çıktı dizelerine dönüştürme.
• URL desenlerini HTML <a> köprüsü etiketlerine dönüştürmek için normal ifade kullanma.
• ABD doları dizelerini (örn. "$9.95") euro dizelerine (örn. "8.24
€") dönüştürmek için normal ifade kullanma.
Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.
WikiEditor uygulama dosyalarını Samples/WikiEditor klasöründe bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:
Dosya
Açıklama
WikiEditor.mxml
Flash (FLA) veya Flex (MXML) içindeki ana uygulama
dosyası.
veya
WikiEditor.fla
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 218
Normal ifadeler kullanma
Dosya
Açıklama
com/example/programmingas3/regExpExamples/WikiParser.as
Wiki girdi metni desenlerini eşdeğer HTML çıktısına
dönüştürmek için normal ifadeleri kullanan yöntemleri
içeren bir sınıf.
com/example/programmingas3/regExpExamples/URLParser.as
URL dizelerini HTML <a> köprüsü etiketlerine
dönüştürmek için normal ifadeleri kullanan yöntemleri
içeren bir sınıf.
com/example/programmingas3/regExpExamples/CurrencyConverter.as
ABD doları dizelerini euro dizelerine dönüştürmek için
normal ifadeleri kullanan yöntemleri içeren bir sınıf.
WikiParser sınıfını tanımlama
WikiParser sınıfı, Wiki girdi metnini eşdeğer HTML çıktısına dönüştüren yöntemleri içerir. Bu çok güçlü bir Wiki
dönüştürme uygulaması değildir ancak desen eşleştirme ve dize dönüştürmesi için normal ifadelerin bazı
kullanımlarını gösterir.
setWikiData() yöntemiyle birlikte yapıcı işlevi yalnızca aşağıdaki gibi Wiki girdi metninin örnek bir dizesini başlatır:
public function WikiParser()
{
wikiData = setWikiData();
}
Kullanıcı örnek uygulamada Test Et düğmesini tıklattığında, uygulama, WikiParser nesnesinin parseWikiString()
yöntemini çağırır. Bu yöntem, başka birçok yöntemi çağırır ve bu yöntemler de daha sonra sonuçta elde edilen HTML
dizesini oluşturur.
public function parseWikiString(wikiString:String):String
{
var result:String = parseBold(wikiString);
result = parseItalic(result);
result = linesToParagraphs(result);
result = parseBullets(result);
return result;
}
Çağrılan yöntemlerin her biri (parseBold(), parseItalic(), linesToParagraphs() ve parseBullets()), girdi
Wiki metnini HTML olarak formatlanmış metne dönüştürmek üzere bir normal ifade tarafından tanımlandığı şekilde,
eşleşen desenleri değiştirmek için dizenin replace() yöntemini kullanır.
Kalın ve italik desenleri dönüştürme
parseBold() yöntemi bir Wiki kalın metin desenini (örn. '''foo''') arar ve bu metin desenini şu şekilde HTML
eşdeğerine (örn. <b>foo</b>) dönüştürür:
private function parseBold(input:String):String
{
var pattern:RegExp = /'''(.*?)'''/g;
return input.replace(pattern, "<b>$1</b>");
}
Normal ifadenin (.?*) bölümünün, iki tanımlayıcı ''' deseni arasındaki herhangi sayıda karakterle (*) eşleştiğini
unutmayı. ? nicelik belirteci eşleşmeyi tembel durumuna getirir, bu nedenle, '''aaa''' bbb '''ccc''' gibi bir dize
için eşleşen birinci dize '''aaa''' olup dizenin tamamı olmaz (''' deseniyle başlayıp sona eren).
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 219
Normal ifadeler kullanma
Normal ifadedeki parantezler bir yakalama grubunu ifade eder ve replace() yöntemi, yerini alan dizede $1 kodunu
kullanarak bu gruba başvurur. Normal ifadedeki g (global) bayrağı, replace() yönteminin dizedeki tüm eşleşmeleri
(yalnızca birinciyi değil) değiştirmesini sağlar.
parseItalic() yöntemi parseBold() yöntemine benzer şekilde çalışır, tek farkı, italik metin sınırlayıcısı olarak iki
kesme işaretini ('') (üç değil) kontrol etmesidir:
private function parseItalic(input:String):String
{
var pattern:RegExp = /''(.*?)''/g;
return input.replace(pattern, "<i>$1</i>");
}
Madde imi desenlerini dönüştürme
Aşağıdaki örnekte gösterildiği gibi, parseBullet() yöntemi, bir Wiki madde imi satır desenini (örn. * foo) arar ve
bunu HTML eşdeğerine (örn. <li>foo</li>) dönüştürür:
private function parseBullets(input:String):String
{
var pattern:RegExp = /^\*(.*)/gm;
return input.replace(pattern, "<li>$1</li>");
}
Normal ifadenin başındaki ^ sembolü, satırın başıyla eşleşir. Normal ifadedeki m (multiline) bayrağı, normal
ifadenin ^ sembolünü yalnızca dizenin başıyla değil, satırın başıyla da eşleştirmesini sağlar.
\* deseni, bir yıldız karakteriyle eşleşir. (* nicelik belirteci yerine değişmez yıldızı işaret etmek için ters eğik çizgi
kullanılmıştır.)
Normal ifadedeki parantezler bir yakalama grubunu tanımlar ve replace() yöntemi, yerini alan dizede $1 kodunu
kullanarak bu gruba başvurur. Normal ifadedeki g (global) bayrağı, replace() yönteminin dizedeki tüm eşleşmeleri
(yalnızca birinciyi değil) değiştirmesini sağlar.
Paragraf Wiki desenlerini dönüştürme
linesToParagraphs() yöntemi, girdi Wiki dizesindeki her satırı bir HTML <p> paragraf etiketine dönüştürür.
Yöntemdeki bu satırlar, girdi Wiki dizesinden boş satırları çıkarır:
var pattern:RegExp = /^$/gm;
var result:String = input.replace(pattern, "");
Normal ifadenin, satırın başını ve sonunu eşleştirdiği ^ ve $ sembolleri. Normal ifadedeki m (multiline) bayrağı,
normal ifadenin ^ sembolünü yalnızca dizenin başıyla değil satırın başıyla da eşleştirmesini sağlar.
replace() yöntemi, eşleşen tüm alt dizelerin yerine (boş satırlar) boş bir dize ("") getirir. Normal ifadedeki g
(global) bayrağı, replace() yönteminin dizedeki tüm eşleşmeleri (yalnızca birinciyi değil) değiştirmesini sağlar.
URL'leri HTML <a> etiketlerine dönüştürme
Kullanıcı, urlToATag onay kutusunu seçmişse, örnek uygulamada Test Et düğmesini tıklattığında, uygulama, URL
dizelerini girdi Wiki dizesinden HTML <a> etiketlerine dönüştürmek için URLParser.urlToATag() statik yöntemini
çağırır
var
var
var
var
var
protocol:String = "((?:http|ftp)://)";
urlPart:String = "([a-z0-9_-]+\.[a-z0-9_-]+)";
optionalUrlPart:String = "(\.[a-z0-9_-]*)";
urlPattern:RegExp = new RegExp(protocol + urlPart + optionalUrlPart, "ig");
result:String = input.replace(urlPattern, "<a href='$1$2$3'><u>$1$2$3</u></a>");
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 220
Normal ifadeler kullanma
RegExp() yapıcı işlevi, çok sayıda bileşenden tek bir normal ifade (urlPattern) oluşturmak için kullanılır. Bu
bileşenlerin her biri, normal ifade deseninin parçasını tanımlayan dizelerdir.
protocol dizesi tarafından tanımlanan normal ifade deseninin birinci bölümü, http:// veya ftp:// olmak üzere
bir URL protokolünü tanımlar. Parantezler, ? sembolüyle belirtilen, yakalama yapmayan bir grubu tanımlar. Başka bir
deyişle, parantezler yalnızca | değiştirme desenine yönelik bir grubu tanımlamak için kullanılır; bu grup, replace()
yönteminin yerini alan dizesinde geribaşvuru kodlarıyla ($1, $2, $3) eşleşmez.
Normal ifadeyi oluşturan diğer bileşenlerin her biri, daha sonra replace() yönteminin yerini alan dizesindeki
geribaşvuru kodlarında ($1, $2, $3) kullanılan yakalama gruplarını (desende parantezlerle belirtilir) kullanır.
Desenin, urlPart dizesi tarafından tanımlanan bölümü, şu karakterlerden en az biriyle eşleşir: a-z, 0-9, _ veya -. +
nicelik belirteci, en az bir karakterin eşleştiğini belirtir. \. öğesi, zorunlu bir nokta (.) karakterini belirtir. Ve geri kalan
kısım da bu karakterlerden en az birini içeren bir dizeyle eşleşir: a-z, 0-9, _ veya -.
Desenin, optionalUrlPart dizesiyle tanımlanan bölümü, şunlardan hiçbiriyle veya bir ya da birkaç tanesiyle eşleşir:
nokta (.) karakteri ve onu takip eden herhangi bir sayıda alfasayısal karakter (_ ve - dahil). * nicelik belirteci, bu
karakterlerden hiçbirinin eşleşmediğini veya bir ya da birkaçının eşleştiğini belirtir.
replace() yöntemine yapılan çağrı, normal ifadeyi kullanır ve geribaşvuruları kullanarak, yerini alan HTML dizesini
oluşturur.
Daha sonra urlToATag() yöntemi, e-posta desenlerini, HTML <a> köprü dizeleriyle değiştirme tekniğine benzer
teknikler kullanan emailToATag() yöntemini çağırır. Bu örnek dosyada HTTP, FTP ve e-posta URL'leriyle eşleşme
yapmak için kullanılan normal ifadeler, örneklendirme amacıyla nispeten basit tutulmuştur; bu URL'lerin daha doğru
şekilde eşleştirilmesi için daha karmaşık normal ifadeler vardır.
ABD doları dizelerini euro dizelerine dönüştürme
Kullanıcı dollarToEuro onay kutusunu seçmişse, örnek uygulamadaki Test Et düğmesini tıklattığında, aşağıdaki gibi
uygulama, ABD doları dizelerini (örn. "$9.95") euro dizelerine (örn. "8.24 €") dönüştürmek için,
CurrencyConverter.usdToEuro() statik yöntemini çağırır:
var usdPrice:RegExp = /\$([\d,]+.\d+)+/g;
return input.replace(usdPrice, usdStrToEuroStr);
Birinci satır, ABD doları dizelerinin eşleşmesi için basit bir deseni tanımlar. $ karakterinin önüne ters eğik çizgi (\)
kaçış karakterinin getirildiğine dikkat edin.
replace() yöntemi, desen eşleştirici olarak normal ifadeyi kullanır ve yerini alacak dizeyi (euro cinsinden bir değer)
belirlemek için usdStrToEuroStr() işlevini çağırır.
replace() yönteminin ikinci parametresi olarak bir işlev adı kullanıldığında, çağrılan işleve parametre olarak şunlar
iletilir:
• Dizenin eşleşen bölümü.
• Herhangi bir yakalanmış parantez grubu eşleşmesi. Bu şekilde iletilen argüman sayısı, yakalanan parantez grubu
eşleşmelerinin sayısına bağlı olarak değişiklik gösterir. İşlev kodu içinde arguments.length - 3 öğesini kontrol
ederek, yakalanmış parantez grubu eşleşmelerinin sayısını belirleyebilirsiniz.
• Eşlemenin başladığı dize içindeki dizin konumu.
• Tam dize.
usdStrToEuroStr() yöntemi şu şekilde ABD doları dize desenlerini euro dizelerine dönüştürür:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 221
Normal ifadeler kullanma
private function usdToEuro(...args):String
{
var usd:String = args[1];
usd = usd.replace(",", "");
var exchangeRate:Number = 0.828017;
var euro:Number = Number(usd) * exchangeRate;
trace(usd, Number(usd), euro);
const euroSymbol:String = String.fromCharCode(8364); // €
return euro.toFixed(2) + " " + euroSymbol;
}
args[1] öğesinin, usdPrice normal ifadesinin eşleştiği yakalanmış parantez grubunu temsil ettiğini unutmayın. Bu,
ABD doları dizesinin sayısal bölümüdür: başka bir deyişle, $ işareti olmadan dolar miktarıdır. Bu yöntem, döviz kuru
dönüştürmesi uygular ve bir sonuç dizesi (başında $ sembolü yerine, sonunda € sembolü bulunan) döndürür.
222
Bölüm 11: XML ile çalışma
ActionScript 3.0, XML için ECMAScript (E4X) belirtimini (ECMA-357 sürüm 2) esas alan bir sınıflar grubunu içerir.
Bu sınıflar, XML verileriyle çalışılmasına yönelik güçlü ve kullanımı kolay işlevler sağlar. E4X'i kullanarak, önceki
programlama teknikleriyle mümkün olandan daha hızlı şekilde XML verileriyle kod geliştirebilirsiniz. Ek bir avantaj
olarak, oluşturduğunuz kodun okunması daha da kolay olur.
Bu bölümde, XML verilerini işlemek için E4X'in nasıl kullanıldığı açıklanmaktadır.
XML temelleri
XML ile çalışmaya giriş
XML, yapılandırılmış bilgilerin bilgisayarların birlikte çalışmasını ve insanların yazmasını ve anlamasını
kolaylaştıracak şekilde temsil edilmesinin standart bir yoludur. XML, eXtensible Markup Language'in kısaltmasıdır.
XML standardı, www.w3.org/XML/ adresinde bulunabilir.
XML, verinin okunmasını, işlenmesini ve veriye erişilmesini kolaylaştırmak için verilerin sınıflandırılmasına yönelik
standart ve kullanışlı bir yol sunar. XML, bir ağaç yapısını ve HTML'e benzeyen bir etiket yapısını kullanır. Aşağıda,
XML verisinin basit bir örneği verilmiştir:
<song>
<title>What you know?</title>
<artist>Steve and the flubberblubs</artist>
<year>1989</year>
<lastplayed>2006-10-17-08:31</lastplayed>
</song>
XML verileri, diğer etiketler içine yuvalanmış etiketler, nitelikler ve diğer yapısal bileşenlerle daha karmaşık da olabilir.
Aşağıda, XML verisinin daha karmaşık bir örneği verilmiştir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 223
XML ile çalışma
<album>
<title>Questions, unanswered</title>
<artist>Steve and the flubberblubs</artist>
<year>1989</year>
<tracks>
<song tracknumber="1" length="4:05">
<title>What do you know?</title>
<artist>Steve and the flubberblubs</artist>
<lastplayed>2006-10-17-08:31</lastplayed>
</song>
<song tracknumber="2" length="3:45">
<title>Who do you know?</title>
<artist>Steve and the flubberblubs</artist>
<lastplayed>2006-10-17-08:35</lastplayed>
</song>
<song tracknumber="3" length="5:14">
<title>When do you know?</title>
<artist>Steve and the flubberblubs</artist>
<lastplayed>2006-10-17-08:39</lastplayed>
</song>
<song tracknumber="4" length="4:19">
<title>Do you know?</title>
<artist>Steve and the flubberblubs</artist>
<lastplayed>2006-10-17-08:44</lastplayed>
</song>
</tracks>
</album>
Bu XML belgesinin, içinde başka XML yapıları da (örn. alt öğeleri içinde song etiketleri) barındırdığına dikkat edin.
Bu ayrıca veri yerine başka etiketler içeren nitelikler (song etiketlerindeki tracknumber ve length nitelikleri) ve
etiketler (örn. tracks etiketi) gibi diğer XML yapılarını da gösterir.
XML ile çalışmaya başlama
XML ile ilgili çok az deneyiminiz varsa veya hiç deneyiminiz yoksa, XML verilerinin en yaygın yönleri burada kısaca
açıklanmıştır. XML verileri, bilgilerin yapılandırılmış bir formatta organize edilmesi için belirli bir sözdizimi
kullanılarak düz metin biçiminde yazılır. Genellikle, tek bir XML verisi kümesi, XML belgesi olarak bilinir. XML
formatında, veriler hiyerarşik bir yapı kullanılarak öğeler (bunlar tek veri öğeleri veya diğer öğeleri içeren konteynerler
olabilir) halinde organize edilir. Her XML belgesi, üst düzey veya ana öğe olarak tek bir öğeye sahiptir; bu kök öğenin
içinde diğer öğeleri içeren başka öğeler bulunabileceği gibi tek bir bilgi de bulunabilir. Örneğin, bu XML belgesi, bir
müzik albümüyle ilgili bilgileri içerir:
<song tracknumber="1" length="4:05">
<title>What do you know?</title>
<artist>Steve and the flubberblubs</artist>
<mood>Happy</mood>
<lastplayed>2006-10-17-08:31</lastplayed>
</song>
Her öğe, bir etiketler kümesiyle ayrılır—öğenin adı, açılı ayraçlar (küçüktür ve büyüktür işaretleri) içine sarılır. Öğenin
başlangıcını belirten açma etiketi, öğe adını içerir:
<title>
Öğenin sonunu belirten kapatma etiketi, öğe adından önce eğik çizgi içerir:
</title>
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 224
XML ile çalışma
Bir öğe içerik barındırmıyorsa, boş bir öğe olarak yazılabilir. (Bazen kendiliğinden kapanan öğe olarak adlandırılır.)
XML'de bu öğe:
<lastplayed/>
bu öğeyle aynıdır:
<lastplayed></lastplayed>
Bir öğe, açma ve kapatma etiketleri arasında bulunan içeriğine ek olarak, öğenin açma etiketinde tanımlanan ve
nitelikler olarak bilinen başka değerler de içerebilir. Örneğin, bu XML öğesi, "4:19" değerine sahip length adındaki
tek bir niteliği tanımlar:
<song length="4:19"></song>
Her XML öğesi, tek bir değer veya bir ya da birkaç XML öğesi barındıran ya da herhangi bir şey barındırmayan (boş
bir öğe için) bir içeriğe sahiptir.
XML hakkında daha fazla bilgi
XML ile çalışma hakkında daha fazla bilgi almak için, aralarında şu web sitelerinin de bulunduğu birçok ek kitap ve
kaynak vardır:
• W3Schools XML Öğreticisi: http://w3schools.com/xml/
• XML.com: http://www.xml.com/
• XMLpitstop öğreticileri, tartışma listeleri ve daha fazlası: http://xmlpitstop.com/
XML ile çalışmaya yönelik ActionScript sınıfları
ActionScript 3.0, XML yapısındaki bilgilerle çalışmak için kullanılan birçok sınıf içerir. İki ana sınıf şunlardır:
• XML: Birden çok alt öğe içeren tek bir XML belgesi olabileceği gibi bir belge içindeki tek değerli bir öğe de olabilen
tek bir XML öğesini temsil eder.
• XMLList: XML öğelerinin bir kümesini temsil eder. “eşdüzey” (XML belgesinin hiyerarşisinde, aynı düzeyde ve
aynı üst öğede bulunan) niteliğinde birden çok XML öğesi olduğunda, XMLList nesnesi kullanılır. Örneğin, bu
XML öğeleri kümesiyle (büyük olasılıkla bir XML belgesinde) çalışmanın en kolay yolu, XMLList örneğidir:
<artist type="composer">Fred Wilson</artist>
<artist type="conductor">James Schmidt</artist>
<artist type="soloist">Susan Harriet Thurndon</artist>
XML ad alanlarının da dahil olduğu daha ileri düzey kullanımlar için ActionScript ayrıca Namespace ve QName
sınıflarını da içerir. Daha fazla bilgi için, bkz. “XML ad alanlarını kullanma” sayfa 237.
ActionScript 3.0, XML ile çalışılmasına yönelik yerleşik sınıflara ek olarak, XML verilerine erişilmesi ve XML
verilerinin işlenmesi için de belirli işlevler sağlayan birçok operatör içerir. Bu sınıf ve operatörler kullanılarak XML ile
çalışma yaklaşımı, ECMA-357 sürüm 2 belirtimi tarafından tanımlandığı şekilde, XML için ECMAScript (E4X) olarak
bilinir.
Ortak XML görevleri
ActionScript'te XML ile çalışırken şu görevleri yapma olasılığınız yüksektir:
• XML belgeleri oluşturma (öğeler ve değerler ekleme)
• XML öğelerine, değerlerine ve niteliklerine erişme
• XML öğelerine filtre uygulama (içinde arama yapma)
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 225
XML ile çalışma
• XML öğeleri kümesi üzerinde döngü gerçekleştirme
• XML sınıfları ve String sınıfları arasında veriyi dönüştürme
• XML ad alanlarıyla çalışma
• Harici XML dosyalarını yükleme
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesi, bu bölümde kullanılan önemli terimleri içerir:
• Öğe: başlatma etiketi ile kapatma etiketi arasında barındırılan içerik (etiketler de dahil) olarak tanımlanan, bir XML
belgesindeki tek bir öğe. XML öğeleri, metin verileri veya başka öğeler içerebilir veya boş olabilir.
• Boş öğe: Herhangi bir alt öğe içermeyen XML öğesi. Boş öğeler genellikle kendiliğinden kapanan etiketler olarak
(örn. <element/>) yazılır.
• Belge: Tek bir XML yapısı. Bir XML belgesi herhangi bir sayıda öğe içerebilir (veya tek bir boş öğeden oluşabilir);
ancak XML belgesinin, belgedeki diğer tüm öğeleri içeren tek bir üst düzey öğeye sahip olması gerekir.
• Düğüm: XML öğesinin başka bir adı.
• Nitelik: Öğenin içinde yuvalanmış ayrı bir alt öğe olarak yazılmayıp attributename="value" formatında açma
etiketinin içine yazılan, bir öğeyle ilişkilendirilmiş adlandırılmış bir değer.
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Temelde, bu bölümdeki tüm kod
listeleri uygun trace() işlev çağrısını içerir. Bu bölümdeki kod listelerini test etmek için:
1 Boş bir Flash belgesi oluşturun.
2 Zaman çizelgesinde bir anahtar kare seçin.
3 Eylemler panelini açın ve kod listesini Komut Dosyası bölmesine kopyalayın.
4 Kontrol Et > Filmi Test Et komutu ile programı çalıştırın.
Çıktı panelinde, trace() işlevinin sonuçlarını göreceksiniz.
Örnek kod listelerinin test edilmesine yönelik bu ve diğer teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34
bölümünde daha ayrıntılı şekilde açıklanmıştır.
XML işlemeye yönelik E4X yaklaşımı
XML için ECMAScript belirtimi, XML verileriyle çalışılmasına yönelik sınıflar ve işlevlerin bir kümesini tanımlar. Bu
sınıflar ve işlevler topluca E4X olarak bilinir. ActionScript 3.0, şu E4X sınıflarını içerir: XML, XMLList, QName ve
Namespace.
E4X sınıflarının yöntemleri, özellikleri ve operatörleri, şu hedefler göz önünde bulundurularak tasarlanmıştır:
• Basitlik—E4X, XML verileriyle çalışılmasına yönelik kodların yazılmasını ve anlaşılmasını olabildiğince
kolaylaştırır.
• Tutarlılık—E4X'in ardındaki mantık ve yöntemler, ActionScript'in diğer bölümlerindekilerle dahili olarak tutarlılık
gösterir.
• Bilindik Olması—XML verilerini, nokta (.) operatörü gibi bilindik operatörlerle işlersiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 226
XML ile çalışma
Not: ActionScript 2.0'da bir XML sınıfı vardı. ActionScript 3.0'da bu sınıf, E4X'in bir parçası olan ActionScript 3.0 XML
sınıfı ile çakışmaması için XMLDocument olarak yeniden adlandırılmıştır. ActionScript 3.0'da, XMLDocument,
XMLNode, XMLParser ve XMLTag gibi eski sınıflar, eski sürümlerin desteklenmesi için flash.xml paketine dahil
edilmiştir. Yeni E4X sınıfları çekirdek sınıflardır; bunları kullanmak için bir paketi içe aktarmanız gerekmez. Bu
bölümde, eski ActionScript 2.0 XML sınıflarına ayrıntılı şekilde yer verilmemiştir. Bunlarla ilgili ayrıntılar için, bkz.
flash.xml paketi, ActionScript 3.0 Dil ve Bileşenler Başvurusu.
Aşağıda, E4X ile veri işlenmesine örnek verilmiştir:
var myXML:XML =
<order>
<item id='1'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>
Genellikle uygulamanız bir web hizmeti veya RSS beslemesi gibi harici bir kaynaktan XML verilerini yükler. Ancak
netlik sağlamak için bu bölümdeki örnekler, XML verilerini değişmez öğeler olarak atamaktadır.
Aşağıdaki kodda gösterildiği gibi, E4X, XML'deki özellik ve niteliklere erişilmesi için, nokta (.) ve nitelik tanımlayıcısı
(@) operatörleri gibi bazı sezgisel operatörleri içerir:
trace(myXML.item[0].menuName); // Output: burger
trace(myXML.item.(@id==2).menuName); // Output: fries
trace(myXML.item.(menuName=="burger").price); // Output: 3.95
Aşağıdaki kod parçasında gösterildiği gibi, XML'e yeni bir alt düğüm atamak için appendChild() yöntemini kullanın:
var newItem:XML =
<item id="3">
<menuName>medium cola</menuName>
<price>1.25</price>
</item>
myXML.appendChild(newItem);
Aşağıda gösterildiği gibi, verileri okumak ve atamak için @ ve . operatörlerini kullanın:
myXML.item[0].menuName="regular burger";
myXML.item[1].menuName="small fries";
myXML.item[2].menuName="medium cola";
myXML.item.(menuName=="regular burger")[email protected] = "2";
myXML.item.(menuName=="small fries")[email protected] = "2";
myXML.item.(menuName=="medium cola")[email protected] = "2";
Aşağıdaki gibi, XML düğümlerini yinelemek için bir for döngüsü kullanın:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 227
XML ile çalışma
var total:Number = 0;
for each (var property:XML in myXML.item)
{
var q:int = Number([email protected]);
var p:Number = Number(property.price);
var itemTotal:Number = q * p;
total += itemTotal;
trace(q + " " + property.menuName + " $" + itemTotal.toFixed(2))
}
trace("Total: $", total.toFixed(2));
XML nesneleri
XML nesnesi, bir XML öğesini, niteliği, yorumu, işleme talimatını veya metin öğesini temsil edebilir.
XML nesnesi, basit içerik veya karmaşık içerik barındırmasına göre sınıflandırılır. Alt düğümler içeren bir XML
nesnesi, karmaşık içerik barındırıyor olarak sınıflandırılır. XML nesnesi şunlardan herhangi biriyse, basit içerik
barındırıyor olarak sınıflandırılır: bir nitelik, bir yorum, bir işleme talimatı veya bir metin düğümü.
Örneğin, aşağıdaki XML nesnesi, bir yorum ve işleme talimatı olmak üzere karmaşık içerik barındırır:
XML.ignoreComments = false;
XML.ignoreProcessingInstructions = false;
var x1:XML =
<order>
<!--This is a comment. -->
<?PROC_INSTR sample ?>
<item id='1'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>
Aşağıdaki örnekte gösterildiği gibi, yeni XML nesneleri, yorum ve işleme talimatı oluşturmak için şimdi comments()
ve processingInstructions() yöntemlerini kullanabilirsiniz:
var x2:XML = x1.comments()[0];
var x3:XML = x1.processingInstructions()[0];
XML özellikleri
XML sınıfı beş statik özellik içerir:
•
ignoreComments ve ignoreProcessingInstructions özellikleri, XML nesnesi ayrıştırılırken yorumların veya
işleme talimatlarının yoksayılıp yoksayılmayacağını belirler.
•
ignoreWhitespace özelliği, öğe etiketlerinde ve yalnızca boşluk karakterleriyle ayrılan gömülü ifadelerde boşluk
karakterlerinin yoksayılıp yoksayılmayacağını belirler.
•
prettyIndentve prettyPrinting özellikleri, XML sınıfının toString() ve toXMLString() yöntemleri
tarafından döndürülen metni formatlamak için kullanılır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 228
XML ile çalışma
Bu özellikler hakkında daha fazla bilgi için, bkz. ActionScript 3.0 Dil ve Bileşenler Başvurusu.
XML yöntemleri
Aşağıdaki yöntemler, XML nesnelerinin hiyerarşik yapısıyla çalışmanıza olanak sağlar:
•
appendChild()
•
child()
•
childIndex()
•
children()
•
descendants()
•
elements()
•
insertChildAfter()
•
insertChildBefore()
•
parent()
•
prependChild()
Aşağıdaki yöntemler, XML nesnesi nitelikleriyle çalışmanıza olanak sağlar:
•
attribute()
•
attributes()
Aşağıdaki yöntemler, XML nesnesi özellikleriyle çalışmanıza olanak sağlar:
•
hasOwnProperty()
•
propertyIsEnumerable()
•
replace()
•
setChildren()
Aşağıdaki yöntemler, nitelendirilmiş adlarla ve ad alanlarıyla çalışılmasına yöneliktir:
•
addNamespace()
•
inScopeNamespaces()
•
localName()
•
name()
•
namespace()
•
namespaceDeclarations()
•
removeNamespace()
•
setLocalName()
•
setName()
•
setNamespace()
Aşağıdaki yöntemler, belirli türdeki XML içerikleriyle çalışılmasına ve bu XML içeriklerinin belirlenmesine yöneliktir:
•
comments()
•
hasComplexContent()
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 229
XML ile çalışma
•
hasSimpleContent()
•
nodeKind()
•
processingInstructions()
•
text()
Aşağıdaki yöntemler, dizelere dönüştürmeye ve XML nesnelerinin formatlanmasına yöneliktir:
•
defaultSettings()
•
setSettings()
•
settings()
•
normalize()
•
toString()
•
toXMLString()
Birkaç ek yöntem daha vardır:
•
contains()
•
copy()
•
valueOf()
•
length()
Bu yöntemler hakkında daha fazla bilgi için, bkz. ActionScript 3.0 Dil ve Bileşenler Başvurusu.
XMLList nesneleri
XMLList örneği, XML nesnelerinin rastgele bir koleksiyonunu temsil eder. Bunlar arasında tam XML belgeleri, XML
parçaları veya XML sorgusunun sonuçları yer alabilir.
Aşağıdaki yöntemler, XMLList nesnelerinin hiyerarşik yapısıyla çalışmanıza olanak sağlar:
•
child()
•
children()
•
descendants()
•
elements()
•
parent()
Aşağıdaki yöntemler, XMLList nesnesi nitelikleriyle çalışmanıza olanak sağlar:
•
attribute()
•
attributes()
Aşağıdaki yöntemler, XMLList özellikleriyle çalışmanıza olanak sağlar:
•
hasOwnProperty()
•
propertyIsEnumerable()
Aşağıdaki yöntemler, belirli türdeki XML içerikleriyle çalışılmasına ve bu XML içeriklerinin belirlenmesine yöneliktir:
•
comments()
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 230
XML ile çalışma
•
hasComplexContent()
•
hasSimpleContent()
•
processingInstructions()
•
text()
Aşağıdaki yöntemler, dizelere dönüştürmeye ve XMLList nesnelerinin formatlanmasına yöneliktir:
•
normalize()
•
toString()
•
toXMLString()
Birkaç ek yöntem daha vardır:
•
contains()
•
copy()
•
length()
•
valueOf()
Bu yöntemler hakkında daha fazla bilgi için, bkz. ActionScript 3.0 Dil ve Bileşenler Başvurusu.
Tek bir XML öğesi içeren bir XMLList nesnesi, XML nesnesiyle aynı şekilde değerlendirildiğinden, tam olarak bir tane
XML öğesi içeren bir XMLList nesnesi için, XML sınıfının tüm özelliklerini ve yöntemlerini kullanabilirsiniz. Örneğin,
aşağıdaki kodda, doc.div tek bir öğe içeren bir XMLList nesnesi olduğundan, XML sınıfındaki appendChild()
yöntemini kullanabilirsiniz:
var doc:XML =
<body>
<div>
<p>Hello</p>
</div>
</body>;
doc.div.appendChild(<p>World</p>);
XML özelliklerinin ve yöntemlerinin listesi için, bkz. “XML nesneleri” sayfa 227.
XML değişkenlerini başlatma
Aşağıdaki gibi, XML nesnesine bir XML değişmezi atayabilirsiniz:
var myXML:XML =
<order>
<item id='1'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>
Aşağıdaki kod parçasında gösterildiği gibi, XML verisi içeren bir dizeden bir XML nesnesi örneği oluşturmak için, new
yapıcısını da kullanabilirsiniz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 231
XML ile çalışma
var str:String = "<order><item id='1'><menuName>burger</menuName>"
+ "<price>3.95</price></item></order>";
var myXML:XML = new XML(str);
Dizedeki XML verileri düzgün biçimlendirilmemişse (örneğin, bir kapatma etiketi eksikse), çalışma zamanı hatasıyla
karşılaşırsınız.
Ayrıca aşağıdaki örnekte gösterildiği gibi, verileri başvuruya göre (diğer değişkenlerden) bir XML nesnesine
iletebilirsiniz:
var tagname:String = "item";
var attributename:String = "id";
var attributevalue:String = "5";
var content:String = "Chicken";
var x:XML = <{tagname} {attributename}={attributevalue}>{content}</{tagname}>;
trace(x.toXMLString())
// Output: <item id="5">Chicken</item>
Bir URL'den XML verileri yüklemek için, aşağıdaki örnekte gösterildiği gibi, URLLoader sınıfını kullanın:
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
var externalXML:XML;
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("xmlFile.xml");
loader.load(request);
loader.addEventListener(Event.COMPLETE, onComplete);
function onComplete(event:Event):void
{
var loader:URLLoader = event.target as URLLoader;
if (loader != null)
{
externalXML = new XML(loader.data);
trace(externalXML.toXMLString());
}
else
{
trace("loader is not a URLLoader!");
}
}
Bir soket bağlantısından XML verilerini okumak için, XMLSocket sınıfını kullanın. Daha fazla bilgi için, bkz.
XMLSocket sınıfı, ActionScript 3.0 Dil ve Bileşenler Başvurusu.
XML nesnelerini birleştirme ve dönüştürme
XML nesnesinin özellikler listesinin başına veya sonuna bir özellik eklemek için, aşağıdaki örnekte gösterildiği gibi,
prependChild() yöntemini veya appendChild() yöntemini kullanın:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 232
XML ile çalışma
var
var
var
x =
x =
x =
x1:XML = <p>Line 1</p>
x2:XML = <p>Line 2</p>
x:XML = <body></body>
x.appendChild(x1);
x.appendChild(x2);
x.prependChild(<p>Line 0</p>);
// x == <body><p>Line 0</p><p>Line 1</p><p>Line 2</p></body>
Belirtilen bir özellikten önce veya sonra bir özellik eklemek için, aşağıda gösterildiği gibi, insertChildBefore()
yöntemini ya da insertChildAfter() yöntemini kullanın:
var x:XML =
<body>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</body>
var newNode:XML = <p>Paragraph 1.5</p>
x = x.insertChildAfter(x.p[0], newNode)
x = x.insertChildBefore(x.p[2], <p>Paragraph 1.75</p>)
Aşağıdaki örnekte gösterildiği gibi, XML nesneleri oluştururken başvuruya göre (diğer değişkenlerden) veri iletmek
için küme ayracı operatörlerini de ( { ve } ) kullanabilirsiniz:
var ids:Array = [121, 122, 123];
var names:Array = [["Murphy","Pat"], ["Thibaut","Jean"], ["Smith","Vijay"]]
var x:XML = new XML("<employeeList></employeeList>");
for (var i:int = 0; i < 3; i++)
{
var newnode:XML = new XML();
newnode =
<employee id={ids[i]}>
<last>{names[i][0]}</last>
<first>{names[i][1]}</first>
</employee>;
x = x.appendChild(newnode)
}
Aşağıdaki gibi, = operatörünü kullanarak bir XML nesnesine özellikler ve nitelikler atayabilirsiniz:
var x:XML =
<employee>
<lastname>Smith</lastname>
</employee>
x.firstname = "Jean";
x[email protected] = "239";
Böylece x XML nesnesi şunlara ayarlanır:
<employee id="239">
<lastname>Smith</lastname>
<firstname>Jean</firstname>
</employee>
XMLList nesnelerini bitiştirmek için + ve += operatörlerini kullanabilirsiniz:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 233
XML ile çalışma
var x1:XML = <a>test1</a>
var x2:XML = <b>test2</b>
var xList:XMLList = x1 + x2;
xList += <c>test3</c>
Böylece xList XMLList nesnesi şunlara ayarlanır:
<a>test1</a>
<b>test2</b>
<c>test3</c>
XML yapılarında geçiş yapma
XML'in güçlü özelliklerinden biri, doğrusal metin karakterleri dizesi yoluyla karmaşık, yuvalanmış veriler sağlama
yeteneğidir. Bir XML nesnesine veri yüklediğinizde, ActionScript veriyi ayrıştırır ve verinin hiyerarşik yapısını belleğe
gönderir (veya XML verisi düzgün biçimlendirilmemişse bir çalışma zamanı hatası gönderir).
XML ve XMLList nesnelerinin operatörleri ve yöntemleri, XML verilerinde geçiş yapılmasını kolaylaştırır.
Bir XML nesnesinin alt özelliklerine erişmek için, nokta (.) operatörünü ve alt öğe erişimcisi (..) operatörünü kullanın.
Şu XML nesnesini göz önünde bulundurun:
var myXML:XML =
<order>
<book ISBN="0942407296">
<title>Baking Extravagant Pastries with Kumquats</title>
<author>
<lastName>Contino</lastName>
<firstName>Chuck</firstName>
</author>
<pageCount>238</pageCount>
</book>
<book ISBN="0865436401">
<title>Emu Care and Breeding</title>
<editor>
<lastName>Case</lastName>
<firstName>Justin</firstName>
</editor>
<pageCount>115</pageCount>
</book>
</order>
myXML.book nesnesi, myXML nesnesinin, book adına sahip olan alt özelliklerini içeren bir XMLList nesnesidir. Bunlar,
myXML nesnesinin iki book özelliğiyle eşleşen iki XML nesnesidir.
myXML..lastName nesnesi, lastName adına sahip olan tüm alt öğe özelliklerini içeren bir XMLList nesnesidir. Bunlar,
myXML nesnesinin iki lastName özelliğiyle eşleşen iki XML nesnesidir.
myXML.book.editor.lastName nesnesi, myXML nesnesinin book adına sahip alt öğelerinin editor adına sahip alt
öğelerinin lastName adına sahip herhangi bir alt öğesini içeren XMLList nesnesidir: bu durumda, yalnızca bir XML
nesnesi içeren bir XMLList nesnesidir ("Case" değerine sahip lastName özelliği).
Üst ve alt düğümlere erişme
parent() yöntemi, XML nesnesinin üst öğesini döndürür.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 234
XML ile çalışma
Belirli alt nesnelere erişmek için, bir alt öğe listesinin sıra belirten dizin değerlerini kullanabilirsiniz. Örneğin, book
adına sahip iki alt özellik içeren bir myXML XML nesnesini göz önünde bulundurun. book olarak adlandırılan her alt
özellik, bununla ilişkilendirilmiş bir dizin sayısına sahiptir:
myXML.book[0]
myXML.book[1]
Belirli bir alt alt öğeye erişmek için, hem alt öğe hem de alt alt öğe adları için dizin sayıları belirtebilirsiniz:
myXML.book[0].title[0]
Ancak, x.book[0] öğesinin, title başlık adına sahip yalnızca bir alt öğesi varsa, şu şekilde dizin başvurusunu
çıkarabilirsiniz:
myXML.book[0].title
Aynı şekilde, x nesnesinin yalnızca bir kitap alt öğesi varsa ve bu alt nesne yalnızca bir başlık nesnesine sahipse, şu
şekilde her iki dizin başvurusunu çıkarabilirsiniz:
myXML.book.title
Aşağıdaki örnekte gösterildiği gibi, bir değişken veya ifadeyi esas alan adlara sahip alt öğelere gitmek için child()
yöntemini kullanabilirsiniz:
var myXML:XML =
<order>
<book>
<title>Dictionary</title>
</book>
</order>;
var childName:String = "book";
trace(myXML.child(childName).title) // output: Dictionary
Niteliklere erişme
Aşağıdaki kodda gösterildiği gibi, bir XML veya XMLList nesnesindeki niteliklere erişmek için @ sembolünü (nitelik
tanımlayıcısı operatörü) kullanın:
var employee:XML =
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace([email protected]); // 6401
Aşağıdaki kodda gösterildiği gibi, bir XML veya XMLList nesnesinin tüm niteliklerine erişmek için, @ sembolüyle
birlikte * joker karakter sembolünü kullanabilirsiniz:
var employee:XML =
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace([email protected]*.toXMLString());
// 6401
// 233
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 235
XML ile çalışma
Aşağıdaki kodda olduğu gibi, bir XML veya XMLList nesnesinin belirli bir niteliğine veya tüm niteliklerine erişmek
için, attribute() ya da attributes() yöntemini kullanabilirsiniz:
var employee:XML =
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.attribute("id")); // 6401
trace(employee.attribute("*").toXMLString());
// 6401
// 233
trace(employee.attributes().toXMLString());
// 6401
// 233
Aşağıdaki örnekte gösterildiği gibi, niteliklere erişmek için şu sözdizimini de kullanabildiğinizi unutmayın:
employee.attribute("id")
employee["@id"]
[email protected]["id"]
Bunların her biri şuna eşdeğerdir: [email protected] Ancak tercih edilen yaklaşım, [email protected] sözdizimidir.
Niteliğe veya öğe değerine göre filtre uygulama
Belirli bir öğe adına veya nitelik değerine sahip öğelere filtre uygulamak için, parantez operatörlerini— ( ve ) —
kullanabilirsiniz. Şu XML nesnesini göz önünde bulundurun:
var x:XML =
<employeeList>
<employee id="347">
<lastName>Zmed</lastName>
<firstName>Sue</firstName>
<position>Data analyst</position>
</employee>
<employee id="348">
<lastName>McGee</lastName>
<firstName>Chuck</firstName>
<position>Jr. data analyst</position>
</employee>
</employeeList>
Aşağıdaki ifadelerin tümü geçerlidir:
•
x.employee.(lastName == "McGee")—Bu, ikinci employee düğümüdür.
•
x.employee.(lastName == "McGee").firstName—Bu, ikinci employee düğümünün firstName özelliğidir.
•
x.employee.(lastName == "McGee")[email protected]—Bu, ikinci employee düğümünün id niteliğidir.
•
x.employee.(@id == 347)—Birinci employee düğümü.
•
x.employee.(@id == 347).lastName—Bu, birinci employee düğümünün lastName özelliğidir.
•
x.employee.(@id > 300)—Bu, her iki employee özelliğini içeren bir XMLList öğesidir.
•
x.employee.(position.toString().search("analyst") > -1)—Bu, her iki position özelliğini içeren bir
XMLList öğesidir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 236
XML ile çalışma
Bulunmayabilen nitelikler veya öğelerde filtre uygulamayı denerseniz, Flash® Player ve Adobe® AIR™ bir istisna atar.
Örneğin, ikinci p öğesinde id niteliği bulunmadığından, aşağıdaki kodun son satırı bir hata oluşturur:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(@id == '123'));
Aynı şekilde, ikinci p öğesinin b özelliği bulunmadığından, aşağıdaki kodun son satırı bir hata oluşturur:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(b == 'Bob'));
Bu hataları önlemek için, aşağıdaki kodda olduğu gibi, attribute() ve elements() yöntemlerini kullanarak, eşleşen
niteliklere veya öğelere sahip özellikleri tanımlayabilirsiniz:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(attribute('id') == '123'));
trace(doc.p.(elements('b') == 'Bob'));
Ayrıca aşağıdaki kodda olduğu gibi, hasOwnProperty() yöntemini de kullanabilirsiniz:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(hasOwnProperty('@id') && @id == '123'));
trace(doc.p.(hasOwnProperty('b') && b == 'Bob'));
for..in ve for each..in deyimlerini kullanma
ActionScript 3.0, XMLList nesnelerinin yinelenmesi için for..in deyimini ve for each..in deyimini içerir.
Örneğin, şu myXML XML nesnesini ve myXML.item XMLList nesnesini göz önünde bulundurun. myXML.item XMLList
nesnesi, XML nesnesinin iki item düğümünü içerir.
var myXML:XML =
<order>
<item id='1' quantity='2'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2' quantity='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
for..in deyimi, bir XMLList öğesindeki özellik adları kümesini yinelemenize olanak sağlar:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 237
XML ile çalışma
var total:Number = 0;
for (var pname:String in myXML.item)
{
total += [email protected][pname] * myXML.item.price[pname];
}
for each..in deyimi, XMLList öğesindeki özellikleri yinelemenize olanak sağlar:
var total2:Number = 0;
for each (var prop:XML in myXML.item)
{
total2 += [email protected] * prop.price;
}
XML ad alanlarını kullanma
XML nesnesindeki (veya belgesindeki) ad alanları, nesnenin içerdiği veri türünü tanımlar. Örneğin, SOAP mesajlaşma
protokolünü kullanan bir web hizmetine XML verilerini gönderip teslim ederken, XML'in açma etiketinde ad alanını
bildirirsiniz:
var message:XML =
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Body xmlns:w="http://www.test.com/weather/">
<w:getWeatherResponse>
<w:tempurature >78</w:tempurature>
</w:getWeatherResponse>
</soap:Body>
</soap:Envelope>;
Ad alanı, bir önek (soap) ve ad alanını tanımlayan bir URI (http://schemas.xmlsoap.org/soap/envelope/)
içerir.
ActionScript 3.0, XML ad alanlarıyla çalışılması için Namespace sınıfını içerir. Önceki örnekte bulunan XML nesnesi
için, şu şekilde Namespace sınıfını kullanabilirsiniz:
var soapNS:Namespace = message.namespace("soap");
trace(soapNS); // Output: http://schemas.xmlsoap.org/soap/envelope/
var wNS:Namespace = new Namespace("w", "http://www.test.com/weather/");
message.addNamespace(wNS);
var encodingStyle:XMLList = [email protected]::encodingStyle;
var body:XMLList = message.soapNS::Body;
message.soapNS::Body.wNS::GetWeatherResponse.wNS::tempurature = "78";
XML sınıfı, ad alanlarıyla çalışılması için şu yöntemleri içerir: addNamespace(), inScopeNamespaces(),
localName(), name(), namespace(), namespaceDeclarations(), removeNamespace(), setLocalName(),
setName() ve setNamespace().
default xml namespace direktifi, XML nesneleri için varsayılan bir ad alanı atamanıza olanak sağlar. Örneğin,
aşağıda, hem x1 hem de x2 aynı varsayılan ad alanına sahiptir:
var ns1:Namespace = new Namespace("http://www.example.com/namespaces/");
default xml namespace = ns1;
var x1:XML = <test1 />;
var x2:XML = <test2 />;
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 238
XML ile çalışma
XML tür dönüştürmesi
XML nesnelerini ve XMLList nesnelerini String değerlerine dönüştürebilirsiniz. Aynı şekilde, dizeleri de XML
nesnelerine ve XMLList nesnelerine dönüştürebilirsiniz. Ayrıca, tüm XML nitelik değerlerinin, adlarının ve metin
değerlerinin dize olduğunu unutmayın. İlerleyen bölümlerde, bu XML tür dönüştürmesi biçimlerinin tümü ele
alınmıştır.
XML ve XMLList nesnelerini dizelere dönüştürme
XML ve XMLList sınıfları, bir toString() yöntemini ve bir toXMLString() yöntemini içerir. toXMLString()
yöntemi, XML nesnesinin tüm etiketlerini, niteliklerini, ad alanı bildirimlerini ve içeriklerini barındıran bir dize
döndürür. Karmaşık içerik (alt öğeler) barındıran XML nesneleri için, toString() yöntemi toXMLString()
yöntemiyle tamamen aynı şeyi yapar. Basit içerik barındıran XML nesneleri (yalnızca bit metin öğesi barındıran) için,
toString() yöntemi aşağıdaki örnekte gösterildiği gibi, yalnızca öğenin metin içeriğini döndürür:
var myXML:XML =
<order>
<item id='1' quantity='2'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<order>;
trace(myXML.item[0].menuName.toXMLString());
// <menuName>burger</menuName>
trace(myXML.item[0].menuName.toString());
// burger
toString() veya toXMLString() öğesini belirtmeden trace() yöntemini kullanırsanız, bu kodda gösterildiği gibi,
varsayılan olarak toString() yöntemi kullanılarak veriler dönüştürülür:
var myXML:XML =
<order>
<item id='1' quantity='2'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<order>;
trace(myXML.item[0].menuName);
// burger
Kodun hatalarını ayıklamak için trace() yöntemini kullanırken genellikle trace() yönteminin daha tam veri
vermesi için toXMLString() yöntemini kullanmayı istersiniz.
Dizeleri XML nesnelerine dönüştürme
Aşağıdaki gibi, bir dizeden XML nesnesi oluşturmak için, new XML() yapıcısını kullanabilirsiniz:
var x:XML = new XML("<a>test</a>");
Aşağıdaki gibi, bir dizeyi, geçersiz XML'i veya düzgün biçimlendirilmemiş XML'i temsil eden bir dizeden XML'e
dönüştürmeyi denerseniz, bir çalışma zamanı hatası atılır:
var x:XML = new XML("<a>test"); // throws an error
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 239
XML ile çalışma
Dizelerden nitelik değerlerini, adları ve metin değerlerini dönüştürme
Tüm XML nitelik değerleri, adları ve metin değerleri, String veri türündedir ve bunları başka veri türlerine
dönüştürmeniz gerekebilir. Örneğin, aşağıdaki kod, metin değerlerini sayılara dönüştürmek için Number() işlevini
kullanır:
var myXML:XML =
<order>
<item>
<price>3.95</price>
</item>
<item>
<price>1.00</price>
</item>
</order>;
var total:XML = <total>0</total>;
myXML.appendChild(total);
for each (var item:XML in myXML.item)
{
myXML.total.children()[0] = Number(myXML.total.children()[0])
+ Number(item.price.children()[0]);
}
trace(myXML.total); // 4.35;
Bu kod Number() işlevini kullanmasaydı, kod, + operatörünü dize bitiştirme operatörü olarak yorumlardı ve son
satırdaki trace() yöntemi çıktı olarak şunu verirdi:
01.003.95
Harici XML belgelerini okuma
Bir URL'den XML verilerini yüklemek için URLLoader sınıfını kullanabilirsiniz. Uygulamalarınızda aşağıdaki kodu
kullanmak için, örnekteki XML_URL değerinin yerine geçerli bir URL getirin:
var myXML:XML = new XML();
var XML_URL:String = "http://www.example.com/Sample3.xml";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener("complete", xmlLoaded);
function xmlLoaded(event:Event):void
{
myXML = XML(myLoader.data);
trace("Data loaded.");
}
Ayrıca bir sunucuyla eşzamansız XML soket bağlantısı kurmak için XMLSocket sınıfını kullanabilirsiniz. Daha fazla
bilgi için, bkz. ActionScript 3.0 Dil ve Bileşenler Başvurusu.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 240
XML ile çalışma
Örnek: Internet'ten RSS yükleme
RSSViewer örnek uygulaması, ActionScript'te XML ile çalışılmasının birçok özelliğini gösterir, örn:
• XML verilerinde RSS beslemesi biçiminde geçiş yapmak için XML yöntemlerini kullanma.
• XML verilerini bir metin alanında kullanmak üzere HTML biçiminde birleştirmek için XML yöntemlerini
kullanma.
RSS formatı, XML yoluyla haberleri yayınlamak için yaygın olarak kullanılır. Basit bir RSS veri dosyası şöyle
görünebilir:
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Alaska - Weather</title>
<link>http://www.nws.noaa.gov/alerts/ak.html</link>
<description>Alaska - Watches, Warnings and Advisories</description>
<item>
<title>
Short Term Forecast - Taiya Inlet, Klondike Highway (Alaska)
</title>
<link>
http://www.nws.noaa.gov/alerts/ak.html#A18.AJKNK.1900
</link>
<description>
Short Term Forecast Issued At: 2005-04-11T19:00:00
Expired At: 2005-04-12T01:00:00 Issuing Weather Forecast Office
Homepage: http://pajk.arh.noaa.gov
</description>
</item>
<item>
<title>
Short Term Forecast - Haines Borough (Alaska)
</title>
<link>
http://www.nws.noaa.gov/alerts/ak.html#AKZ019.AJKNOWAJK.190000
</link>
<description>
Short Term Forecast Issued At: 2005-04-11T19:00:00
Expired At: 2005-04-12T01:00:00 Issuing Weather Forecast Office
Homepage: http://pajk.arh.noaa.gov
</description>
</item>
</channel>
</rss>
SimpleRSS uygulaması, Internet'ten RSS verilerini okur, başlık, bağlantı ve açıklamalar için verileri ayrıştırır ve bu
verileri döndürür. SimpleRSSUI sınıfı UI'yi sağlar ve tüm XML işlemeyi gerçekleştiren SimpleRSS sınıfını çağırır.
Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.
RSSViewer uygulama dosyalarını Samples/RSSViewer klasöründe bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 241
XML ile çalışma
Dosya
Açıklama
RSSViewer.mxml
Flash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası.
veya
RSSViewer.fla
com/example/programmingas3/rssViewer/RSSParser.as
RSS (XML) verilerinde geçiş yapmak ve karşılık gelen HTML temsilini
oluşturmak için E4X kullanan yöntemleri içeren bir sınıf.
RSSData/ak.rss
Örnek bir RSS dosyası. Bu uygulama, web'deki RSS verileri, Adobe tarafından
barındırılan bir Flex RSS beslemesinde okunacak şekilde ayarlanmıştır. Ancak
uygulamayı, Flex RSS beslemesinden daha farklı bir şema kullanan bu
belgedeki RSS verilerini okuyacak şekilde kolayca değiştirebilirsiniz.
XML verilerini okuma ve ayrıştırma
RSSParser sınıfı, rssXML değişkeninde saklanan girdi RSS verilerini HTML olarak formatlanmış çıktı (rssOutput)
içeren bir dizeye dönüştüren xmlLoaded() yöntemini içerir.
Kaynak RSS verileri varsayılan bir ad alanı içeriyorsa, kod, yöntemin başına yakın konumda varsayılan XML ad alanını
ayarlar:
if (rssXML.namespace("") != undefined)
{
default xml namespace = rssXML.namespace("");
}
Sonraki satırlar, kaynak XML verisinin içerikleri üzerinde döngü gerçekleştirerek item adındaki alt öğe özelliklerinin
her birini inceler:
for each (var item:XML in rssXML..item)
{
var itemTitle:String = item.title.toString();
var itemDescription:String = item.description.toString();
var itemLink:String = item.link.toString();
outXML += buildItemHTML(itemTitle,
itemDescription,
itemLink);
}
İlk üç satır, dize değişkenlerini, XML verisinin item özelliğinin başlık, açıklama ve bağlantı özelliklerini temsil edecek
şekilde ayarlar. Sonraki satır, parametre olarak üç yeni dize değişkeni kullanarak, HTML verilerini bir XMLList nesnesi
biçiminde almak için buildItemHTML() yöntemini çağırır.
XMLList verilerini birleştirme
HTML verileri (bir XMLList nesnesi) şu biçimde olabilir:
<b>itemTitle</b>
<p>
itemDescription
<br />
<a href="link">
<font color="#008000">More...</font>
</a>
</p>
Yöntemin birinci satırları, varsayılan xml ad alanını temizler:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 242
XML ile çalışma
default xml namespace = new Namespace();
default xml namespace direktifi, blok düzeyinde kapsam işlevine sahiptir. Başka bir deyişle, bu bildirimin kapsamı
buildItemHTML() yöntemidir.
Bunu izleyen satırlar, işleve iletilen dize argümanlarını esas alarak XMLList öğesini oluşturur:
var body:XMLList = new XMLList();
body += new XML("<b>" + itemTitle + "</b>");
var p:XML = new XML("<p>" + itemDescription + "</p>");
var link:XML = <a></a>;
[email protected] = itemLink; // <link href="itemLinkString"></link>
[email protected] = "#008000";
// <font color="#008000"></font></a>
// 0x008000 = green
link.font = "More...";
p.appendChild(<br/>);
p.appendChild(link);
body += p;
Bu XMLList nesnesi, ActionScript HTML metin alanı için uygun olan dize verisini temsil eder.
xmlLoaded() yöntemi, buildItemHTML() yönteminin döndürme değerini kullanır ve bunu bir dizeye dönüştürür:
XML.prettyPrinting = false;
rssOutput = outXML.toXMLString();
RSS beslemesinin başlığını ayıklama ve özel bir olay gönderme
xmlLoaded() yöntemi, kaynak RSS XML verisindeki bilgileri esas alarak bir rssTitle dize değişkeni ayarlar:
rssTitle = rssXML.channel.title.toString();
Son olarak, xmlLoaded() yöntemi, verilerin ayrıştırıldığını ve kullanılabilir olduğunu uygulamaya bildiren bir olay
oluşturur:
dataWritten = new Event("dataWritten", true);
243
Bölüm 12: Olayları işleme
Olay işleme sistemi, programcıların kullanıcı girdisine ve sistem olaylarına rahat şekilde yanıt vermesine olanak sağlar.
ActionScript 3.0 olay modeli yalnızca rahatlık sağlamakla kalmaz, aynı zamanda standartlarla da uyumlu olup Adobe®
Flash® Player ve Adobe® AIR™ görüntüleme listeleriyle de tümleştirilebilir. Yeni olay modeli, endüstri standardı olay
işleme mimarisi niteliğindeki Belge Nesnesi Modeli (DOM) Düzey 3 Olaylar Belirtimi'ni esas alarak ActionScript
programcıları için güçlü ve aynı zamanda sezgisel bir olay işleme aracı sağlar.
Bu bölüm beş ayrı kısma ayrılmıştır. İlk iki kısımda, ActionScript'te olay işlemeye yönelik arka plan bilgileri
sağlanmaktadır. Son üç kısımda, olay modelinin ardındaki ana kavramlar açıklanmaktadır: olay akışı, olay nesnesi ve
olay dinleyicileri. ActionScript 3.0 olay işleme sistemi, görüntüleme listesiyle yakından etkileşim kurar ve bu bölümde
görüntüleme listesini temel anlamda bildiğiniz varsayılmıştır. Daha fazla bilgi için, bkz. “Görüntü programlama”
sayfa 265.
Olay işleme temelleri
Olay işlemeye giriş
Olayları, SWF dosyanızdaki, bir programcı olarak ilginizi çeken herhangi türde bir oluşum olarak
değerlendirebilirsiniz. Örneğin, çoğu SWF dosyası, ister fare tıklatmasına yanıt vermek gibi basit, ister bir forma
girilen verileri kabul etme ve işleme gibi karmaşık olsun, bir şekilde kullanıcı etkileşimini destekler. Bu şekilde SWF
dosyanızla gerçekleştirilen herhangi bir kullanıcı etkileşimi olay olarak değerlendirilir. Olaylar herhangi bir doğrudan
kullanıcı etkileşimi olmadan da gerçekleşebilir, örn. bir sunucudan veri yüklemesi sona erdiğinde veya takılan bir
kamera etkin olduğunda.
ActionScript 3.0'da her olay, Event sınıfının veya alt sınıflarından birinin örneği olan bir olay nesnesi tarafından temsil
edilir. Olay nesnesi yalnızca belirli bir olay hakkındaki bilgileri saklamakla kalmaz, aynı zamanda olay nesnesinin
işlenmesini kolaylaştıran yöntemler de içerir. Örneğin, Flash Player veya AIR bir fare tıklatması algıladığında, bu
belirli fare tıklatması olayını temsil etmek için bir olay nesnesi (MouseEvent sınıfının bir örneği) oluşturur.
Flash Player veya AIR, bir olay nesnesi oluşturduktan sonra bu olay nesnesini gönderir, başka bir deyişle, olay nesnesi,
olayın hedefi olan nesneye iletilir. Gönderilen bir olay nesnesinin hedefi görevini gören bir nesne olay hedefi olarak
adlandırılır. Örneğin, takılı bir kamera etkin olduğunda, Flash Player doğrudan olay hedefine (bu durumda kamerayı
temsil eden nesne) bir olay nesnesi gönderir. Ancak olay hedefi, görüntüleme listesindeyse, olay nesnesi olay hedefine
ulaşıncaya kadar görüntüleme listesi hiyerarşisinden aşağı doğru iletilir. Bazı durumlarda, olay nesnesi görüntüleme
listesi hiyerarşisinde aynı rota boyunca geri yukarı doğru "köpürür". Görüntü listesi hiyerarşisindeki bu çapraz geçiş,
olay akışı olarak adlandırılır.
Olay dinleyicilerini kullanarak kodunuzda olay nesnelerini "dinleyebilirsiniz". Olay dinleyicileri, belirli olaylara yanıt
olarak yazdığınız işlevler veya yöntemlerdir. Programınızın olaylara yanıt vermesini sağlamak için, olay hedefine veya
olay nesnesinin olay akışının bir parçası olan herhangi bir görüntüleme listesi nesnesine olay dinleyicileri eklemeniz
gerekir.
Her olay dinleyicisi kodu yazdığınızda, bu kod temel yapıyı takip eder (kalın yazı karakterine sahip öğeler, kendi özel
durumunuz için dolduracağınız yer tutuculardır):
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 244
Olayları işleme
function eventResponse(eventObject:EventType):void
{
// Actions performed in response to the event go here.
}
eventTarget.addEventListener(EventType.EVENT_NAME, eventResponse);
Bu kod iki şey gerçekleştirir. İlk olarak, olaya yanıt olarak gerçekleştirilecek eylemleri belirtmenin bir yolu olan bir
işlevi tanımlar. Daha sonra, işlevin belirtilen olaya abone olmasının sonucu olarak bu, kaynak nesnenin
addEventListener() yöntemini çağırır, böylece olay gerçekleştiğinde işlevin eylemleri gerçekleştirilir. Gerçekten
olay gerçekleştiğinde, olay hedefi, olay dinleyicileri olarak kaydedilen tüm işlevlerin ve yöntemlerin listesini kontrol
eder. Buna karşılık her birini çağırarak olay nesnesini bir parametre olarak iletir.
Kendi olay dinleyicinizi oluşturmak için bu kodda dört şeyi değiştirmeniz gerekir. İlk olarak, işlevin adını, kullanmak
istediğiniz adla değiştirmeniz gerekir. (Kodda eventResponse geçen iki yerde bunun değiştirilmesi gerekir.) İkinci
olarak, dinlemek istediğiniz olay (kodda EventType) tarafından gönderilen olay nesnesinin uygun sınıf adını
belirtmeniz ve bu belirli olay (listede EVENT_NAME) için uygun sabiti belirtmeniz gerekir. Üçüncü olarak, olayı
gönderen (bu kodda eventTarget) nesnede, addEventListener() yöntemini çağırmanız gerekir. İsteğe bağlı olarak,
işlevin parametresi (bu kodda eventObject) olarak kullanılan değişkenin adını değiştirebilirsiniz.
Ortak olay işleme görevleri
Aşağıda, bu bölümde her biri açıklanan ortak olay işleme görevleri yer almaktadır:
• Olayları yanıtlamak için kod yazma
• Kodun olayları yanıtlamasını durdurma
• Olay nesneleriyle çalışma
• Olay akışıyla çalışma:
• Olay akışı bilgilerini tanımlama
• Olay akışını durdurma
• Varsayılan davranışı önleme
• Sınıflarınızdan olayları gönderme
• Özel bir olay türü oluşturma
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:
• Varsayılan davranış: Bazı olaylar, normalde olayla birlikte gerçekleşen ve varsayılan davranış adı verilen bir
davranış içerir. Örneğin, kullanıcı bir metin alanına yazı yazdığında, bir metin girdisi olayı ortaya çıkar. Bu olay için
varsayılan davranış, metin alanına yazılan karakterin gerçekten görüntülenmesidir—ancak bu varsayılan davranışı
geçersiz kılabilirsiniz (herhangi bir nedenle yazılan karakterin görüntülenmesini istemiyorsanız).
• Gönderme: Olay dinleyicilerine bir olayın gerçekleştiğini bildirme.
• Olay: Nesnede gerçekleşen ve nesnenin diğer nesnelere hakkında bilgi verebileceği bir şey.
• Olay akışı: Görüntüleme listesindeki (ekranda görüntülenen bir nesne) bir nesnede olaylar gerçekleştiğinde, söz
konusu nesneyi içeren tüm nesnelere olay bildirilir ve bunlar da karşılık olarak olay dinleyicilerine bildirim
gönderir. Bu işlem Sahne Alanı ile başlar ve görüntüleme listesi üzerinden, olayın gerçekleştiği gerçek nesneye
doğru ilerler, ardından tekrar Sahne Alanı'na doğru geri ilerler. Bu işlem olay akışı olarak bilinir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 245
Olayları işleme
• Olay nesnesi: Belirli bir olayın oluşumu hakkında bilgi içeren bir nesne olup olay gönderildiğinde tüm dinleyicilere
gönderilir.
• Olay hedefi: Gerçekten bir olay gönderen nesne. Örneğin, kullanıcı Sprite içinde olan, dolayısıyla Sahne Alanı
içinde de olan bir düğmeyi tıklatırsa, bu nesnelerin tümü olaylar gönderir ancak olay hedefi (bu durumda tıklatılan
düğme), olayın gerçekten gerçekleştiği yerdir.
• Dinleyici: Belirli bir olay gerçekleştiğinde bunun bildirilmesi gerektiğini belirtmek için bir nesneyle kendini
kaydeden bir nesne veya işlev.
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Aslında, bu bölümdeki tüm kod
listeleri kodun sonucunun test edilmesi için bir trace() işlevi çağrısını içerir. Bu bölümdeki kod listelerini test etmek
için:
1 Flash geliştirme aracını kullanarak boş bir belge oluşturun.
2 Zaman çizelgesinde bir anahtar kare seçin.
3 Eylemler panelini açın ve kod listesini Komut Dosyası bölmesine kopyalayın.
4 Kontrol Et > Filmi Test Et komutu ile programı çalıştırın.
Kod listesinin trace() işlevlerinin sonuçlarını Çıktı panelinde görürsünüz.
Kod listelerinden bazıları daha karmaşık olup bir sınıf olarak yazılır. Bu örnekleri test etmek için:
1 Flash geliştirme aracını kullanarak boş bir belge oluşturun ve belgeyi bilgisayarınıza kaydedin.
2 Yeni bir ActionScript dosyası oluşturun ve bu dosyayı 1. adımda oluşturulan belgeyle aynı dizine kaydedin.
Dosyanın adı ile, kod listesindeki sınıf adının eşleşmesi gerekir. Örneğin, kod listesi, EventTest adında bir sınıfı
tanımlıyorsa, ActionScript dosyasını kaydetmek için EventTest.as adını kullanın.
3 Kod listesini ActionScript dosyasına kopyalayın ve dosyayı kaydedin.
4 Belgenin Özellik denetçisini etkinleştirmek için, belgede Sahne Alanı'nın boş bir bölümünü veya çalışma alanını
tıklatın.
5 Özellik denetçisinde Belge Sınıfı alanına, metinden kopyaladığınız ActionScript sınıfının adını girin.
6 Kontrol Et > Filmi Test Et komutu ile programı çalıştırın
Çıktı panelinde, örneğin sonuçlarını göreceksiniz.
Örnek kod listelerinin test edilmesine yönelik bu teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34
bölümünde daha ayrıntılı şekilde açıklanmıştır.
ActionScript 3.0 olay işleme, önceki sürümlerden nasıl
farklılık gösterir
ActionScript 3.0'da olay işleme ile önceki ActionScript sürümlerinde olay işleme arasındaki en belirgin farklılık, önceki
ActionScript sürümlerinde birçok farklı olay işleme sistemleri bulunurken, ActionScript 3.0'da olay işleme için
yalnızca bir sistem bulunmasıdır. Bu bölüm, önceki ActionScript sürümlerinde olay işlemenin nasıl çalıştığına genel
bakış ile başlar ve sonra ActionScript 3.0 için olay işlemenin nasıl değiştiğini ele alır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 246
Olayları işleme
Önceki ActionScript sürümlerinde olay işleme
ActionScript 3.0 öncesindeki ActionScript sürümleri, olayların işlenmesine yönelik birçok farklı yöntem sağlamıştır:
• Doğrudan Button ve MovieClip örnekleri üzerinde yerleştirilebilen on() olay işleyicileri
• Doğrudan MovieClip örnekleri üzerine yerleştirilebilen onClipEvent() işleyicileri
•
XML.onload ve Camera.onActivity gibi geri çağrı işlevi özellikleri
•
addListener() yöntemi kullanarak kaydettiğiniz olay dinleyicileri
• Kısmı olarak DOM olay modelini uygulayan UIEventDispatcher sınıfı.
Bu mekanizmaların her biri, kendi avantaj ve sınırlama kümesini sunar. on() ve onClipEvent() işleyicilerinin
kullanımı kolaydır ancak doğrudan düğmelerin ve film kliplerinin üzerine yerleştirilen kodun bulunması güç
olduğundan, bu işleyiciler projelerin sonraki bakımını daha güç hale getirir. Geri çağrı işlevleri kolay uygulanabilir
ancak sizi herhangi bir belirli olay için yalnızca bir geri çağrı işleviyle sınırlandırır. Olay dinleyicileri daha zor
uygulanabilir, yalnızca bir dinleyici nesnesi ve işlevinin oluşturulmasını değil aynı zamanda olayı oluşturan nesneyle
dinleyicinin kaydını da gerektirir. Ancak bu yüksek yük, birçok dinleyici nesnesi oluşturmanıza ve bunların tümünü
aynı olay için kaydetmenize olanak sağlar.
ActionScript 2.0 bileşenlerinin geliştirilmesi de başka bir olay modeli oluşturmuştur. UIEventDispatcher sınıfına dahil
edilen bu yeni model, DOM Olayları Belirtimi'nin bir alt kümesini esas almıştır. Bileşen olayı işleme konusunda bilgi
sahibi olan geliştiriciler, yeni ActionScript 3.0 olay modeline geçiş sürecinde daha az zorluk yaşayacaktır.
Ne yazık ki, çeşitli olay modelleri tarafından kullanılan sözdizimi çeşitli şekillerde örtüşür ve çeşitli şekillerde farklılık
gösterir. Örneğin, ActionScript 2.0'da TextField.onChanged gibi bazı özellikler, bir geri çağrı işlevi veya olay
dinleyicisi olarak kullanılabilir. Ancak, dinleyici nesnelerini kaydetmeye yönelik sözdizimi, altı sınıf arasından,
dinleyicileri mi yoksa UIEventDispatcher sınıfını mı destekleyeni kullandığınıza bağlı olarak farklılık gösterir. Key,
Mouse, MovieClipLoader, Selection, Stage ve TextField sınıfları için, addListener() yöntemini kullanırsınız ancak
bileşen olay işlemesi için addEventListener() adında bir yöntem kullanırsınız.
Farklı olay işleme modellerinin sunduğu başka bir karmaşıklık da, kullanılan mekanizmaya bağlı olarak geniş ölçüde
değişiklik gösteren olay işleyici işlevinin kapsamıydı. başka bir deyişle, this anahtar sözcüğünün anlamı olay işleme
sistemleri arasında tutarlı değildi.
ActionScript 3.0'da olay işleme
ActionScript 3.0, önceki dil sürümlerinde varolan birçok farklı olay işleme mekanizmalarının yerini alan tek bir olay
işleme modelini sunar. Yeni olay modeli, Belge Nesnesi Modeli (DOM) Düzey 3 Olaylar Belirtimi'ni esas alır. SWF
dosya formatı özellikle Belge Nesnesi Modeli standardına bağlı olmasa da, DOM olay modelinin uygulanmasının
mümkün olması için görüntüleme listesi ile DOM yapısı arasında yeterince benzerlik vardır. Görüntüleme listesindeki
bir nesne, DOM hiyerarşik yapısındaki bir düğüme benzetilebilir ve görüntüleme listesi nesnesi ile düğüm terimleri de
bu açıklama içinde birbirinin yerine kullanılabilir.
DOM olay modelinin Flash Player ve AIR uygulaması, varsayılan davranışlar adında bir kavram içerir. Varsayılan
davranış, Flash Player veya AIR uygulamasının, belirli olayların normal sonucu olarak çalıştırdığı bir eylemdir.
Varsayılan davranışlar
Geliştiriciler genellikle olayları yanıtlayan kod yazmakla sorumludur. Ancak bazı durumlarda bir davranış bir olayla o
kadar yaygın şekilde ilişkilendirilmiştir ki, geliştirici davranışı iptal etmek için kod eklemediği sürece Flash Player veya
AIR uygulaması davranışı otomatik olarak çalıştırır. Flash Player veya AIR otomatik olarak davranış sergilediğinden,
bu davranışlar varsayılan davranışlar olarak bilinir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 247
Olayları işleme
Örneğin, kullanıcı bir TextField nesnesine metin girdiğinde, metnin TextField nesnesinde görüntülenmesi o kadar
yaygındır ki, Flash Player ve AIR uygulamasında bu davranış yerleşik olarak bulunur. Bu varsayılan davranışın
gerçekleşmesini istemiyorsanız, yeni olay işleme sistemini kullanarak bu davranışı iptal edebilirsiniz. Kullanıcı bir
TextField nesnesine metin girdiğinde, Flash Player veya AIR, kullanıcı girdisini temsil etmek için TextEvent sınıfının
bir örneğini oluşturur. Flash Player veya AIR uygulamasının, TextField nesnesinde metni görüntülemesini önlemek
için, bu belirli TextEvent örneğine erişmeniz ve örneğin preventDefault() yöntemini çağırmanız gerekir.
Varsayılan davranışların tümü önlenemez. Örneğin, kullanıcı TextField nesnesinde bir sözcüğü çift tıklattığında, Flash
Player ve AIR bir MouseEvent nesnesi oluşturur. Bu önlenemeyen varsayılan davranış, imlecin altındaki sözcüğün
vurgulanmasıdır.
Birçok olay nesnesi türü, ilişkilendirilmiş davranışa sahip değildir. Örneğin, bir ağ bağlantısı kurulduğunda Flash
Player bir bağlanma olay nesnesi gönderir ancak bununla ilişkilendirilmiş bir varsayılan davranış yoktur. Event
sınıfının ve alt sınıflarının API belgeleri, olay türlerinin her birini listeler, ilişkilendirilmiş varsayılan davranışları ve bu
davranışın önlenip önlenemeyeceğini açıklar.
Varsayılan davranışların yalnızca Flash Player veya AIR tarafından gönderilen olay nesneleriyle ilişkilendirildiğinin ve
ActionScript üzerinden programlama yoluyla gönderilen olay nesneleri için varolmadığının anlaşılması önemlidir.
Örneğin, textInput türünde bir olay nesnesi göndermek için EventDispatcher sınıfının yöntemlerini
kullanabilirsiniz ancak bu olay nesnesi kendisiyle ilişkilendirilmiş varsayılan bir davranışa sahip olmaz. Başka bir
deyişle, Flash Player ve AIR, programlama yoluyla gönderdiğiniz textInput olayının sonucunda TextField
nesnesinde bir karakter görüntülemez.
ActionScript 3.0'daki olay dinleyicilerine yönelik yenilikler
ActionScript 2.0 addListener() yöntemini kullanma konusunda deneyimli geliştiriciler için, ActionScript 2.0 olay
dinleyicisi modeli ile ActionScript 3.0 olay modeli arasındaki farklılıkların belirtilmesi yardımcı olacaktır. Aşağıdaki
listede, iki olay modeli arasındaki önemli farklılıklar açıklanmaktadır:
• ActionScript 2.0'da olay dinleyicileri eklemek için, bazı durumlarda addListener() yöntemini ve bazı durumlarda
da addEventListener() yöntemini kullanırken, ActionScript 3.0'da tüm durumlarda addEventListener()
yöntemini kullanırsınız.
• ActionScript 2.0'da herhangi bir olay akışı yoktur, başka bir deyişle, addListener() yöntemi yalnızca olayı
yayınlayan nesnede çağrılabilir, ActionScript 3.0'da ise olay akışının parçası olan herhangi bir nesnede
addEventListener() yöntemi çağrılabilir.
• ActionScript 2.0'da, işlevler, yöntemler veya nesneler olay dinleyicileri olabilirken, ActionScript 3.0'da yalnızca
işlevler ya da yöntemler olay dinleyicileri olabilir.
Olay akışı
Flash Player veya AIR, her olay gerçekleştiğinde olay nesneleri gönderir. Olay hedefi görüntüleme listesinde
bulunmuyorsa, Flash Player veya AIR doğrudan olay hedefine olay nesnesini gönderir. Örneğin, Flash Player
doğrudan bir URLStream nesnesine ilerleme olay nesnesini gönderir. Ancak olay hedefi görüntüleme listesinde
bulunuyorsa, Flash Player, görüntüleme listesine olay nesnesini gönderir ve olay nesnesi, görüntüleme listesi
üzerinden olay hedefine doğru seyahat eder.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 248
Olayları işleme
Olay akışı, bir olay nesnesinin görüntüleme listesi üzerinden nasıl hareket ettiğini açıklar. Görüntüleme listesi, ağaç
olarak tanımlanabilen bir hiyerarşide organize edilir. Görüntüleme listesi hiyerarşisinin en üstünde Sahne Alanı yer
alır, bu, görüntüleme listesinin kökü görevini gören özel bir görüntüleme nesnesi konteyneridir. Sahne Alanı,
flash.display.Stage sınıfı tarafından temsil edilir ve yalnızca bir görüntüleme nesnesi üzerinden Sahne Alanı'na
erişilebilir. Her görüntüleme nesnesi, söz konusu uygulamanın Sahne Alanı'nı ifade eden stage adında bir özelliğe
sahiptir
Flash Player veya AIR, görüntüleme listesiyle ilgili bir olay için bir olay nesnesi gönderir, bu olay nesnesi, Sahne
Alanı'ndan hedef düğüme dairesel bir seyahatte bulunur. DOM Olayları Belirtimi, hedef düğümü olay hedefini temsil
eden düğüm olarak tanımlar. Başka bir deyişle, hedef düğüm, olayın gerçekleştiği görüntüleme listesi nesnesidir.
Örneğin, kullanıcı child1 adında bir görüntüleme listesi nesnesini tıklatırsa, Flash Player veya AIR uygulaması hedef
düğüm olarak child1 öğesini kullanarak bir olay nesnesi gönderir.
Olay akışı kavramsal olarak üç bölüme ayrılmıştır. Birinci bölüm yakalama aşaması olarak adlandırılır; bu aşama
Sahne Alanı'ndan hedef düğümün üst öğesine kadar tüm düğümleri kapsar. İkinci bölüm hedef aşaması olarak
adlandırılıp yalnızca hedef düğümü içerir. Üçüncü bölüm ise köpürme aşaması olarak adlandırılır. Köpürme aşaması,
hedef düğümün üst öğesinden geri Sahne Alanı'na doğru dönüş yolculuğunda karşılaşılan düğümleri kapsar.
Aşağıdaki diyagramda gösterildiği gibi, görüntüleme listesini, Sahne Alanı'nın en üstte bulunduğu dikey bir hiyerarşi
olarak algılarsanız, aşamaların adları daha anlamlı gelecektir:
Sahne Alanı
Üst Düğüm
Alt1 Düğüm
Alt2 Düğüm
Kullanıcı Child1 Node üzerini tıklatırsa, Flash Player veya AIR uygulaması olay akışına bir olay nesnesi gönderir.
Aşağıdaki görüntüde gösterildiği gibi, nesnenin seyahati Stage öğesinde başlar, Parent Node öğesinden aşağı devam
ederek Child1 Node öğesine ilerler ve sonra geri Stage öğesine doğru "köpürerek" Stage öğesine doğru seyahati
sırasında tekrar Parent Node üzerinden hareket eder.
Sahne Alanı
Yakalama
Aşaması
Köpürme
Aşaması
Üst Düğüm
Alt1 Düğüm
Alt2 Düğüm
Hedefleme
Aşaması
Bu örnekte, yakalama aşaması, ilk aşağı doğru seyahat sırasında Stage ve Parent Node öğelerini kapsar. Hedef
aşaması, Child1 Node üzerinde harcanan süreyi kapsar. Köpürme aşaması, geri kök düğüme doğru yukarı yönde
yapılan seyahat sırasında karşılaşılan Parent Node ve Stage öğelerini kapsar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 249
Olayları işleme
Olay akışı, ActionScript programcıları için önceden kullanılabilir olan olay işleme sisteminden daha güçlü bir olay
işleme sistemi elde edilmesine katkıda bulunur. Önceki ActionScript sürümlerinde olay akışı yoktur, başka bir deyişle,
olay dinleyicileri yalnızca olayı oluşturan nesneye eklenebilir. ActionScript 3.0'da, yalnızca hedef düğüme değil, aynı
zamanda olay akışındaki herhangi bir düğüme de olay dinleyicileri ekleyebilirsiniz.
Bir kullanıcı arabirimi bileşeni birden çok nesneyi kapsadığında, olay akışı sırasında olay dinleyicileri ekleme yeteneği
yararlı olur. Örneğin, bir düğme nesnesi genellikle düğmenin etiketi görevini gören bir metin nesnesi içerir. Olay
akışına dinleyici ekleme yeteneği olmadığında, düğmenin herhangi bir yerinde oluşan tıklatma olayları hakkında
bildirim almak için hem düğme nesnesine hem de metin nesnesine dinleyici eklemeniz gerekir. Olay akışının olması
ise, düğme nesnesine, hem metin nesnesi üzerinde hem de düğme nesnesinin metin nesnesinin kaplamadığı alanları
üzerinde gerçekleşen tıklatma olaylarını işleyen tek bir olay dinleyicisi yerleştirmenize olanak sağlar.
Ancak her olay nesnesi, olay akışının üç aşamasına da katılmaz. enterFrame ve init gibi bazı olay türleri, doğrudan
hedef düğüme gönderilir ve yakalama aşamasına ve köpürme aşamasına katılmaz. Başka olaylar da, Socket sınıfının
bir örneğine gönderilen olaylar gibi görüntüleme listesinde bulunmayan nesneleri hedefleyebilir. Bu olay nesneleri de
yakalama ve köpürme aşamalarına katılmadan doğrudan hedef nesneye akar.
Belirli olay türlerinin nasıl davrandığını öğrenmek için, API belgelerini kontrol edebilir veya olay nesnesinin
özelliklerini inceleyebilirsiniz. Olay nesnesinin özelliklerinin incelenmesi, aşağıdaki bölümde açıklanmıştır.
Olay nesneleri
Olay nesneleri, yeni olay işleme sisteminde iki ana amaca hizmet eder. Birinci olarak, olay nesneleri belirli olaylar
hakkındaki bilgileri bir özellikler kümesinde saklayarak gerçek olayları temsil eder. İkinci olarak, olay nesneleri, olay
nesnelerini işlemenize ve olay işleme sisteminin davranışını etkilemenize olanak sağlayan yöntemler kümesini içerir.
Bu özellik ve yöntemlere erişilmesini kolaylaştırmak için, Flash Player API'si, tüm olay nesneleri için temel sınıf görevi
gören bir Event sınıfını tanımlar. Event sınıfı, tüm olay nesneleri için ortak olan özellik ve yöntemlerin temel bir
kümesini tanımlar.
Bu bölüm Event sınıfı özelliklerinin ele alınmasıyla başlar, Event sınıfı yöntemlerinin açıklamasıyla devam eder ve
neden Event sınıfının alt sınıflarının varolduğuna dair bir açıklamayla sona erer.
Event sınıfı özelliklerini anlama
Event sınıfı, bir olay nesnesi hakkında önemli bilgiler sağlayan birçok salt okunur özellik ve sabitleri tanımlar. Özellikle
şunlar çok önemlidir:
• Olay nesnesi türleri, sabitler tarafından temsil edilir ve Event.type özelliğinde saklanır.
• Bir olayın varsayılan davranışının önlenip önlenemeyeceği, bir Boolean değeriyle temsil edilir ve
Event.cancelable özelliğinde saklanır.
• Olay akışı bilgileri, kalan özelliklerde bulunur.
Olay nesnesi türleri
Her olay nesnesi ilişkilendirilmiş bir olay türüne sahiptir. Olay türleri, dize değerleri olarak Event.type özelliğinde
saklanır. Kodunuzun birbirinden farklı türdeki nesneleri ayırt edebilmesi için, olay nesnesi türünün bilinmesi
yararlıdır Örneğin, aşağıdaki kod, clickHandler() dinleyici işlevinin, myDisplayObject öğesine iletilen herhangi
bir fare tıklatma olay nesnelerini yanıtlaması gerektiğini belirtir:
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 250
Olayları işleme
Event sınıfı ile yirmi olay türü ilişkilendirilmiş olup bunlar Event sınıfı sabitleri tarafından temsil edilir ve bazıları
aşağıdaki Event sınıfı tanımının alıntısında gösterilmektedir:
package flash.events
{
public class Event
{
// class constants
public static const ACTIVATE:String = "activate";
public static const ADDED:String= "added";
// remaining constants omitted for brevity
}
}
Bu sabitler, belirli olay türlerini ifade etmenin kolay bir yolunu sağlar. Temsil ettikleri dizeleri kullanmak yerine bu
sabitleri kullanmanız gerekir. Kodunuzda bir sabit adını yanlış yazarsanız, derleyici yanlışı yakalar ancak bunun yerine
dizeleri kullanırsanız, derleme zamanında yazım hatası bildirilmeyebilir ve bu da hata ayıklaması yapılması zor olan
beklenmeyen bir davranışa yol açabilir. Örneğin, bir olay dinleyicisi eklerken şu kodu kullanın:
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
şunu kullanmayın:
myDisplayObject.addEventListener("click", clickHandler);
Varsayılan davranış bilgileri
Kodunuz, cancelable özelliğine erişerek belirli bir olay nesnesinin varsayılan davranışının önlenip
önlenemeyeceğini kontrol edebilir. cancelable özelliği, varsayılan bir davranışın önlenip önlenemeyeceğini belirten
bir Boolean değerini içerir. preventDefault() yöntemini kullanarak, az sayıda olayla ilişkilendirilmiş varsayılan
davranışı önleyebilir veya iptal edebilirsiniz. Daha fazla bilgi için, bkz. Varsayılan olay davranışını iptal etme, “Event
sınıfı yöntemlerini anlama” sayfa 251.
Olay akışı bilgileri
Kalan Event sınıfı özellikleri, aşağıdaki listede açıklandığı gibi, olay nesnesi ve olay nesnesinin olay akışıyla ilişkisi
hakkında önemli bilgiler içerir:
•
bubbles özelliği, olay nesnesinin katıldığı olay akışının bölümleri hakkında bilgiler içerir.
•
eventPhase özelliği, olay akışındaki geçerli aşamayı belirtir.
•
target özelliği, olay hedefine bir başvuruyu saklar.
•
currentTarget özelliği, geçerli olarak olay nesnesini işleyen görüntüleme listesi nesnesine bir başvuruyu saklar.
bubbles özelliği
Bir olayın olay nesnesi, olay akışının köpürme aşamasına katılıyorsa, başka bir deyişle, olay nesnesi, Sahne Alanı'na
ulaşıncaya kadar üst öğeleri üzerinden hedef düğümden geri iletiliyorsa, o olayın köpürdüğü söylenebilir.
Event.bubbles özelliği, olay nesnesinin köpürme aşamasına katılıp katılmadığını belirten bir Boolean değerini
saklar. Köpüren tüm olaylar ayrıca yakalama ve hedef aşamalarına da katıldığından, köpüren tüm olaylar, olay akışı
aşamalarının üçüne de katılır. Değer true olursa, olay nesnesi üç aşamanın tamamına katılır. Değer false olursa, olay
nesnesi köpürme aşamasına katılmaz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 251
Olayları işleme
eventPhase özelliği
eventPhase özelliğini inceleyerek herhangi bir olay nesnesinin olay aşamasını belirleyebilirsiniz. eventPhase özelliği,
olay akışının üç aşamasından birini temsil eden işaretsiz bir tam sayı değeri içerir. Flash Player API'si, aşağıdaki kod
alıntısında gösterildiği gibi, üç işaretsiz tam sayı değerine karşılık gelen üç sabiti içeren ayrı bir EventPhase sınıfını
tanımlar:
package flash.events
{
public final class EventPhase
{
public static const CAPTURING_PHASE:uint = 1;
public static const AT_TARGET:uint = 2;
public static const BUBBLING_PHASE:uint= 3;
}
}
Bu sabitler, eventPhase özelliğinin üç geçerli değerine karşılık gelir. Kodunuzu daha okunaklı hale getirmek için bu
sabitleri kullanabilirsiniz. Örneğin, yalnızca olay hedefi, hedef sahne alanı üzerinde olduğunda myFunc() adında bir
işlevin çağrılmasını sağlamak istiyorsanız, bu koşulu test etmek için şu kodu kullanabilirsiniz:
if (event.eventPhase == EventPhase.AT_TARGET)
{
myFunc();
}
target özelliği
target özelliği, olayın hedefi olan nesneye bir başvuru içerir. Bazı durumlarda bu olabildiğince nettir, örneğin,
mikrofon etkin hale geldiğinde, olay nesnesinin hedefi Microphone nesnesidir. Ancak hedef, görüntüleme
listesindeyse, görüntüleme listesi hiyerarşisinin dikkate alınması gerekir. Örneğin, kullanıcı, örtüşen görüntüleme
listesi nesneleri içeren bir noktaya fare tıklatması girerse, Flash Player ve AIR uygulaması, olay hedefi olarak her zaman
Sahne Alanı'nın en uzağında bulunan nesneyi seçer.
Karmaşık SWF dosyaları için, özellikle de içindeki düğmelerin rutin olarak daha küçük alt nesnelerle süslendiği SWF
dosyaları için, target özelliği genellikle düğme yerine düğmenin alt nesnesini işaret ettiği için, bu özellik sık
kullanılmaz. Bu durumlarda en yaygın uygulama, düğmeye olay dinleyicileri eklenmesi ve target özelliği düğmenin
alt öğesini işaret edebilirken currentTarget özelliği düğmeyi işaret ettiğinden bu ikinci özelliğin kullanılmasıdır.
currentTarget özelliği
currentTarget özelliği, geçerli olarak olay nesnesini işleyen nesneye bir başvuruyu saklar. İncelediğiniz olay
nesnesini geçerli olarak hangi düğümün işlediğinin bilinmesi garip görünse de, o olay nesnesinin olay akışında
herhangi bir görüntüleme nesnesine dinleyici işlevi ekleyebileceğinizi ve dinleyici işlevinin herhangi bir konuma
yerleştirilebileceğini unutmayın. Üstelik aynı dinleyici işlevi farklı görüntüleme nesnelerine eklenebilir. Projenin
boyutu ve karmaşıklık düzeyi arttıkça, currentTarget özelliği çok daha fazla kullanışlı hale gelir.
Event sınıfı yöntemlerini anlama
Event sınıfı yöntemlerinin üç kategorisi vardır:
• Bir olay nesnesinin kopyalarını oluşturabilen veya bir dizeye dönüştürebilen yardımcı program yöntemleri
• Olay akışından olay nesnelerini kaldıran olay akışı yöntemleri
• Varsayılan davranışı önleyen veya varsayılan davranışın önlenmiş olup olmadığını kontrol eden varsayılan
davranış yöntemleri
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 252
Olayları işleme
Event sınıfı yardımcı program yöntemleri
Event sınıfında iki yardımcı program yöntemi vardır. clone() yöntemi, bir olay nesnesinin kopyalarını
oluşturmanıza olanak sağlar. toString() yöntemi, değerleriyle birlikte bir olay nesnesinin özelliklerinin dize
temsilini oluşturmanıza olanak sağlar. Bu yöntemlerin ikisi de olay modeli sistemi tarafından dahili olarak kullanılır
ancak genel kullanım için geliştiricilere sunulmuştur.
Event sınıfının alt sınıflarını oluşturan ileri düzey geliştiriciler için, olay alt sınıfının düzgün çalışmasını sağlamak için
her iki yardımcı program yönteminin sürümlerini geçersiz kılmanız ve uygulamanız gerekir.
Olay akışını durdurma
Bir olay nesnesinin olay akışında yoluna devam etmesini önlemek için Event.stopPropagation() yöntemini veya
Event.stopImmediatePropagation() yöntemini çağırabilirsiniz. Neredeyse aynı olan ve yalnızca geçerli düğümün
diğer olay dinleyicilerinin çalıştırılmasına izin verilip verilmediğine göre değişiklik gösteren iki yöntem vardır:
•
Event.stopPropagation() yöntemi, olay nesnesinin sonraki düğüme hareket etmesini önler ancak yalnızca
geçerli düğümdeki diğer olay dinleyicilerinin çalıştırılmasına izin verildikten sonra bunu yapar.
•
Event.stopImmediatePropagation() yöntemi de, olay nesnesinin sonraki düğüme hareket etmesini önler
ancak geçerli düğümdeki diğer olay dinleyicilerinin çalıştırılmasına izin vermez.
Bu yöntemlerden herhangi birinin çağrılması, bir olayla ilişkilendirilmiş varsayılan davranışın gerçekleşip
gerçekleşmemesi üzerinde herhangi bir etki yaratmaz. Varsayılan davranışı önlemek için Event sınıfının varsayılan
davranış yöntemlerini kullanın.
Varsayılan olay davranışını iptal etme
Varsayılan davranışın iptal edilmesine yönelik iki yöntem, preventDefault() yöntemi ve isDefaultPrevented()
yöntemidir. Bir olayla ilişkilendirilmiş varsayılan davranışı iptal etmek için preventDefault() yöntemini çağırın. Bir
olay nesnesinde preventDefault() öğesinin önceden çağrılmış olup olmadığını kontrol etmek için,
isDefaultPrevented() yöntemini çağırın, bu yöntem önceden çağrılmışsa true değeri, aksi takdirde false değeri
döndürülür.
Yalnızca olayın varsayılan davranışı iptal edilebiliyorsa preventDefault() yöntemi çalışır. Bu olay türünün API
belgelerine başvurarak veya olay nesnesinin cancelable özelliğini incelemek için ActionScript'i kullanarak bu şekilde
olup olmadığını kontrol edebilirsiniz.
Varsayılan davranışın iptal edilmesi, olay akışı boyunca olay nesnesinin ilerlemesi üzerinde herhangi bir etki yaratmaz.
Bir olayı olay akışından kaldırmak için Event sınıfının olay akışı yöntemlerini kullanın.
Event sınıfının alt sınıfları
Birçok olay için, Event sınıfında tanımlı olan ortak özellik kümesi yeterlidir. Ancak diğer olaylar, Event sınıfında
kullanılabilir özellikler tarafından yakalanamayan benzersiz özelliklere sahiptir. Bu olaylar için, ActionScript 3.0,
Event sınıfının birçok alt sınıfını tanımlar.
Her alt sınıf, ek özellikler ve o olay kategorisi için benzersiz olan olay türleri sağlar. Örneğin, fare girdisiyle ilgili olaylar,
Event sınıfında tanımlı özellikler tarafından yakalanamayan birçok benzersiz özelliğe sahiptir. MouseEvent sınıfı, fare
olayının konumu ve fare olayı sırasında belirli tuşlara basılmış olup olmadığı gibi bilgileri içeren on özellik ekleyerek
Event sınıfını genişletir.
Event alt sınıfı ayrıca alt sınıfla ilişkilendirilmiş olay türlerini temsil eden sabitleri de içerir. Örneğin, MouseEvent sınıfı
click, doubleClick, mouseDown ve mouseUp olay türleri de dahil olmak üzere birçok fare olayı türü için sabitleri
tanımlar.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 253
Olayları işleme
“Olay nesneleri” sayfa 249 altındaki Event sınıfı yardımcı program yöntemleri bölümünde açıklandığı gibi, Event alt
sınıfı oluştururken, alt sınıfa özgü işlevsellik sağlamak için clone() ve toString() yöntemlerini geçersiz kılmanız
gerekir.
Olay dinleyicileri
Olay işleyicileri olarak da adlandırılan olay dinleyicileri, Flash Player ve AIR uygulamasının belirli olaylara yanıt olarak
çalıştırdığı işlevlerdir. Olay dinleyicisi ekleme, iki adımdan oluşan bir işlemdir. İlk olarak, Flash Player veya AIR
uygulamasının olaya yanıt olarak çalıştırması için bir işlev veya sınıf yöntemi oluşturursunuz. Bu bazen dinleyici işlevi
veya olay işleyici işlevi olarak adlandırılır. İkinci olarak, dinleyici işlevinizi olayın hedefiyle veya uygun olay akışında
bulunan herhangi bir görüntüleme listesi nesnesiyle kaydetmek için addEventListener() yöntemini kullanırsınız.
Dinleyici işlevi oluşturma
Dinleyici işlevlerinin oluşturulması, ActionScript 3.0 olay modelinin DOM olay modelinden değişiklik gösterdiği bir
noktadır. DOM olay modelinde, olay dinleyicisi ile dinleyici işlevi arasında net bir ayrım vardır: olay dinleyicisi,
EventListener arabirimini uygulayan bir sınıf örneğiyken, dinleyici işlevi, o sınıfın handleEvent() adındaki bir
yöntemidir. DOM olay modelinde, gerçek dinleyici işlevini değil, dinleyici işlevini içeren sınıf örneğini kaydedersiniz.
ActionScript 3.0 olay modelinde, olay dinleyicisi ile dinleyici işlevi arasında belirgin bir fark yoktur. ActionScript 3.0,
bir EventListener arabirimine sahip değildir ve dinleyici işlevleri, sınıfın dışında veya sınıfın parçası olarak
tanımlanabilir. Üstelik, dinleyici işlevlerinin mutlaka handleEvent() olarak adlandırılması gerekmez—herhangi bir
geçerli tanımlayıcı ile adlandırılabilir. ActionScript 3.0'da, gerçek dinleyici işlevinin adını kaydedersiniz.
Bir sınıfın dışında tanımlanan dinleyici işlevi
Şu kod, kırmızı bir kare şeklini görüntüleyen basit bir SWF dosyası oluşturur. Bir sınıfın parçası olmayan
clickHandler() adında bir dinleyici işlevi, kırmızı kare üzerindeki fare tıklatma olaylarını dinler.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 254
Olayları işleme
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, clickHandler);
}
}
function clickHandler(event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
Kullanıcı, kareyi tıklatarak sonuçta elde edilen SWF dosyasıyla etkileşim kurduğunda, Flash Player veya AIR şu iz
çıktısını oluşturur:
clickHandler detected an event of type: click
the this keyword refers to: [object global]
Olay nesnesinin clickHandler() öğesine bir argüman olarak iletildiğine dikkat edin. Bu, dinleyici işlevinizin olay
nesnesini incelemesine olanak sağlar. Bu örnekte, olayın bir tıklatma olayı olduğundan emin olmak için olay
nesnesinin type özelliğini kullanırsınız.
Bu örnek ayrıca this anahtar sözcüğünün değerini de kontrol eder. Bu durumda, this öğesi, genel nesneyi temsil
eder; işlev herhangi bir özel sınıf veya nesne dışında tanımlandığından bu akıllıcadır.
Sınıf yöntemi olarak tanımlanan dinleyici işlevi
Aşağıdaki örnek, ClickExample sınıfını tanımlayan bir önceki örnekle aynıdır; tek farkı clickHandler() işlevinin,
ChildSprite sınıfının bir yöntemi olarak tanımlanmasıdır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 255
Olayları işleme
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, clickHandler);
}
private function clickHandler(event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
}
Kullanıcı, kırmızı kareyi tıklatarak sonuçta elde edilen SWF dosyasıyla etkileşim kurduğunda, Flash Player veya AIR
şu iz çıktısını oluşturur:
clickHandler detected an event of type: click
the this keyword refers to: [object ChildSprite]
this anahtar sözcüğünün child adında ChildSprite örneğini ifade ettiğini unutmayın. Bu, ActionScript 2.0'daki
davranışta gerçekleşen bir değişikliktir. ActionScript 2.0'daki bileşenleri kullandıysanız,
UIEventDispatcher.addEventListener() öğesine bir sınıf yöntemi iletildiğinde, yöntem kapsamının, dinleyici
yönteminin tanımlandığı sınıf ile değil, olayı yayınlayan bileşenle sınırlı olduğunu hatırlayabilirsiniz. Başka bir deyişle,
ActionScript 2.0'da bu tekniği kullandıysanız, this anahtar sözcüğü, ChildSprite örneğini değil, olayı yayınlayan
bileşeni ifade eder.
Dinleyici yöntemini içeren diğer sınıf yöntemlerine ve özelliklerine erişemedikleri anlamına geldiğinden, bazı
programcılar için bu önemli bir sorundu. Geçici bir çözüm olarak, ActionScript 2.0 programcıları dinleyici
yönteminin kapsamını değiştirmek için mx.util.Delegate sınıfını kullanabiliyordu. Ancak ActionScript 3.0,
addEventListener() çağrıldığında bir sınır oluşturduğundan artık buna gerek kalmamıştır. Sonuç olarak, this
anahtar sözcüğü child adındaki ChildSprite örneğini ifade eder ve programcı, ChildSprite sınıfının diğer
yöntemlerine ve özelliklerine erişim kazanır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 256
Olayları işleme
Kullanılmaması gereken olay dinleyicisi
Atanmış dinleyici işlevini dinamik olarak işaret eden bir özellik ile genel bir nesne oluşturduğunuz üçüncü bir teknik
daha vardır ancak bu teknik önerilmez. ActionScript 2.0'da yaygın olarak kullanıldığından bu teknik burada ele
alınmıştır, ancak ActionScript 3.0'da bu tekniğin kullanılmaması gerekir. this anahtar sözcüğü dinleyici nesne yerine
genel nesneyi ifade edeceğinden bu teknik önerilmez.
Aşağıdaki örnek, önceki ClickExample sınıfıyla aynıdır, tek farkı, dinleyici işlevinin myListenerObj adında genel bir
nesnenin parçası olarak tanımlanmasıdır:
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, myListenerObj.clickHandler);
}
}
var myListenerObj:Object = new Object();
myListenerObj.clickHandler = function (event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
İzleme sonuçları şöyle görünür:
clickHandler detected an event of type: click
the this keyword refers to: [object global]
this öğesinin myListenerObj öğesini ifade etmesini ve izleme çıktısının [object Object] olmasını beklersiniz
ancak bu genel nesneyi ifade eder. addEventListener() öğesine argüman olarak dinamik bir özellik adı ilettiğinizde,
Flash Player veya AIR uygulaması bir sınır yöntemi oluşturamaz. Bunun nedeni, listener parametresi olarak
ilettiğiniz şeyin, dinleyici işlevinizin bellek adresinden başka bir şey olmaması ve Flash Player ve AIR uygulamasının,
bu bellek adresini myListenerObj örneğiyle bağlamasının bir yolu olmamasıdır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 257
Olayları işleme
Olay dinleyicilerini yönetme
IEventDispatcher arabiriminin yöntemlerini kullanarak dinleyici işlevlerinizi yönetebilirsiniz. IEventDispatcher
arabirimi, DOM olay modelinin EventTarget arabiriminin ActionScript 3.0 sürümüdür. IEventDispatcher adı, ana
amacının olay nesnelerini göndermek olduğunu ima etse de, bu sınıfın yöntemleri, olay nesnelerini kaydetmek, olay
dinleyicilerini kontrol etmek ve olay dinleyicilerini kaldırmak için çok daha sık kullanılır. IEventDispatcher arabirimi,
aşağıdaki kodda gösterildiği gibi beş yöntemi tanımlar:
package flash.events
{
public interface IEventDispatcher
{
function addEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false,
priority:Integer=0,
useWeakReference:Boolean=false):Boolean;
function removeEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false):Boolean;
function dispatchEvent(eventObject:Event):Boolean;
function hasEventListener(eventName:String):Boolean;
function willTrigger(eventName:String):Boolean;
}
}
Flash Player API'si, olay hedefleri veya olay akışının parçası olabilen tüm sınıflar için temel sınıf görevi gören
EventDispatcher sınıfı ile IEventDispatcher arabirimini uygular. Örneğin, DisplayObject sınıfı, EventDispatcher
sınıfından miras alır. Başka bir deyişle, görüntüleme listesindeki herhangi bir nesne, IEventDispatcher arabiriminin
yöntemlerine erişime sahiptir.
Olay dinleyicileri ekleme
addEventListener() yöntemi, IEventDispatcher arabiriminin en etkin öğesidir. Dinleyici işlevlerinizi kaydetmek
için bunu kullanırsınız. type ve listener iki zorunlu parametredir. Olayın türünü belirtmek için type parametresini
kullanırsınız. Olay gerçekleştiğinde çalıştırılacak dinleyici işlevini belirtmek için listener parametresini
kullanırsınız. listener parametresi bir işlev veya sınıf yöntemine başvuru olabilir.
Not: listener parametresini belirtirken parantez kullanmayın. Örneğin, aşağıdaki addEventListener() yöntemine
yapılan çağrıda, clickHandler() işlevi parantez olmadan belirtilmiştir:
Not: addEventListener(MouseEvent.CLICK, clickHandler).
addEventListener() yönteminin useCapture parametresi, dinleyicinizin etkin olacağı olay akışı aşamasını
denetlemenize olanak sağlar. useCapture öğesi true değerine ayarlanırsa, olay akışının yakalama aşaması sırasında
dinleyiciniz etkin olur. useCapture öğesi false değerine ayarlanırsa, olay akışının köpürme aşaması sırasında
dinleyiciniz etkin olur. Olay akışının tüm aşamaları sırasında bir olayı dinlemek için, bir kez useCapturetrue
değerine ayarlıyken ve daha sonra da bir kez useCapturefalse değerine ayarlıyken addEventListener() öğesini iki
defa çağırmanız gerekir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 258
Olayları işleme
addEventListener() yönteminin priority parametresi, DOM Düzey 3 olay modelinin resmi bir parçası değildir.
Bu, olay dinleyicilerinizi organize etmenizde size daha fazla esneklik sağlamak üzere ActionScript 3.0'a dahil edilmiştir.
addEventListener() öğesini çağırdığınızda, priority parametresi olarak bir tam sayı değeri ileterek o olay
dinleyicisi için önceliği ayarlayabilirsiniz. Varsayılan değer 0'dır ancak siz bunu negatif veya pozitif tam sayı
değerlerine ayarlayabilirsiniz. Sayı ne kadar yükselirse, olay dinleyicisi o kadar önce çalıştırılır. Aynı önceliğe sahip
olay dinleyicileri, eklendikleri sırayla çalıştırılır, bu nedenle dinleyici ne kadar önce eklenirse, o kadar önce çalıştırılır.
useWeakReference parametresi, dinleyici işlevine başvurunun zayıf mı yoksa normal mi olduğunu belirtmenize
olanak sağlar. Bu parametrenin true değerine ayarlanması, dinleyici işlevlerinin ihtiyaç duyulmadığı halde bellekte
kalmaya devam ettiği durumları önlemenize olanak sağlar. Flash Player ve AIR uygulaması, artık kullanılmayan
nesneleri bellekten temizlemek için çöp toplama adı verilen bir tekniği kullanır. Bir nesneye herhangi bir başvuru
yoksa, o nesne artık kullanılmıyor olarak değerlendirilir. Çöp toplayıcı, zayıf başvuruları yoksayar, başka bir deyişle,
bir dinleyici işlevi kendisini işaret eden yalnızca bir zayıf başvuruya sahipse, çöp toplama için uygun demektir.
Olay dinleyicilerini kaldırma
Artık ihtiyaç duyulmayan bir olay dinleyicisini kaldırmak için removeEventListener() yöntemini kullanabilirsiniz
Artık kullanılmayacak dinleyicilerin kaldırılması iyi bir fikirdir. Zorunlu parametreler arasında eventName ve
listener parametreleri yer alır ve bunlar, addEventListener() yönteminin zorunlu parametreleriyle aynıdır. Bir
kez useCapturetrue değerine ayarlıyken ve daha sonra tekrar false değerine ayarlıyken toplamda iki defa
addEventListener() öğesini çağırarak tüm olay aşamaları sırasında olayları dinleyebileceğinizi unutmayın. Her iki
olay dinleyicisini de kaldırmak için, bir kez useCapturetrue değerine ayarlıyken ve daha sonra tekrar false değerine
ayarlıyken toplam iki defa removeEventListener() öğesini çağırmanız gerekir.
Olaylar gönderme
dispatchEvent() yöntemi, olay akışına özel bir olay nesnesi göndermek için ileri düzey programcılar tarafından
kullanılabilir. Bu yöntem tarafından kabul edilen tek parametre, Event sınıfının veya Event sınıfının bir alt sınıfının
örneği olması gereken bir olay nesnesine başvurudur. Gönderildikten sonra, olay nesnesinin target özelliği,
dispatchEvent() öğesinin çağrıldığı nesneye ayarlanır.
Varolan olay dinleyicilerini kontrol etme
IEventDispatcher arabiriminin son iki yöntemi, olay dinleyicilerinin varlığı hakkında yararlı bilgiler sağlar. Belirli bir
görüntüleme nesnesindeki belirli bir olay türü için bir olay dinleyicisi bulunursa, hasEventListener() yöntemi true
değerini döndürür. Ayrıca belirli bir görüntüleme listesi nesnesi için bir dinleyici bulunursa da willTrigger()
yöntemi true değerini döndürür, ancak willTrigger() öğesi yalnızca o görüntüleme nesnesinde değil, olay akışının
tüm aşamaları için o görüntüleme listesi nesnesinin tüm üst öğelerinde de dinleyicileri kontrol eder.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 259
Olayları işleme
Dinleyicisiz hata olayları
ActionScript 3.0'da hata işleme için birincil mekanizma, olaylar değil istisnalardır ancak dosya yükleme gibi
eşzamansız işlemler için istisna işleme çalışmaz. Böyle bir eşzamansız işlem sırasında bir hata oluşursa, Flash Player ve
AIR uygulaması bir hata olayı nesnesi gönderir. Hata olayı için bir dinleyici oluşturmazsanız, Flash Player ve AIR
uygulamasının hata ayıklayıcı sürümü, hata hakkındaki bilgileri içeren bir iletişim kutusu getirir. Örneğin, Flash
Player uygulamasının hata ayıklayıcı sürümü, uygulama geçersiz bir URL'den dosya yüklemeye çalıştığında hatayı
açıklayan şu iletişim kutusunu oluşturur:
Çoğu hata olayı, ErrorEvent sınıfını esas alır ve bu nedenle, Flash Player veya AIR uygulamasının görüntülediği hata
mesajını saklamak için kullanılan text adında bir özelliğe sahiptir. StatusEvent ve NetStatusEvent sınıfları iki
istisnadır. Bu sınıfların her ikisi de bir level özelliğine (StatusEvent.level ve NetStatusEvent.info.level)
sahiptir. level özelliğinin değeri "error" olduğunda, bu olay türleri hata olayları olarak değerlendirilir.
Bir hata olayı, SWF dosyasının çalışmasını durdurmaz. Yalnızca tarayıcı eklentilerinin ve bağımsız oynatıcıların hata
ayıklayıcı sürümünde bir iletişim kutusu olarak, geliştirme oynatıcısındaki çıktı panelinde bir mesaj olarak ve Adobe
Flex Builder 3'ün günlük dosyasında bir giriş olarak bildirilir. Flash Player veya AIR uygulamalarının yayınlama
sürümlerinde ise bu bildirilmez.
Örnek: Alarm Clock
Alarm Clock örneği, kullanıcının alarm çalacağı bir saat belirtmesine ve o anda bir mesajın görüntülenmesine olanak
sağlayan bir saatten oluşur. Alarm Clock örneği, “Tarih ve saatlerle çalışma” sayfa 129 bölümündeki SimpleClock
uygulamasına dayanır. Alarm Clock, arasında şunların yer aldığı, ActionScript 3.0'daki olaylarla çalışmanın bir çok
yönünü gösterir:
• Bir olayı dinleme ve yanıtlama
• Dinleyicilere bir olayı bildirme
• Özel bir olay türü oluşturma
Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.
Alarm Clock uygulama dosyaları, Samples/AlarmClock klasöründe bulunabilir. Uygulama şu dosyaları içerir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 260
Olayları işleme
Dosya
Açıklama
AlarmClockApp.mxml
Flash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası.
veya
AlarmClockApp.fla
com/example/programmingas3/clock/AlarmClock.as
SimpleClock sınıfını genişleterek çalar saat işlevi ekleyen bir sınıf.
com/example/programmingas3/clock/AlarmEvent.as
AlarmClock sınıfının alarm olayı için olay nesnesi görevi gören özel bir
olay sınıfı (flash.events.Event öğesinin alt sınıfı).
com/example/programmingas3/clock/AnalogClockFace.as
Saati esas alarak yuvarlak bir saat yüzü, akrep, yelkovan ve saniye
göstergesi çizer. (SimpleClock örneğinde açıklanmıştır.)
com/example/programmingas3/clock/SimpleClock.as
Basit zaman tutma işlevine sahip bir saat arabirimi bileşeni.
(SimpleClock örneğinde açıklanmıştır.)
Alarm Clock öğesine genel bakış
Bu örnekte, zamanı izleme ve saat yüzünü görüntüleme dahil olmak üzere, saatin birincil işlevi, “Örnek: Basit analog
saat” sayfa 134 bölümünde açıklanan SimpleClock uygulama kodunu yeniden kullanır. AlarmClock sınıfı, alarm
saatini ayarlama ve alarm "çaldığında" bildirim sağlama gibi çalar saat için gerekli işlevleri ekleyerek bu örnekteki
SimpleClock sınıfını genişletir.
Bir şey gerçekleştiğinde bildirim sağlamak, olayların asıl işidir. AlarmClock sınıfı, istenen eylemleri gerçekleştirmek
için diğer nesnelerin dinleyebildiği Alarm olayını kullanıma sunar. Ayrıca AlarmClock sınıfı, alarmını ne zaman
tetikleyeceğini belirlemek için Timer sınıfının bir örneğini kullanır. AlarmClock sınıfı gibi, Timer sınıfı da belirli bir
süre geçtiğinde diğer nesnelere (bu durumda bir AlarmClock örneği) bildirim göndermek için bir olay sağlar. Çoğu
ActionScript uygulamasında olduğu gibi, olaylar, Alarm Clock örnek uygulaması işlevinin önemli bir parçasını
oluşturur.
Alarmı tetikleme
Önceden de belirtildiği gibi, AlarmClock sınıfının gerçekten sağladığı tek işlev, alarmın ayarlanması ve tetiklenmesiyle
ilgilidir. Yerleşik Timer sınıfı (flash.utils.Timer), geliştiricinin belirtilen bir süre geçtikten sonra çalıştırılacak kod
tanımlaması için bir yol sağlar. AlarmClock sınıfı, alarmın ne zaman verileceğini belirlemek için bir Timer örneği
kullanır.
import flash.events.TimerEvent;
import flash.utils.Timer;
/**
* The Timer that will be used for the alarm.
*/
public var alarmTimer:Timer;
...
/**
* Instantiates a new AlarmClock of a given size.
*/
public override function initClock(faceSize:Number = 200):void
{
super.initClock(faceSize);
alarmTimer = new Timer(0, 1);
alarmTimer.addEventListener(TimerEvent.TIMER, onAlarm);
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 261
Olayları işleme
AlarmClock sınıfında tanımlanan Timer örneği, alarmTimer olarak adlandırılır. AlarmClock örneği için gerekli
kurulum işlemlerini gerçekleştiren initClock() yöntemi, alarmTimer değişkeniyle iki şey yapar. İlk olarak, Timer
örneğine 0 milisaniye beklemesini ve yalnızca bir defa zamanlayıcı olayını tetiklemesini bildiren parametrelerle
değişken başlatılır. alarmTimer başlatıldıktan sonra kod, değişkenin timer olayını dinlemek istediğini belirtmek için
değişkenin addEventListener() yöntemini çağırır. Timer örneği, belirtilen bir süre geçtikten sonra timer olayını
göndererek çalışır. AlarmClock sınıfının, kendi alarmını vermesi için timer olayının ne zaman gönderildiğini bilmesi
gerekir. AlarmClock kodu, addEventListener() öğesini çağırarak, alarmTimer ile bir dinleyici olarak kendisini
kaydeder. Bu iki parametre, AlarmClock öğesinin timer olayını (TimerEvent.TIMER sabitiyle belirtilen) dinlemek
istediğini ve olay gerçekleştiğinde, olaya yanıt olarak AlarmClock sınıfının onAlarm() yönteminin çağrılması
gerektiğini belirtir.
Gerçekten alarmı ayarlamak için, şu şekilde AlarmClock sınıfının setAlarm() yöntemi çağrılır:
/**
* Sets the time at which the alarm should go off.
* @param hour The hour portion of the alarm time.
* @param minutes The minutes portion of the alarm time.
* @param message The message to display when the alarm goes off.
* @return The time at which the alarm will go off.
*/
public function setAlarm(hour:Number = 0, minutes:Number = 0, message:String = "Alarm!"):Date
{
this.alarmMessage = message;
var now:Date = new Date();
// Create this time on today's date.
alarmTime = new Date(now.fullYear, now.month, now.date, hour, minutes);
// Determine if the specified time has already passed today.
if (alarmTime <= now)
{
alarmTime.setTime(alarmTime.time + MILLISECONDS_PER_DAY);
}
// Stop the alarm timer if it's currently set.
alarmTimer.reset();
// Calculate how many milliseconds should pass before the alarm should
// go off (the difference between the alarm time and now) and set that
// value as the delay for the alarm timer.
alarmTimer.delay = Math.max(1000, alarmTime.time - now.time);
alarmTimer.start();
return alarmTime;
}
Bu yöntem, alarm mesajını saklama ve alarmın verileceği gerçek anı temsil eden bir Date nesnesi (alarmTime)
oluşturma dahil olmak üzere, birçok şeyi gerçekleştirir. Şu an ele alınan konu içinde en önemlisi, yöntemin son birkaç
satırında alarmTimer değişkeninin zamanlayıcısının ayarlanması ve etkinleştirilmesidir. İlk olarak, reset() yöntemi
çağrılarak zamanlayıcı durdurulur ve önceden çalışıyor olma ihtimaline karşı sıfırlanır. Daha sonra, alarm verilmeden
önce kaç milisaniye geçmesi gerektiğini belirlemek için, alarmTime değişkeninin değerinden geçerli zaman (now
değişkeni tarafından temsil edilen) çıkarılır. Timer sınıfı timer olayını mutlak bir zamanda tetiklemez, bu nedenle de
bu, alarmTimer öğesinin delay özelliğine atanan göreceli zaman farkıdır. Son olarak, zamanlayıcıyı gerçekten
başlatmak için start() yöntemi çağrılır.
Belirtilen süre geçtikten sonra, alarmTimer öğesi timer olayını gönderir. AlarmClock sınıfı, onAlarm() yöntemini o
olay için bir dinleyici olarak kaydettiğinden, timer olayı gerçekleştiğinde onAlarm() çağrılır.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 262
Olayları işleme
/**
* Called when the timer event is dispatched.
*/
public function onAlarm(event:TimerEvent):void
{
trace("Alarm!");
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage);
this.dispatchEvent(alarm);
}
Olay dinleyicisi olarak kaydedilen bir yöntemin uygun imza (başka bir deyişle, yöntemin parametreler kümesi ve
döndürme türü) ile tanımlanması gerekir. Bir yöntemin, Timer sınıfının timer olayına yönelik bir dinleyici olması
için, Event sınıfının bir alt sınıfı olan TimerEvent (flash.events.TimerEvent) veri türüne sahip bir parametre
tanımlaması gerekir. Timer örneği, olay dinleyicilerini çağırdığında, olay nesnesi olarak bir TimerEvent örneği iletir.
Diğerlerine alarmı bildirme
Timer sınıfı gibi, AlarmClock sınıfı da, alarm verildiğinde diğer kodun bildirim almasına olanak veren bir olay sağlar.
Bir sınıfın ActionScript'te yerleşik olay işleme çerçevesini kullanması için, o sınıfın flash.events.IEventDispatcher
arabirimini uygulaması gerekir. Daha yaygın olarak bu, flash.events.EventDispatcher sınıfı genişletilerek (veya
EventDispatcher’ın alt sınıfları genişletilerek) yapılır, böylece IEventDispatcher öğesinin standart bir uygulaması
sağlanır. Önceden de açıklandığı gibi, AlarmClock sınıfı SimpleClock sınıfını genişletir ve bu da Sprite sınıfını ve
dolayısıyla da (bir miras zinciri yoluyla) EventDispatcher sınıfını genişletir. Tüm bunlar, AlarmClock sınıfının kendi
olaylarını sağlamak için yerleşik işlevlere önceden sahip olduğu anlamına gelir.
Diğer kod, AlarmClock öğesinin EventDispatcher öğesinden miras aldığı addEventListener() yöntemini çağırarak
AlarmClock sınıfının alarm olayının kendisine bildirilmesi için kaydolabilir. Bir AlarmClock örneği, alarm olayının
verildiğini diğer koda bildirmeye hazır olduğunda, yine EventDispatcher öğesinden miras alınan dispatchEvent()
yöntemini çağırarak bunu yapar.
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage);
this.dispatchEvent(alarm);
Bu kod satırları, AlarmClock sınıfının onAlarm() yönteminden (önceden tamamı gösterilen) alınır. AlarmClock
örneğinin dispatchEvent() yöntemi çağrılır, daha sonra bu yöntem, tüm kayıtlı dinleyicilere AlarmClock örneğinin
alarm olayının tetiklendiğini bildirir. dispatchEvent() öğesine iletilen parametre, dinleyici yöntemlerine iletilecek
olay nesnesidir. Bu durumda, bu örnek için özel olarak oluşturulmuş bir Event alt sınıfı olan AlarmEvent sınıfının bir
örneğidir.
Özel bir alarm olayı sağlama
Tüm olay dinleyicileri, tetiklenmekte olan belirli bir olay hakkında bilgilerin yer aldığı bir olay nesnesi parametresi alır.
Çoğu durumda olay nesnesi, Event sınıfının bir örneğidir. Ancak bazı durumlarda da, olay dinleyicilerine ek bilgi
sağlanması yararlı olacaktır. Daha önce de bu bölümde açıklandığı gibi, bunu gerçekleştirmenin yaygın bir yolu, yeni
bir sınıfın, Event sınıfının bir alt sınıfının tanımlanması ve olay nesnesi olarak bu sınıfın bir örneğinin kullanılmasıdır.
Bu örnekte, AlarmClock sınıfının alarm olayı gönderildiğinde bir AlarmEvent örneği olay nesnesi olarak kullanılır.
Burada gösterilen AlarmEvent sınıfı, alarm olayı hakkında, özellikle de alarm mesajı hakkında ek bilgiler sağlar:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 263
Olayları işleme
import flash.events.Event;
/**
* This custom Event class adds a message property to a basic Event.
*/
public class AlarmEvent extends Event
{
/**
* The name of the new AlarmEvent type.
*/
public static const ALARM:String = "alarm";
/**
* A text message that can be passed to an event handler
* with this event object.
*/
public var message:String;
/**
*Constructor.
*@param message The text to display when the alarm goes off.
*/
public function AlarmEvent(message:String = "ALARM!")
{
super(ALARM);
this.message = message;
}
...
}
Özel bir olay nesnesi sınıfı oluşturmanın en iyi yolu, önceki örnekte gösterildiği gibi, Event sınıfını genişleten bir
sınıfın tanımlanmasıdır. AlarmEvent sınıfı, miras alınan işlevleri tamamlamak için, olayla ilişkilendirilmiş alarm
mesajının metnini içeren bir message özelliğini tanımlar; message değeri, AlarmEvent yapıcısında bir parametre
olarak iletilir. AlarmEvent sınıfı ayrıca AlarmClock sınıfının addEventListener() yöntemi çağrıldığında belirli bir
olayı (alarm) ifade etmek için kullanılabilen ALARM sabitini de tanımlar.
Her Event alt sınıfının, özel işlevler eklemenin yanı sıra ActionScript olay işleme çerçevesinin parçası olarak miras
alınan clone() yöntemini geçersiz kılması da gerekir. Ayrıca Event alt sınıfları, toString() yöntemi çağrıldığında
döndürülen değere özel olayın özelliklerini dahil etmek için, miras alınan toString() yöntemini isteğe bağlı olarak
geçersiz kılabilir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 264
Olayları işleme
/**
* Creates and returns a copy of the current instance.
* @return A copy of the current instance.
*/
public override function clone():Event
{
return new AlarmEvent(message);
}
/**
* Returns a String containing all the properties of the current
* instance.
* @return A string representation of the current instance.
*/
public override function toString():String
{
return formatToString("AlarmEvent", "type", "bubbles", "cancelable", "eventPhase",
"message");
}
Geçersiz kılınan clone() yönteminin, tüm özel özellikleri geçerli örnekle eşleşecek şekilde ayarlanmış olarak özel
Event alt sınıfının yeni bir örneğini döndürmesi gerekir. Geçersiz kılınmış toString() yönteminde, özel türün adını
ve tüm özelliklerinin adlarını ve değerlerini içeren bir dize sağlamak için formatToString() yardımcı program
yöntemi (Event öğesinden miras alınan) kullanılır.
265
Bölüm 13: Görüntü programlama
Adobe® ActionScript® 3.0'da görüntü programlama, Adobe® Flash® Player veya Adobe® AIR™ uygulamasının Sahne
Alanı'nda görüntülenen öğelerle çalışmanıza olanak sağlar. Bu bölümde, ekrandaki öğelerle çalışmaya yönelik temel
kavramlar açıklanmaktadır. Görsel öğelerin programlama yoluyla organize edilmesi hakkında daha ayrıntılı bilgi
edineceksiniz. Ayrıca görüntüleme nesneleri için kendi özel sınıflarınızı oluşturma hakkında da bilgi edineceksiniz.
Görüntü programlama temelleri
Görüntü programlamaya giriş
ActionScript 3.0 ile yerleşik olan her uygulama, aşağıda gösterildiği gibi, görüntüleme listesi olarak bilinen
görüntülenen nesnelerin bir hiyerarşisine sahiptir. Görüntüleme listesi, uygulamadaki tüm görünür öğeleri içerir.
Sahne
Alanı
Stage
SWF dosyasının
ana sınıfının
örneği
Görüntüleme
Nesnesi
Görüntüleme
Nesnesi Konteyneri
Görüntüleme
Nesnesi Konteyneri
Görüntüleme
Nesnesi
Görüntüleme
Nesnesi Konteyneri
Görüntüleme
Nesnesi
Görüntüleme
Nesnesi Konteyneri
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 266
Görüntü programlama
Resimde gösterildiği gibi, görüntüleme öğeleri şu gruplardan bir veya birkaçına ayrılır:
• Sahne Alanı
Sahne Alanı, görüntüleme nesnelerinin temel konteyneridir. Her uygulama, ekrandaki tüm görüntüleme
nesnelerini içeren tek bir Stage nesnesine sahiptir. Sahne Alanı, üst düzey bir konteyner olup görüntüleme listesi
hiyerarşisinin en üstünde yer alır:
Her SWF dosyası, SWF dosyasının ana sınıfı olarak bilinen ilişkilendirilmiş bir ActionScript sınıfına sahiptir. SWF
dosyası Flash Player veya Adobe AIR'de açıldığında, Flash Player veya AIR bu sınıfa ilişkin yapıcı işlevini çağırır ve
oluşturulan örnek (her zaman bir görüntüleme nesnesi türüdür) Stage nesnesinin alt öğesi olarak eklenir. SWF
dosyasının ana sınıfı her zaman Sprite sınıfını genişletir (daha fazla bilgi için, bkz. “Görüntüleme listesi
yaklaşımının avantajları” sayfa 270).
Herhangi bir DisplayObject örneğinin stage özelliği üzerinden Sahne Alanı'na erişebilirsiniz. Daha fazla bilgi için,
bkz. “Sahne Alanı özelliklerini ayarlama” sayfa 278.
• Görüntüleme nesneleri
ActionScript 3.0'da, bir uygulamanın ekranında görüntülenen tüm öğeler, görüntüleme nesneleri türüdür.
flash.display paketi, birkaç başka sınıf tarafından genişletilen temel sınıf olan DisplayObject sınıfını içerir. Bu farklı
sınıflar, vektör şekilleri, film klipleri ve metin alanları gibi farklı türlerdeki görüntüleme nesnelerini temsil eder. Bu
sınıflara bir genel bakış için, bkz. “Görüntüleme listesi yaklaşımının avantajları” sayfa 270.
• Görüntüleme nesnesi konteynerleri
Görüntüleme nesnesi konteynerleri, kendi görsel temsillerine sahip olmanın yanı sıra, görüntüleme nesnesi
niteliğindeki alt nesneleri de içerebilen özel bir görüntüleme nesnesi türüdür.
DisplayObjectContainer sınıfı, DisplayObject sınıfının bir alt sınıfıdır. DisplayObjectContainer nesnesi, alt
öğelistesinde birden çok görüntüleme nesnesi içerebilir. Örneğin, aşağıdaki resimde, çeşitli görüntüleme nesnelerini
içeren ve Sprite olarak bilinen bir DisplayObjectContainer nesnesi türü gösterilmektedir:
A
B
C
D
A. SimpleButton nesnesi. Bu görüntüleme nesnesi türü, farklı "basılı olmama", "basılı" ve "üzerinde" durumlarına sahiptir. B. Bitmap
nesnesi. Bu durumda, Bitmap nesnesi bir Loader nesnesi yoluyla harici bir JPEG'den yüklenmiştir. C. Shape nesnesi. "Resim karesi",
ActionScript'te çizilen yuvarlak köşeli bir dikdörtgen içerir. Bu Shape nesnesine Gölge filtresi uygulanmıştır. D. TextField nesnesi.
Görüntüleme nesneleri ele alındığında, DisplayObjectContainer nesneleri ayrıca görüntüleme nesnesi konteyneri
veya yalnızca konteyner olarak bilinir. Daha önce de belirtildiği gibi, Sahne Alanı bir görüntüleme nesnesi
konteyneridir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 267
Görüntü programlama
Görünebilen tüm görüntüleme nesneleri DisplayObject sınıfından miras alsa da, her birinin türü DisplayObject
sınıfının belirli bir alt sınıfındandır. Örneğin, Shape sınıfı veya Video sınıfı için bir yapıcı işlevi vardır ancak
DisplayObject sınıfı için herhangi bir yapıcı işlevi yoktur.
Ortak görüntü programlama görevleri
ActionScript programlama işleminin çoğunu, görsel öğelerin oluşturulup işlenmesi oluşturduğundan, görüntü
programlamayla ilgili birçok görev vardır. Bu bölümde, aralarında aşağıdakilerin de yer aldığı, tüm görüntüleme
nesneleri için geçerli olan ortak görevler açıklanmaktadır:
• Görüntüleme listesi ve görüntüleme nesnesi konteynerleriyle çalışma
• Görüntüleme listesine görüntüleme nesneleri ekleme
• Görüntüleme listesinden nesneleri kaldırma
• Nesneleri görüntüleme konteynerleri arasında taşıma
• Nesneleri diğer nesnelerin önüne veya arkasına taşıma
• Sahne Alanı ile çalışma
• Kare hızını ayarlama
• Sahne Alanı ölçeklemeyi denetleme
• Tam ekran modunda çalışma
• Görüntüleme nesnesi olaylarını işleme
• Sürükleyip bırakma etkileşimi oluşturulması dahil olmak üzere, görüntüleme nesnelerini konumlandırma
• Görüntüleme nesnelerini yeniden boyutlandırma, ölçekleme ve döndürme
• Görüntüleme nesnelerine karışım modları, renk dönüştürmeleri ve saydamlık uygulama
• Görüntüleme nesnelerini maskeleme
• Görüntüleme nesnelerine animasyon uygulama
• Harici görüntüleme içeriği (örn. SWF dosyaları veya görüntüleri) yükleme
Bu kılavuzdaki ilerleyen bölümlerde, görüntüleme nesneleriyle çalışılmasına yönelik ek görevler açıklanmaktadır. Bu
görevler arasında hem herhangi bir görüntüleme nesnesi için geçerli olan görevler hem de belirli bir görüntüleme
nesnesi türüyle ilişkilendirilmiş görevler yer almaktadır:
• Görüntüleme nesnelerinde ActionScript ile vektör grafikleri çizme, bkz. “Çizim API'sini kullanma” sayfa 314
• Görüntüleme nesnelerine geometrik dönüştürmeler uygulama, bkz. “Geometriyle çalışma” sayfa 334
• Görüntüleme nesnelerine bulanıklaştırma, ışıma, gölge, vb. gibi grafiksel filtre efektleri uygulama, bkz.
“Görüntüleme nesnelerine filtre uygulama” sayfa 346
• MovieClip'e özgü özelliklerle çalışma, bkz. “Film klipleriyle çalışma” sayfa 399
• TextField nesneleriyle çalışma, bkz. “Metinle çalışma” sayfa 425
• Bitmap grafikleriyle çalışma, bkz. “Bitmaplerle çalışma” sayfa 476
• Video öğeleriyle çalışma, bkz. “Videoyla çalışma” sayfa 517
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 268
Görüntü programlama
Önemli kavramlar ve terimler
Aşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:
• Alfa: Bir renkteki saydamlık miktarını (daha doğrusu, opaklık miktarını) temsil eden renk değeri. Örneğin, %60 alfa
kanalı değerine sahip bir renk, tüm gücünün yalnızca %60'ını gösterir ve %40 saydamdır.
• Bitmap grafiği: Bilgisayarda, renkli piksellerin bir ızgarası (satır ve sütunları) olarak tanımlanan bir grafik.
Genellikle bitmap grafikleri dijital fotoğrafları ve benzeri görüntüleri içerir.
• Karışım modu: Örtüşen iki görüntünün içeriklerinin nasıl etkileşim kurması gerektiğine dair bir belirtim.
Genellikle, diğerinin üzerindeki bir opak görüntü, altındaki görüntünün görünmesini tamamen engeller; ancak
farklı karışım modları, en son elde edilen görüntü iki görüntünün birleşimi olacak şekilde görüntü renklerinin
farklı şekillerde karışım oluşturmasını sağlar.
• Görüntüleme listesi: Flash Player ve AIR uygulaması tarafından görünür ekran olarak oluşturulacak görüntüleme
nesnelerinin hiyerarşisi. Sahne Alanı, görüntüleme listesinin köküdür ve Sahne Alanı'na veya alt öğelerinden birine
eklenen tüm görüntüleme nesneleri, görüntüleme listesini oluşturur (nesne gerçekten oluşturulmasa da, örneğin,
Sahne Alanı sınırlarının dışında da olsa).
• Görüntüleme nesnesi: Flash Player veya AIR uygulamasında bir çeşit görsel içeriği temsil eden bir nesne.
Görüntüleme listesine yalnızca görüntüleme nesneleri dahil edilebilir ve tüm görüntüleme nesnesi sınıfları,
DisplayObject sınıfının alt sınıflarıdır.
• Görüntüleme nesnesi konteyneri: Kendi görsel temsillerinin yanı sıra (genellikle) alt görüntüleme nesnelerini de
içerebilen özel bir görüntüleme nesnesi türüdür.
• SWF dosyasının ana sınıfı: Bir SWF dosyasında en dıştaki görüntüleme nesnesinin davranışını tanımlayan sınıf. Bu,
kavramsal olarak, SWF dosyasının kendi sınıfıdır. Örneğin, Flash geliştirme aracında oluşturulan bir SWF, diğer
tüm zaman çizelgelerini içeren "ana zaman çizelgesine" sahiptir; SWF dosyasının ana sınıfı, ana zaman çizelgesinin
bir örnek olduğu sınıftır.
• Maskeleme: Görüntünün belirli bir bölümünü görüntülenmeyecek şekilde gizleme (veya tam tersi, görüntünün
yalnızca belirli bölümlerinin görüntülenmesine izin verme) tekniği. Maske görüntüsünün bazı bölümleri saydam
hale gelir, böylece alttaki içerik görünür. Bu terim, ressamların belirli bölgelere boya uygulanmasını önlemek için
kullandıkları maskeleme bandıyla ilişki kurularak oluşturulmuştur.
• Sahne Alanı: SWF'deki tüm görsel içeriğin tabanı veya arka planı olan görsel konteyner.
• Dönüştürme: Nesneyi döndürme, ölçeğini değiştirme, şeklini eğriltme veya deforme etme ya da rengini değiştirme
şeklinde bir grafiğin görsel özellikleri üzerinde yapılan düzenleme.
• Vektör grafiği: Bilgisayarda, belirli özelliklerle (örn. kalınlık, uzunluk, boyut, açı ve konum) çizilmiş çizgiler ve
şekiller olarak tanımlanan bir grafik.
Bölüm içi örneklerle çalışma
Bu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Bu bölüm, görsel içerik
oluşturulması ve işlenmesiyle ilgili olduğundan, bu bölümdeki tüm kod listeleri görsel nesneler oluşturur ve bunları
ekranda görüntüler; örnek test edilirken de, önceki bölümlerde olduğu gibi değişkenlerin değerlerini görüntülemek
yerine, sonuç Flash Player veya AIR uygulamasında görüntülenir. Bu bölümdeki kod listelerini test etmek için:
1 Flash geliştirme aracını kullanarak boş bir belge oluşturun
2 Zaman Çizelgesi'nde bir anahtar kare seçin.
3 Eylemler panelini açın ve kod listesini Komut Dosyası bölmesine kopyalayın.
4 Kontrol Et > Filmi Test Et komutu ile programı çalıştırın.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 269
Görüntü programlama
Kod sonuçlarının ekran görüntülendiğini göreceksiniz ve herhangi bir trace() işlev çağrısı da Çıktı panelinde
görüntülenecek.
Örnek kod listelerinin test edilmesi teknikleri, “Bölüm içi örnek kod listelerini test etme” sayfa 34 bölümünde daha
ayrıntılı şekilde açıklanmıştır.
Çekirdek görüntüleme sınıfları
ActionScript 3.0'da flash.display paketi, Flash Player veya AIR uygulamasında görüntülenebilen görsel nesnelerin
sınıflarını içerir. Aşağıdaki resimde, bu çekirdek görüntüleme nesnesi sınıflarının alt sınıf ilişkileri gösterilmektedir.
DisplayObject
AVM1Movie
Bitmap
InteractiveObject
DisplayObjectContainer SimpleButton
Loader
Sprite
MorphShape
Shape
StaticText
Video
TextField
Stage
MovieClip
Resimde, görüntüleme nesnesi sınıflarının sınıf mirası gösterilmektedir. Özellikle StaticText, TextField ve Video
olmak üzere bu sınıflardan bazılarının flash.display paketinde bulunmadığı halde DisplayObject sınıfından miras
aldığını unutmayın.
DisplayObject sınıfını genişleten tüm sınıflar, yöntem ve özelliklerini miras alır. Daha fazla bilgi için, bkz.
“DisplayObject sınıfının özellikleri ve yöntemleri” sayfa 273.
flash.display paketinde bulunan şu sınıfların nesnelerini başlatabilirsiniz:
• Bitmap—Harici dosyalardan yüklenmiş veya ActionScript yoluyla oluşturulmuş bitmap nesnelerini tanımlamak
için Bitmap sınıfını kullanırsınız. Loader sınıfı yoluyla, harici dosyalardan bitmapleri yükleyebilirsiniz. GIF, JPG
veya PNG dosyalarını yükleyebilirsiniz. Ayrıca özel veriler içeren bir BitmapData nesnesi oluşturabilir ve sonra bu
verileri kullanan bir Bitmap nesnesi oluşturabilirsiniz. İster yüklenmiş isterse ActionScript'te oluşturulmuş olsun,
bitmapleri değiştirmek için BitmapData sınıfının yöntemlerini kullanabilirsiniz. Daha fazla bilgi için, bkz.
“Görüntüleme nesnelerini yükleme” sayfa 305 ve “Bitmaplerle çalışma” sayfa 476.
• Loader—Harici varlıkları (SWF dosyası veya grafik) yüklemek için Loader sınıfını kullanırsınız. Daha fazla bilgi
için, bkz. “Görüntüleme içeriğini dinamik olarak yükleme” sayfa 305.
• Shape—Dikdörtgen, çizgi, daire, vb. gibi vektör grafikleri oluşturmak için Shape sınıfını kullanırsınız. Daha fazla
bilgi için, bkz. “Çizim API'sini kullanma” sayfa 314.
• SimpleButton—SimpleButton nesnesi, Flash geliştirme aracında oluşturulmuş bir düğme sembolünün
ActionScript temsilidir. SimpleButton örneği, dört düğme durumuna sahiptir: basılı olmama, basılı, üzerinde ve
vuruş testi (fare ve klavye olaylarına yanıt veren alan).
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 270
Görüntü programlama
• Sprite—Sprite nesnesi, kendi grafiklerini içerebildiği gibi alt görüntüleme nesnelerini de içerebilir. (Sprite sınıfı,
DisplayObjectContainer sınıfını genişletir.) Daha fazla bilgi için, bkz. “Görüntüleme nesnesi konteynerleriyle
çalışma” sayfa 273 ve “Çizim API'sini kullanma” sayfa 314.
• MovieClip—MovieClip nesnesi, Flash geliştirme aracında oluşturulmuş bir film klibi sembolünün ActionScript
biçimidir. MovieClip pratikte Sprite nesnesine benzer, tek farkı bir zaman çizelgesine de sahip olmasıdır. Daha fazla
bilgi için, bkz. “Film klipleriyle çalışma” sayfa 399.
flash.display paketinde bulunmayan şu sınıflar, DisplayObject sınıfının alt sınıflarıdır:
• flash.text paketine dahil edilen TextField sınıfı, metin görüntüsü ve girdisi için bir görüntüleme nesnesidir. Daha
fazla bilgi için, bkz. “Metinle çalışma” sayfa 425.
• flash.media paketine dahil edilen Video sınıfı, video dosyalarının görüntülenmesi için kullanılan görüntüleme
nesnesidir. Daha fazla bilgi için, bkz. “Videoyla çalışma” sayfa 517.
flash.display paketindeki şu sınıflar, DisplayObject sınıfını genişletir ancak bunların örneklerini oluşturamazsınız.
Daha çok bunlar diğer görüntüleme nesnelerinin üst sınıfları görevini görerek ortak işlevselliği tek bir sınıfta
birleştirir.
• AVM1Movie—AVM1Movie sınıfı, ActionScript 1.0 ve 2.0'da geliştirilen yüklenmiş SWF dosyalarını temsil etmek
için kullanılır.
• DisplayObjectContainer—Loader, Stage, Sprite ve MovieClip sınıflarının her biri, DisplayObjectContainer sınıfını
genişletir. Daha fazla bilgi için, bkz. “Görüntüleme nesnesi konteynerleriyle çalışma” sayfa 273.
• InteractiveObject—InteractiveObject, fare ve klavye ile etkileşim kurmak için kullanılan tüm nesnelerin temel
sınıfıdır. SimpleButton, TextField, Loader, Sprite, Stage ve MovieClip nesnelerinin tümü, InteractiveObject
sınıfının alt sınıflarıdır. Fare ve klavye etkileşimi oluşturma hakkında daha fazla bilgi için, bkz. “Kullanıcı girdisini
yakalama” sayfa 588.
• MorphShape—Flash geliştirme aracında bir şekil arası oluşturduğunuzda bu nesneler oluşturulur. ActionScript
kullanarak bunları başlatamazsınız ancak görüntüleme listesinden bunlara erişilebilir.
• Stage—Stage sınıfı DisplayObjectContainer sınıfını genişletir. Bir uygulama için yalnızca bir Stage örneği vardır ve
bu, görüntüleme listesi hiyerarşisinin en üstünde bulunur. Sahne Alanı'na erişmek için, herhangi bir DisplayObject
örneğinin stage özelliğini kullanın. Daha fazla bilgi için, bkz. “Sahne Alanı özelliklerini ayarlama” sayfa 278.
Ayrıca flash.text paketindeki StaticText sınıfı, DisplayObject sınıfını genişletir, ancak kodda bunun bir örneğini
oluşturamazsınız. Statik metin alanları yalnızca Flash'ta oluşturulur.
Görüntüleme listesi yaklaşımının avantajları
ActionScript 3.0'da, görüntüleme nesnelerinin farklı türleri için ayrı sınıflar vardır. ActionScript 1.0 ve 2.0'da, aynı
nesne türlerinin çoğu MovieClip adındaki tek bir sınıfa dahil edilmiştir.
Sınıfların ve görüntüleme listelerinin hiyerarşik yapısının bu şekilde bireyselleştirilmesi, şu avantajları sağlar:
• Daha verimli oluşturma ve düşük bellek tüketimi
• Gelişmiş derinlik yönetimi
• Görüntüleme listesinin tam çapraz geçişi
• Liste dışı görüntüleme nesneleri
• Görüntüleme nesnelerinin daha kolay şekilde alt sınıflara ayrılması
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 271
Görüntü programlama
Daha verimli oluşturma ve daha küçük dosya boyutları
ActionScript 1.0 ve 2.0'da, yalnızca bir MovieClip nesnesinde şekil çizebilirsiniz. ActionScript 3.0'da, şekil
çizebileceğiniz daha basit görüntü nesnesi sınıfları vardır. Bu ActionScript 3.0 görüntüleme nesnesi sınıfları,
MovieClip nesnesinin içerdiği tüm yöntem ve özellik kümesini içermediğinden, bellek ve işlemci kaynaklarını daha az
tüketir.
Örneğin, her MovieClip nesnesi, film klibinin zaman çizelgesine yönelik özellikleri içerirken Shape nesnesi bu
özellikleri içermez. Zaman çizelgesinin yönetilmesine yönelik özellikler çok fazla bellek ve işlemci kaynağı tüketebilir.
ActionScript 3.0'da, Shape nesnesinin kullanılması daha iyi performans elde edilmesini sağlar. Shape nesnesi, daha
karmaşık olan MovieClip nesnesinden daha az yüke sahiptir. Flash Player ve AIR uygulamalarının kullanılmayan
MovieClip özelliklerini yönetmesi gerekmez, bu da hızı artırıp nesnenin kullandığı bellek alanını azaltır.
Gelişmiş derinlik yönetimi
ActionScript 1.0 ve 2.0'da, derinlik doğrusal bir derinlik yönetimi şeması ve getNextHighestDepth() gibi
yöntemlerle yönetiliyordu.
ActionScript 3.0, görüntüleme nesnelerinin derinliğinin yönetilmesi için daha kullanışlı yöntem ve özelliklere sahip
olan DisplayObjectContainer sınıfını içerir.
ActionScript 3.0'da, bir görüntüleme nesnesini, DisplayObjectContainer örneğinin alt öğe listesinde yeni bir konuma
taşıdığınızda, görüntüleme nesnesi konteynerindeki diğer alt öğeler otomatik olarak yeniden konumlandırılır ve
bunlara görüntüleme nesnesi konteynerinde uygun alt dizin konumları atanır.
Ayrıca, ActionScript 3.0'da herhangi bir görüntüleme nesnesi konteynerinin alt nesnelerinin tümünün keşfedilmesi de
her zaman mümkündür. Her DisplayObjectContainer örneği, görüntüleme nesnesi konteynerindeki alt öğelerin
sayısını listeleyen bir numChildren özelliğine sahiptir. Ve görüntüleme nesnesi konteynerinin alt öğe listesi her zaman
dizinlenmiş bir liste olduğundan, 0 dizin konumundan son dizin konumuna (numChildren - 1) kadar listedeki her
nesneyi inceleyebilirsiniz. ActionScript 1.0 ve 2.0'da, MovieClip nesnesinin yöntemleri ve özellikleriyle bu mümkün
değildi.
ActionScript 3.0'da, görüntüleme listesinde sırayla geçiş yapabilirsiniz; görüntüleme nesnesi konteynerinin alt öğe
listesinin dizin sayılarında herhangi bir boşluk yoktur. Görüntüleme listesinde geçiş yapılması ve nesnelerin
derinliğinin yönetilmesi, ActionScript 1.0 ve 2.0'a göre daha kolaydır. ActionScript 1.0 ve 2.0'da, bir film klibi derinlik
sırasında kesintili boşlukların bulunduğu nesneleri içerebiliyordu, bu da nesne listesinde geçiş yapılmasını
güçleştirebiliyordu. ActionScript 3.0'da, görüntüleme nesnesi konteynerinin her alt öğe listesi dahili olarak bir dizi
şeklinde önbelleğe alınır ve bu da çok hızlı arama (dizine göre) yapılmasını sağlar. Görüntüleme nesnesi konteynerinin
tüm alt öğelerinin döngüye alınması da çok hızlıdır.
ActionScript 3.0'da, DisplayObjectContainer sınıfının getChildByName() yöntemini kullanarak görüntüleme
nesnesi konteynerindeki alt öğelere erişebilirsiniz.
Görüntüleme listesinin tam çapraz geçişi
ActionScript 1.0 ve 2.0'da, Flash geliştirme aracında çizilmiş vektör şekilleri gibi bazı nesnelere erişemezdiniz.
ActionScript 3.0'da, ActionScript kullanılarak oluşturulmuş olan nesneler ve Flash geliştirme aracında oluşturulmuş
tüm görüntüleme nesneleri dahil olmak üzere, görüntüleme nesnesindeki tüm nesnelere erişebilirsiniz. Ayrıntılar için,
bkz. “Görüntüleme listesinde geçiş yapma” sayfa 277.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 272
Görüntü programlama
Liste dışı görüntüleme nesneleri
ActionScript 3.0'da, görünebilir görüntüleme listesinde olmayan görüntüleme nesneleri oluşturabilirsiniz. Bunlar liste
dışı görüntüleme nesneleri olarak bilinir. Yalnızca önceden görüntüleme listesine eklenmiş bir
DisplayObjectContainer örneğinin addChild() veya addChildAt() yöntemini çağırdığınızda görüntüleme nesnesi
görünebilir görüntüleme listesine eklenir.
Birden çok görüntüleme nesnesinin bulunduğu birden çok görüntüleme nesnesi konteynerini içeren görüntüleme
nesneleri gibi karmaşık görüntüleme nesnelerini birleştirmek için, liste dışı görüntüleme nesnelerini kullanabilirsiniz.
Görüntüleme nesnelerini liste dışında tutarak, bu görüntüleme nesnelerini oluşturmaya yönelik işleme zamanını
kullanmadan karmaşık nesneleri birleştirebilirsiniz. Daha sonra gerektiğinde liste dışı görüntüleme nesnesini
görüntüleme nesnesine ekleyebilirsiniz. Ayrıca, bir görüntüleme nesnesi konteynerinin alt öğesini görüntüleme
listesinin içine veya dışına ya da görüntüleme listesindeki istediğiniz herhangi bir konuma taşıyabilirsiniz.
Görüntüleme nesnelerinin daha kolay şekilde alt sınıflara ayrılması
ActionScript 1.0 ve 2.0'da, temel şekiller oluşturmak veya bitmapleri görüntülemek için sık sık bir SWF dosyasına yeni
MovieClip nesneleri eklemeniz gerekir. ActionScript 3.0'da, DisplayObject sınıfı, Shape ve Bitmap de dahil olmak
üzere birçok yerleşik alt sınıfı içerir. ActionScript 3.0'daki sınıflar belirli nesne türleri için daha özelleştirilmiş
olduğundan, yerleşik sınıfların temel alt sınıflarının oluşturulması daha kolaydır.
Örneğin, ActionScript 2.0'da bir daire çizmek için, özel sınıfın bir nesnesi başlatıldığında MovieClip sınıfını genişleten
bir CustomCircle sınıfı oluşturabilirdiniz. Ancak bu sınıf, MovieClip sınıfındaki, söz konusu sınıf için geçerli olmayan
birçok özellik ve yöntemleri de (örn. totalFrames) içerirdi. ActionScript 3.0'da ise, Shape nesnesini genişleten ve bu
nedenle MovieClip sınıfında bulunan ilgisiz özellik ve yöntemleri içeremeyen bir CustomCircle sınıfını
oluşturabilirsiniz. Aşağıdaki kod, bir CustomCircle sınıfı örneğini gösterir:
import flash.display.*;
public class CustomCircle extends Shape
{
var xPos:Number;
var yPos:Number;
var radius:Number;
var color:uint;
public function CustomCircle(xInput:Number,
yInput:Number,
rInput:Number,
colorInput:uint)
{
xPos = xInput;
yPos = yInput;
radius = rInput;
color = colorInput;
this.graphics.beginFill(color);
this.graphics.drawCircle(xPos, yPos, radius);
}
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 273
Görüntü programlama
Görüntüleme nesneleriyle çalışma
Sahne Alanı, görüntüleme nesneleri, görüntüleme nesnesi konteynerleri ve görüntüleme listesi ile ilgili temel
kavramları anladığınıza göre, bu bölümde, ActionScript 3.0'da görüntüleme nesneleriyle çalışma hakkında daha
ayrıntılı bilgiler sağlanmıştır.
DisplayObject sınıfının özellikleri ve yöntemleri
Tüm görüntüleme nesneleri, DisplayObject sınıfının alt sınıflarıdır ve bu nedenle DisplayObject sınıfının özelliklerini
ve yöntemlerini miras alır. Miras alınan özellikler, tüm görüntüleme nesneleri için geçerli olan temel özelliklerdir.
Örneğin, her görüntüleme nesnesi, görüntüleme nesnesi konteynerinde nesnenin konumunu belirten bir x özelliğine
ve bir y özelliğine sahiptir.
DisplayObject sınıf yapıcısını kullanarak bir DisplayObject örneği oluşturamazsınız. new operatörüyle bir nesneyi
başlatmak için, Sprite gibi başka türde bir nesne (DisplayObject sınıfının alt sınıf olan bir nesne) oluşturmanız gerekir.
Ayrıca, özel bir görüntüleme nesnesi sınıfı oluşturmak isterseniz, görüntüleme nesnesi alt sınıflarından birinin,
kullanılabilir bir yapıcı işlevine sahip bir alt sınıfını (örn. Shape sınıfı veya Sprite sınıfı) oluşturmanız gerekir. Daha
fazla bilgi için, bkz. DisplayObject sınıfı açıklaması, ActionScript 3.0 Dil ve Bileşenler Başvurusu.
Görüntüleme listesine görüntüleme nesneleri ekleme
Görüntüleme nesnesi örneğini, görüntüleme listesindeki bir görüntüleme nesnesi konteynerine eklemezseniz, bir
görüntüleme nesnesini başlattığınızda söz konusu nesne ekranda (Sahne Alanı'nda) görüntülenmez. Örneğin,
aşağıdaki kodda, kodun son satırını çıkarırsanız, myText TextField nesnesi görünebilir durumda olmaz. Kodun son
satırında, this anahtar sözcüğünün önceden görüntüleme listesine eklenmiş bir görüntüleme nesnesi konteynerini
ifade etmesi gerekir.
import flash.display.*;
import flash.text.TextField;
var myText:TextField = new TextField();
myText.text = "Buenos dias.";
this.addChild(myText);
Sahne Alanı'na herhangi bir görsel öğe eklediğinizde, söz konusu öğe, Stage nesnesinin bir alt öğesi olur. Bir
uygulamada yüklenen birinci SWF dosyası (örneğin, bir HTML sayfasına gömdüğünüz dosya) otomatik olarak Sahne
Alanı'nın alt öğesi olarak eklenir. Bu, Sprite sınıfını genişleten herhangi türde bir nesne olabilir.
ActionScript kullanmadan (örneğin, Adobe Flex Builder 3'e MXML etiketi ekleyerek veya Flash'ta Sahne Alanı'na bir
öğe yerleştirerek) oluşturduğunuz tüm görüntüleme nesneleri, görüntüleme listesine eklenir. Bu görüntüleme
nesnelerini ActionScript yoluyla eklemeseniz de, bu nesnelere ActionScript üzerinden erişebilirsiniz. Örneğin,
aşağıdaki kod, geliştirme aracında (ActionScript üzerinden değil) eklenmiş button1 adında bir nesnenin genişliğini
ayarlar:
button1.width = 200;
Görüntüleme nesnesi konteynerleriyle çalışma
Bir DisplayObjectContainer nesnesi görüntüleme listesinden silinirse veya bir şekilde taşınır ya da dönüştürülürse,
DisplayObjectContainer öğesindeki görüntüleme nesnelerinin her biri de silinir, taşınır veya dönüştürülür.
Görüntüleme nesnesi konteyneri de bir tür görüntüleme nesnesidir—başka bir görüntüleme nesnesi konteynerine
eklenebilir. Örneğin, aşağıdaki görüntü, bir anahat şeklinin ve başka dört tane görüntüleme nesnesi konteynerinin
(PictureFrame türünde) yer aldığı bir görüntüleme nesnesi konteynerini (pictureScreen) göstermektedir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 274
Görüntü programlama
A
B
A. pictureScreen görüntüleme nesnesi konteynerinin kenarlığını tanımlayan bir şekil B. pictureScreen nesnesinin alt öğeleri olan dört
görüntüleme nesnesi konteyneri
Bir görüntüleme nesnesinin görüntüleme listesinde görüntülenmesi için, söz konusu görüntüleme nesnesini,
görüntüleme listesindeki görüntüleme nesnesi konteynerine eklemeniz gerekir. Konteyner nesnesinin addChild()
yöntemini veya addChildAt() yöntemini kullanarak bunu yaparsınız. Örneğin, aşağıdaki kodun son satırı olmadan
myTextField nesnesi görüntülenmez:
var myTextField:TextField = new TextField();
myTextField.text = "hello";
this.root.addChild(myTextField);
Bu kod örneğinde, this.root öğesi, kodu içeren MovieClip görüntüleme nesnesi konteynerini işaret eder. Gerçek
kodunuzda farklı bir konteyner belirtebilirsiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 275
Görüntü programlama
Alt öğeyi, görüntüleme nesnesi konteynerinin alt öğe listesinde belirli bir konuma eklemek için addChildAt()
yöntemini kullanın. Alt öğe listesindeki sıfır tabanlı dizin konumları, görüntüleme nesnelerinin katmanlamasına
(önden arkaya sıralama) göredir. Örneğin, şu üç görüntüleme nesnesini göz önünde bulundurun. Her nesne, Ball
adında özel bir sınıftan oluşturulmuştur.
Bu görüntüleme nesnelerinin katmanlaması, addChildAt() yöntemi kullanılarak ayarlanabilir. Örneğin, şu kodu göz
önünde bulundurun:
ball_A = new Ball(0xFFCC00, "a");
ball_A.name = "ball_A";
ball_A.x = 20;
ball_A.y = 20;
container.addChild(ball_A);
ball_B = new Ball(0xFFCC00, "b");
ball_B.name = "ball_B";
ball_B.x = 70;
ball_B.y = 20;
container.addChild(ball_B);
ball_C = new Ball(0xFFCC00, "c");
ball_C.name = "ball_C";
ball_C.x = 40;
ball_C.y = 60;
container.addChildAt(ball_C, 1);
Bu kod çalıştırıldıktan sonra, görüntüleme nesneleri container DisplayObjectContainer nesnesine şu şekilde
konumlandırılır. Nesnelerin katmanlamasına dikkat edin.
Bir nesneyi görüntüleme listesinin en üstüne yeniden konumlandırmak için söz konusu nesneyi listeye yeniden
eklemeniz yeterli olacaktır. Örneğin, bir önceki koddan sonra, ball_A öğesini yığının en üst kısmına taşımak için bu
kod satırını kullanın:
container.addChild(ball_A);
Bu kod, ball_A öğesini container öğesinin görüntüleme listesindeki konumundan etkili şekilde kaldırır ve listenin
en üst kısmına yeniden ekler, böylece yığının en üst kısmına taşınmış olur.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 276
Görüntü programlama
Görüntüleme nesnelerinin katman sırasını doğrulamak için getChildAt() yöntemini kullanabilirsiniz.
getChildAt() yöntemi, kendisine ilettiğiniz dizin sayısını esas alarak bir konteynerin alt nesnelerini döndürür.
Örneğin, aşağıdaki kod, container DisplayObjectContainer nesnesinin alt öğe listesindeki farklı konumlarda
bulunan görüntüleme nesnelerinin adlarını gösterir:
trace(container.getChildAt(0).name); // ball_A
trace(container.getChildAt(1).name); // ball_C
trace(container.getChildAt(2).name); // ball_B
Üst konteynerin alt öğe listesinden bir görüntüleme nesnesini kaldırırsanız, listedeki yüksek konumda bulunan
öğelerin her biri alt dizinde bir konum aşağı taşınır. Örneğin, önceki kodla devam ederek, aşağıdaki kod, alt öğe
listesinde daha düşük düzeyde bulunan bir görüntüleme nesnesi kaldırıldığında container DisplayObjectContainer
öğesinde konum 2'de bulunan görüntüleme nesnesinin nasıl konum 1'e hareket ettiğini gösterir:
container.removeChild(ball_C);
trace(container.getChildAt(0).name); // ball_A
trace(container.getChildAt(1).name); // ball_B
removeChild() ve removeChildAt() yöntemleri, görüntüleme nesnesi örneğinin tamamını silmez. Yalnızca
konteynerin alt öğe listesinden kaldırır. Halen başka bir değişken tarafından örneğe başvurulabilir. (Bir nesneyi
tamamen kaldırmak için delete operatörünü kullanın.)
Görüntüleme nesnesi yalnızca bir üst konteynere sahip olduğundan, görüntüleme nesnesi örneğini yalnızca bir
görüntüleme nesnesi konteynerine ekleyebilirsiniz. Örneğin, aşağıdaki kod, tf1 görüntüleme nesnesinin yalnızca bir
konteynerde (bu durumda, DisplayObjectContainer sınıfını genişleten bir Sprite öğesi) bulunabildiğini gösterir:
tf1:TextField = new TextField();
tf2:TextField = new TextField();
tf1.name = "text 1";
tf2.name = "text 2";
container1:Sprite = new Sprite();
container2:Sprite = new Sprite();
container1.addChild(tf1);
container1.addChild(tf2);
container2.addChild(tf1);
trace(container1.numChildren); // 1
trace(container1.getChildAt(0).name); // text 2
trace(container2.numChildren); // 1
trace(container2.getChildAt(0).name); // text 1
Bir görüntüleme nesnesi konteynerinde bulunan görüntüleme nesnesini başka bir görüntüleme nesnesi konteynerine
eklerseniz, söz konusu görüntüleme nesnesi birinci görüntüleme nesnesi konteynerinin alt öğe listesinden kaldırılır.
DisplayObjectContainer sınıfı, yukarıda açıklanan yöntemlere ek olarak, aralarında aşağıdakilerin de yer aldığı alt
görüntüleme nesneleriyle çalışılmasına yönelik birçok yöntemi tanımlar:
•
contains(): Görüntüleme nesnesinin bir DisplayObjectContainer öğesinin alt öğesi olup olmadığını belirler.
•
getChildByName(): Ada göre bir görüntüleme nesnesini alır.
•
getChildIndex(): Görüntüleme nesnesinin dizin konumunu döndürür.
•
setChildIndex(): Alt görüntüleme nesnesinin konumunu değiştirir.
•
swapChildren(): İki görüntüleme nesnesinin önden arkaya sırasını değiştirir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 277
Görüntü programlama
•
swapChildrenAt(): Dizin değerleriyle belirtildiği şekilde, iki görüntüleme nesnesinin önden arkaya sırasını
değiştirir.
Daha fazla bilgi için, ActionScript 3.0 Dil ve Bileşenler Başvurusu'nda ilgili girişlere bakın.
Görüntüleme listesi dışında olan (Sahne Alanı'nın alt öğesi olan bir görüntüleme nesnesi konteynerinde bulunmayan)
bir görüntüleme nesnesinin liste dışı görüntüleme nesnesi olarak bilindiğini unutmayın.
Görüntüleme listesinde geçiş yapma
Gördüğünüz gibi, görüntüleme listesi bir ağaç yapısındadır. Ağacın en üst kısmında Sahne Alanı bulunur ve birden
çok görüntüleme nesnesi içerebilir. Kendileri de görüntüleme nesnesi konteyneri olan bu görüntüleme nesneleri,
başka görüntüleme nesnelerini veya görüntüleme nesnesi konteynerlerini içerebilir.
Sahne
Alanı
Stage
SWF dosyasının
ana sınıfının
örneği
Görüntüleme
Nesnesi
Görüntüleme
Nesnesi Konteyneri
Görüntüleme
Nesnesi Konteyneri
Görüntüleme
Nesnesi
Görüntüleme
Nesnesi Konteyneri
Görüntüleme
Nesnesi
Görüntüleme
Nesnesi Konteyneri
DisplayObjectContainer sınıfı, görüntüleme nesnesi konteynerlerinin alt öğe listeleri yoluyla görüntüleme listesinde
geçiş yapılmasına yönelik özellik ve yöntemleri içerir. Örneğin, container nesnesine (bu Sprite olur ve Sprite sınıfı
DisplayObjectContainer sınıfını genişletir) title ve pict olmak üzere iki görüntüleme nesnesi ekleyen şu kodu göz
önünde bulundurun:
var container:Sprite = new Sprite();
var title:TextField = new TextField();
title.text = "Hello";
var pict:Loader = new Loader();
var url:URLRequest = new URLRequest("banana.jpg");
pict.load(url);
pict.name = "banana loader";
container.addChild(title);
container.addChild(pict);
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 278
Görüntü programlama
getChildAt() yöntemi, belirli bir dizin konumunda görüntüleme listesinin alt öğesini döndürür:
trace(container.getChildAt(0) is TextField); // true
Ayrıca ada göre de alt nesnelere erişebilirsiniz. Her görüntüleme nesnesi bir ad özelliğine sahiptir ve ad özelliği
atamazsanız, Flash Player veya AIR uygulaması "instance1" gibi varsayılan bir değer atar. Örneğin, aşağıdaki kod,
"banana loader" adına sahip bir alt görüntüleme nesnesine erişmek için getChildByName() yönteminin nasıl
kullanıldığını gösterir:
trace(container.getChildByName("banana loader") is Loader); // true
getChildByName() yönteminin kullanılması, getChildAt() yöntemine göre daha düşük performans elde
edilmesine neden olabilir.
Görüntüleme nesnesi konteyneri, görüntüleme listesinde alt nesneler olarak başka görüntüleme nesnesi
konteynerlerini içerebildiğinden, ağaç olarak uygulamanın tam görüntüleme listesinde geçiş yapabilirsiniz. Örneğin,
daha önce gösterilen kod alıntısında, pict Loader nesnesi için yükleme işlemi tamamlandıktan sonra, pict nesnesine
yüklenmiş tek bir alt görüntüleme nesnesi olur ve bu da bitmaptir. Bu bitmap görüntüleme nesnesine erişmek için,
pict.getChildAt(0) yazabilirsiniz. Ayrıca şunu da yazabilirsiniz: container.getChildAt(0).getChildAt(0)
(container.getChildAt(0) == pict olduğundan).
Aşağıdaki işlev, görüntüleme nesnesi konteynerinden görüntüleme listesinin girintili bir trace() çıktısını sağlar:
function traceDisplayList(container:DisplayObjectContainer,indentString:String = ""):void
{
var child:DisplayObject;
for (var i:uint=0; i < container.numChildren; i++)
{
child = container.getChildAt(i);
trace(indentString, child, child.name);
if (container.getChildAt(i) is DisplayObjectContainer)
{
traceDisplayList(DisplayObjectContainer(child), indentString + "")
}
}
}
Sahne Alanı özelliklerini ayarlama
Stage sınıfı, DisplayObject sınıfının çoğu özellik ve yöntemini geçersiz kılar. Bu geçersiz kılınmış özellik veya
yöntemlerden birini çağırırsanız, Flash Player ve AIR bir istisna atar. Örneğin, uygulama için ana konteyner olarak
konumu sabitlenmiş olduğundan, Sahne Alanı x veya y özelliğine sahip değildir. x ve y özellikleri, bir görüntüleme
nesnesinin, konteynerine göre konumunu ifade eder ve Sahne Alanı başka bir görüntüleme nesnesi konteynerinde
bulunmadığından bu özellikler geçerli değildir.
Not: Stage sınıfının bazı özellik ve yöntemleri, yalnızca yüklenen birinci SWF dosyası olarak aynı güvenlik sanal
alanında bulunan görüntüleme nesneleri için kullanılabilir durumdadır. Ayrıntılar için, bkz. “Sahne Alanı güvenliği”
sayfa 708.
Oynatma kare hızını denetleme
Bir uygulamaya yüklenen tüm SWF dosyalarının kare hızını ayarlamak için, Stage sınıfının framerate özelliği
kullanılır. Daha fazla bilgi için, bkz. ActionScript 3.0 Dil ve Bileşenler Başvurusu.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 279
Görüntü programlama
Sahne Alanı ölçeklemeyi denetleme
Ekranın Flash Player veya AIR uygulamasını temsil edilen kısmı yeniden boyutlandırıldığında, Flash Player ya da AIR
uygulaması bu durumu telafi etmek için otomatik olarak Sahne Alanı içeriklerini ayarlar. Stage sınıfının scaleMode
özelliği, Sahne Alanı içeriklerinin nasıl ayarlanacağını belirler. Bu özellik, flash.display.StageScaleMode sınıfında
sabitler olarak tanımlanan dört farklı değere ayarlanabilir.
scaleMode değerlerinin üçü (StageScaleMode.EXACT_FIT, StageScaleMode.SHOW_ALL ve
StageScaleMode.NO_BORDER) için, Flash Player ve AIR uygulaması, Sahne Alanı'nın içeriklerini sınırları içine
sığması için ölçekler. Üç seçenek, ölçeklemenin gerçekleştirilme şekliyle birbirinden ayrılır:
•
StageScaleMode.EXACT_FIT , SWF'yi orantılı şekilde ölçekler.
•
StageScaleMode.SHOW_ALL , standart televizyonda geniş ekran film izlenirken görüntülenen siyah çubuklar gibi
bir kenarlığın görüntülenip görüntülenmeyeceğini belirler.
•
StageScaleMode.NO_BORDER , içeriğin kısmen kırpılıp kırpılamayacağını belirler.
Alternatif olarak, scaleMode öğesi StageScaleMode.NO_SCALE olarak ayarlanırsa, bir izleyen Flash Player veya AIR
penceresini yeniden boyutlandırdığında, Sahne Alanı içerikleri tanımlı boyutunu korur. Yalnızca bu ölçekleme
modunda, yeniden boyutlandırılan pencerenin gerçek piksel boyutlarını belirlemek için Sahne Alanı'nın stageWidth
ve stageHeight özellikleri kullanılabilir. (Diğer ölçekleme modlarında, stageWidth ve stageHeight özellikleri her
zaman SWF'nin orijinal genişliğini ve yüksekliğini yansıtır.) Ayrıca, scaleMode öğesi StageScaleMode.NO_SCALE
olarak ayarlandığında ve SWF dosyası yeniden boyutlandırıldığında, Stage sınıfının resize olayı gönderilerek uygun
şekilde ayarlamalar yapmanız sağlanır.
Sonuç olarak, scaleMode öğesinin StageScaleMode.NO_SCALE olarak ayarlanması, istediğiniz zaman pencere
yeniden boyutlandırmasına ekran içeriklerinin nasıl ayarlanacağını daha fazla denetlemenizi sağlar. Örneğin, video ve
denetim çubuğu içeren bir SWF dosyasında, Sahne Alanı yeniden boyutlandırıldığında denetim çubuğunun aynı
boyutta kalmasını sağlamak ve yalnızca Sahne Alanı boyutundaki değişikliği barındıracak şekilde video penceresinin
boyutunu değiştirmek isteyebilirsiniz. Aşağıdaki örnekte bu gösterilmektedir:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 280
Görüntü programlama
// videoScreen is a display object (e.g. a Video instance) containing a
// video; it is positioned at the top-left corner of the Stage, and
// it should resize when the SWF resizes.
//
//
//
//
controlBar is a display object (e.g. a Sprite) containing several
buttons; it should stay positioned at the bottom-left corner of the
Stage (below videoScreen) and it should not resize when the SWF
resizes.
import
import
import
import
flash.display.Stage;
flash.display.StageAlign;
flash.display.StageScaleMode;
flash.events.Event;
var swfStage:Stage = videoScreen.stage;
swfStage.scaleMode = StageScaleMode.NO_SCALE;
swfStage.align = StageAlign.TOP_LEFT;
function resizeDisplay(event:Event):void
{
var swfWidth:int = swfStage.stageWidth;
var swfHeight:int = swfStage.stageHeight;
// Resize the video window.
var newVideoHeight:Number = swfHeight - controlBar.height;
videoScreen.height = newVideoHeight;
videoScreen.scaleX = videoScreen.scaleY;
// Reposition the control bar.
controlBar.y = newVideoHeight;
}
swfStage.addEventListener(Event.RESIZE, resizeDisplay);
Tam ekran modunda çalışma
Tam ekran modu, herhangi bir konteyner kenarlığı veya menüler olmadan, bir filmin sahne alanını izleyicinin tüm
monitörünü dolduracak şekilde ayarlamanıza olanak sağlar. SWF dosyası için tam ekran modunu etkinleştirme ve
devre dışı bırakma arasında geçiş yapmak üzere, Stage sınıfının displayState özelliği kullanılır. displayState
özelliği, flash.display.StageDisplayState sınıfındaki sabitler tarafından tanımlanan değerlerden birine ayarlanabilir.
Tam ekran modunu açmak için, displayState özelliğini StageDisplayState.FULL_SCREEN olarak ayarlayın:
stage.displayState = StageDisplayState.FULL_SCREEN;
Flash Player'da, tam ekran modu yalnızca fare tıklatmasına (sağ tıklatma dahil) veya tuş basışına yanıt olarak
ActionScript üzerinden başlatılabilir. Uygulama güvenlik sanal alanında çalışan AIR içeriği için bir kullanıcı
hareketine yanıt olarak tam ekran moduna girilmesi gerekmez.
Tam ekran modundan çıkmak için, displayState özelliğini StageDisplayState.NORMAL olarak ayarlayın.
stage.displayState = StageDisplayState.NORMAL;
Ayrıca kullanıcı, odağı farklı bir pencereye geçirerek veya çok sayıdaki tuş birleşimlerinden birini kullanarak (Esc tuşu
(tüm platformlar), Control-W (Windows), Command-W (Mac) ya da Alt-F4 (Windows)) tam ekran modundan
çıkmayı seçebilir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 281
Görüntü programlama
Flash Player'da tam ekran modunu etkinleştirme
Bir HTML sayfasında gömülü SWF dosyası için tam ekran modunu etkinleştirmek üzere, Flash Player'ı gömmeye
yönelik HTML kodunun aşağıdaki gibi, allowFullScreen adı ve true değeri ile bir param etiketini ve embed
niteliğini içermesi gerekir:
<object>
...
<param name="allowFullScreen" value="true" />
<embed ... allowfullscreen="true" />
</object>
Flash geliştirme aracında, Dosya -> Yayınlama Ayarları seçeneklerini belirleyin ve Yayınlama Ayarları iletişim
kutusunun HTML sekmesinde Yalnızca Flash - Tam Ekran Moduna İzin Ver şablonunu seçin.
Flex'te, HTML şablonunun tam ekranı destekleyen <object> ve <embed> etiketlerini içerdiğinden emin olun.
SWF gömme etiketleri oluşturmak için bir web sayfasında JavaScript kullanıyorsanız, allowFullScreen param
etiketini ve niteliğini eklemek için JavaScript'i değiştirmeniz gerekir. Örneğin, HTML sayfanız AC_FL_RunContent()
işlevini (hem Flex Builder tarafından hem de Flash'ta oluşturulan HTML sayfaları tarafından kullanılan) kullanıyorsa,
aşağıdaki gibi bu işleve allowFullScreen parametresini eklemeniz gerekir:
AC_FL_RunContent(
...
'allowFullScreen','true',
...
); //end AC code
Bu, bağımsız Flash Player'da çalışan SWF dosyaları için geçerli değildir.
Not: Pencere Modu'nu (HTML'de wmode) Opak Penceresiz (opak) veya Saydam Penceresiz (saydam) olarak
ayarlarsanız, tam ekran penceresi her zaman opak olur
Tam ekran modunu tarayıcıda Flash Player ile kullanmaya yönelik güvenlikle ilgili kısıtlamalar da bulunmaktadır. Bu
kısıtlamalar “Flash Player güvenliği” sayfa 690 konusunda açıklanmıştır.
Tam ekran sahne boyutu ve ölçekleme
Stage.fullScreenHeight ve Stage.fullScreenWidth özellikleri, hemen duruma girilirse, tam ekran boyutuna
girilirken kullanılan monitör yüksekliğini ve genişliğini döndürür. Siz bu değerleri aldıktan sonra ancak tam ekran
moduna girmeden önce, kullanıcının tarayıcıyı bir monitörden diğerine taşıma olanağı varsa, bu değerler yanlış
olabilir. Bu değerleri Stage.displayState özelliğini StageDisplayState.FULL_SCREEN olarak ayarladığınız olay
işleyicisinde alırsanız, değerler doğrudur. Birden çok monitöre sahip kullanıcılar için, SWF içeriği yalnızca bir
monitörü dolduracak şekilde genişler. Flash Player ve AIR uygulaması, SWF'nin en büyük bölümünü hangi
monitörün içerdiğini belirlemek için bir metrik kullanır ve tam ekran modu için bu monitörü kullanır.
fullScreenHeight ve fullScreenWidth özellikleri yalnızca tam ekran modu için kullanılan monitörün boyutunu
yansıtır. Daha fazla bilgi için, ActionScript 3.0 Dil ve Bileşenler Başvurusu'nda Stage.fullScreenHeight ve
Stage.fullScreenWidth bölümlerine bakın.
Tam ekran modu için Sahne Alanı ölçekleme davranışı, normal moddakiyle aynıdır; ölçekleme, Stage sınıfının
scaleMode özelliği tarafından denetlenir. scaleMode özelliği StageScaleMode.NO_SCALE olarak ayarlanırsa, Sahne
Alanı'nın stageWidth ve stageHeight özellikleri, SWF tarafından kaplanan ekran alanının boyutunu (bu durumda,
ekranın tamamı) yansıtacak şekilde değişir; tarayıcıda görüntülenirse, ayarı bu denetimlerin HTML parametreleri
denetler.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 282
Görüntü programlama
Tam ekran modu etkinleştirildiğinde veya devre dışı bırakıldığında bunu algılayıp yanıt vermek için Stage sınıfının
fullScreen olayını kullanabilirsiniz. Örneğin, bu örnekteki gibi, tam ekran moduna girerken veya tam ekran
modundan çıkarken ekrandaki öğeleri yeniden konumlandırmak, ekrana öğe eklemek veya ekrandan öğe kaldırmak
isteyebilirsiniz:
import flash.events.FullScreenEvent;
function fullScreenRedraw(event:FullScreenEvent):void
{
if (event.fullScreen)
{
// Remove input text fields.
// Add a button that closes full-screen mode.
}
else
{
// Re-add input text fields.
// Remove the button that closes full-screen mode.
}
}
mySprite.stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenRedraw);
Bu kodun da gösterdiği gibi, fullScreen olayının olay nesnesi, tam ekran modunun etkinleştirilip (true)
etkinleştirilmediğini (false) belirten fullScreen özelliğini içeren bir flash.events.FullScreenEvent sınıfı örneğidir.
Tam ekran modunda klavye desteği
Flash Player bir tarayıcıda çalışırken, klavye olayları ve TextField örneklerindeki metin girişi gibi klavyeyle ilgili tüm
ActionScript, tam ekran modunda devre dışı bırakılır. İstisnalar (etkin tuşlar) şunlardır:
• Seçili basılamayan tuşlar, ok tuşları, boşluk tuşu ve sekme tuşu
• Tam ekran modunu sonlandıran klavye kısayolları: Esc (Windows ve Mac), Control-W (Windows), Command-W
(Mac) ve Alt-F4
Bu kısıtlamalar, bağımsız Flash Player veya AIR uygulamasında çalışan SWF içeriği için mevcut değildir. AIR, klavye
girdisine izin veren etkileşimli bir tam ekran modunu destekler.
Tam ekran modunda donanım ölçekleme
Flash Player veya AIR uygulamasını sahne alanının belirli bir bölgesini tam ekran moduna ölçekleyecek şekilde
ayarlamak için Stage sınıfının fullScreenSourceRect özelliğini kullanabilirsiniz. Flash Player ve AIR, varsa
kullanıcının bilgisayarındaki grafik ve video kartını kullanarak donanımda ölçekler ve genellikle içeriği yazılım
ölçeklemeden daha hızlı bir şekilde görüntüler.
Donanım ölçeklemeden yararlanmak için, sahne alanının tamamını veya bir kısmını tam ekran moduna ayarlarsınız.
Şu ActionScript 3.0 kodu, sahne alanının tamamını tam ekran moduna ayarlar:
import flash.geom.*;
{
stage.fullScreenSourceRect = new Rectangle(0,0,320,240);
stage.displayState = StageDisplayState.FULL_SCREEN;
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 283
Görüntü programlama
Bu özellik geçerli bir dikdörtgene ayarlandığında ve displayState özelliği tam ekran moduna ayarlandığında, Flash
Player ve AIR belirtilen alanı ölçekler. ActionScript içinde piksel olarak gerçek Sahne Alanı boyutu değişmez. Flash
Player ve AIR, “Tam ekran modundan çıkmak için Esc düğmesine basın” mesajını barındıracak şekilde dikdörtgenin
boyutu için minimum bir sınırı zorlar. Bu sınır genellikle yaklaşık 260 x 30 pikseldir ancak platforma ve Flash Player
sürümüne bağlı olarak değişiklik gösterebilir.
fullScreenSourceRect özelliği yalnızca Flash Player veya AIR tam ekran modunda olmadığında ayarlanabilir.
Bu özelliği düzgün bir şekilde kullanmak için, öncelikle bu özelliği ayarlayın, ardından displayState özelliğini tam
ekran moduna ayarlayın.
Ölçeklemeyi etkinleştirmek için, fullScreenSourceRect özelliğini bir dikdörtgen nesnesine ayarlayın.
stage.fullScreenSourceRect = new Rectangle(0,0,320,240);
Ölçeklemeyi devre dışı bırakmak için, fullScreenSourceRect özelliğini null olarak ayarlayın.
stage.fullScreenSourceRect = null;
Flash Player ile tüm donanım ivmesi özelliklerinden yararlanabilmek için, özelliği Flash Player Ayarları iletişim
kutusundan etkinleştirin. İletişim kutusunu yüklemek için, tarayıcınızdaki Flash Player içeriğinin üzerinde sağ tıklatın
(Windows) veya Control tuşuna basarak tıklatın (Mac). Birinci sekme olan Görünüm sekmesini seçin ve Donanım
ivmesini etkinleştir onay kutusunu tıklatın.
Doğrudan ve GPU birleştirme penceresi modları
Flash Player 10, doğrudan ve GPU birleştirme olmak üzere iki pencere modu sunar, bu pencereleri Flash geliştirme
aracındaki yayın ayarlarından etkinleştirebilirsiniz. Bu modlar AIR uygulamasında desteklenmez. Bu modlardan
yararlanabilmek için, Flash Player için donanım ivmesini etkinleştirmeniz gerekmektedir.
Doğrudan modu, grafikleri ekrana itmek için en hızlı ve en doğrudan yolu kullanır ve bu da video oynatımı için avantaj
sağlar.
GPU birleştirme modu, birleştirme işlemini hızlandırmak için video kartında grafik işleme birimini kullanır. Video
birleştirme, tek bir video görüntüsü oluşturmak için birden çok görüntü katmanlama işlemidir. GPU ile birleştirme
hızlandırıldığında, YUV dönüştürme, renk düzeltme, döndürme veya ölçekleme ve harmanlama performansı
artırılabilir. YUV dönüştürme, video kameraların ve ekranların kullandığı RGB (kırmızı, yeşil, mavi) renk modeline
iletim için kullanılan bileşik analog sinyallerin renk dönüştürmesini ifade eder. Birleştirmeyi hızlandırmak için
GPU'nun kullanılması, CPU'ya yüklenecek olan bellek ve hesaplama gereksinimini azaltır. Bu da standart tanımlı
videoların daha akıcı şekilde oynatılmasını sağlar.
Bu pencere modlarını uygularken dikkatli olun. GPU birleştirmenin kullanılması bellek ve CPU kaynakları için
maliyetli olabilir. Bazı işlemler (örn. harmanlama modları, filtre uygulama, kırpma veya maskeleme) GPU'da
gerçekleştirilemezse, bu işlemler yazılım tarafından yapılır. Adobe, bu modları kullanırken her HTML sayfası için
kendinizi bir SWF dosyasıyla sınırlamanızı ve bant reklamlar için bu modları etkinleştirmemenizi önerir. Flash
uygulamasının Filmi Test Et işlevi, donanım ivmesini kullanmaz ancak Yayınla Önizle seçeneği üzerinden bu işlevi
kullanabilirsiniz.
SWF dosyanızda maksimum ekran yenileme hızı olan 60'tan yüksek bir kare hızının ayarlanması gereksizdir. Kare
hızının 50 ile 55 arasında bir değere ayarlanması, zaman zaman çeşitli nedenlerle oluşabilen bırakılan karelere neden
olur.
Doğrudan modunu kullanabilmek için Windows'ta 128 MB VRAM ile Microsoft DirectX 9 ve Apple Macintosh, Mac
OS X v10.2 veya daha üstü için OpenGL gerekmektedir. GPU birleştirme için Windows'ta 128 MB VRAM ile
Microsoft DirectX 9 ve Pixel Shader 2.0 desteği gerekir. Mac OS X ve Linux'ta GPU birleştirme için OpenGL 1.5 ve
birçok OpenGL uzantısı (framebuffer nesnesi, çoklu doku, gölgelendirici nesneleri, gölgeleme dili, parça
gölgelendirici) gerekir.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 284
Görüntü programlama
Flash sekmesindeki Donanım İvmesi menüsünü kullanarak, Flash uygulamasının Yayın Ayarları iletişim kutusu
üzerinden her SWF dosyasında direct ve gpu ivme modlarını etkinleştirebilirsiniz. Yok seçeneğini belirlerseniz,
HTML sekmesindeki Pencere Modu ayarının belirttiği gibi, pencere modu default, transparent veya opaque,
ayarına geri döndürülür.
Görüntüleme nesneleri için olayları işleme
DisplayObject sınıfı, EventDispatcher sınıfından miras alır. Başka bir deyişle, her görüntüleme nesnesi olay modeline
tamamen katılabilir (“Olayları işleme” sayfa 243 bölümünde açıklanmıştır.) Her görüntüleme nesnesi, belirli bir olayı
dinlemek için addEventListener() yöntemini (EventDispatcher sınıfından miras alınır) kullanabilir ancak yalnızca
dinleme nesnesi o olayın olay akışının bir parçasıysa bu gerçekleşebilir.
Flash Player veya AIR bir olay nesnesi gönderdiğinde, söz konusu olay nesnesi Sahne Alanı'ndan olayın gerçekleştiği
görüntüleme nesnesine doğru dairesel bir seyahatte bulunur. Örneğin, kullanıcı child1 adında bir görüntüleme
nesnesini tıklatırsa, Flash Player, Sahne Alanı'ndan görüntüleme listesi hiyerarşisinde child1 görüntüleme nesnesine
doğru aşağı yönde bir olay nesnesi gönderir.
Bu diyagramda gösterildiği gibi, olay akışı kavramsal olarak üç aşamaya ayrılır:
Sahne Alanı
Yakalama
Aşaması
Köpürme
Aşaması
Üst Düğüm
Alt1 Düğüm
Alt2 Düğüm
Hedefleme
Aşaması
Daha fazla bilgi için “Olayları işleme” sayfa 243 bölümünü inceleyin.
Görüntüleme nesnesi olaylarıyla çalışırken dikkate alınması gereken önemli bir nokta, görüntüleme nesnelerinin,
görüntüleme listesinden kaldırıldığında otomatik olarak bellekten de kaldırılıp (çöp toplama) kaldırılmaması üzerinde
olay dinleyicilerinin etki sahibi olabilmesidir. Görüntüleme nesnesinin olaylarına dinleyici olarak abone olmuş
nesneler varsa, söz konusu olay nesnesi halen bu dinleyici nesnelere başvuru içerdiğinden, görüntüleme listesinden
kaldırılsa da bellekten kaldırılmaz. Daha fazla bilgi için, bkz. “Olay dinleyicilerini yönetme” sayfa 257.
DisplayObject alt sınıfı seçme
Belirlenebilecek birçok seçenek olduğundan, görüntüleme nesneleriyle çalışırken vereceğiniz önemli kararlardan biri,
hangi görüntüleme nesnesini ne amaçla kullanacağınızdır. Aşağıda, karar vermenize yardımcı olacak birkaç yönerge
verilmiştir. İster bir sınıf örneğine ihtiyacınız olsun, isterse oluşturduğunuz sınıf için bir temel sınıf seçiyor olun, bu
önerilerin aynısı geçerlidir:
• Başka görüntüleme nesneleri için konteyner olabilecek bir nesneye ihtiyacınız yoksa (başka bir deyişle, bağımsız bir
ekran öğesi görevi görecek bir nesneye ihtiyacınız varsa), ne için kullanılacağına bağlı olarak bu DisplayObject veya
InteractiveObject alt sınıflarından birini seçin:
• Bitmap görüntüsünü görüntülemek için Bitmap.
• Metin eklemek için TextField.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 285
Görüntü programlama
• Video görüntülemek için Video.
• Ekran içeriği çizmek üzere "tuval" için Shape öğesi. Özellikle, ekranda şekil çizmek için bir örnek oluşturmak
istiyorsanız ve bu örnek diğer görüntüleme nesneleri için bir konteyner olmayacaksa, Sprite veya MovieClip
yerine Shape öğesini kullanmanız çok daha fazla performans avantajı elde etmenizi sağlayacak.
• Flash geliştirme aracı tarafından oluşturulan öğeler için MorphShape, StaticText veya SimpleButton.
(Programlama yoluyla bu sınıfların örneklerini oluşturamazsınız ancak Flash geliştirme aracı kullanılarak
oluşturulmuş öğeleri ifade etmek için bu veri türleriyle değişkenler oluşturabilirsiniz.)
• Ana Sahne Alanı'nı ifade etmek için bir değişken gerekiyorsa, veri türü olarak Stage sınıfını kullanın.
• Harici bir SWF dosyasını veya görüntü dosyasını yüklemek için bir konteyner gerekiyorsa, Loader örneğini
kullanın. Yüklenen içerik, Loader örneğinin bir alt öğesi olarak görüntüleme listesine eklenir. Veri türü ise,
aşağıdaki gibi, yüklenen içeriğin doğasına bağlı olur:
• Yüklenen görüntü bir Bitmap örneği olacaktır.
• ActionScript 3.0'da yazılmış, yüklenen bir SWF dosyası, Sprite veya MovieClip örneği (ya da içerik oluşturucu
tarafından belirtildiği şekilde bu sınıfların bir örneği veya alt sınıfı) olacaktır.
• ActionScript 1.0 veya ActionScript 2.0'da yazılmış, yüklenen bir SWF dosyası, AVM1Movie örneği olacaktır.
• Diğer görüntüleme nesneleri için konteyner görevi görecek (ActionScript kullanarak görüntüleme nesnesi
üzerinde çizim yapacak olsanız da olmasanız da) bir nesne gerekiyorsa, DisplayObjectContainer alt sınıflarından
birini seçin:
• Nesne yalnızca ActionScript kullanılarak oluşturulacaksa veya yalnızca ActionScript ile oluşturulup işlenecek
özel bir görüntüleme nesnesinin temel sınıfı olarak oluşturulacaksa: Sprite.
• Flash geliştirme aracında oluşturulmuş bir film klibini ifade etmek için değişken oluşturuyorsanız: MovieClip.
• Flash kütüphanesinde bir film klibi sembolüyle ilişkilendirilecek bir sınıf oluşturuyorsanız, sınıfınızın temel sınıfı
olarak bu DisplayObjectContainer alt sınıflarından birini seçin:
• İlişkilendirilen film klibi sembolü, birden çok kare üzerinde içerik barındırıyorsa: MovieClip.
• İlişkilendirilen film klibi sembolü, yalnızca birinci karede içerik barındırıyorsa: Sprite.
Görüntüleme nesnelerini işleme
Hangi görüntüleme nesnesini kullanmayı seçtiğiniz dikkate alınmaksızın, ekranda görüntülenen öğeler olarak tüm
görüntüleme nesnelerinin ortak şekilde sahip olduğu birkaç işleme vardır. Örneğin, bunların tümü ekranda
konumlandırılabilir, görüntüleme nesnelerinin yığınlama sırasında ileri veya geri taşınabilir, ölçeklenebilir,
döndürülebilir, vb. işlemler yapılabilir. Tüm görüntüleme nesneleri bu işlevleri ortak temel sınıflarından
(DisplayObject) aldığından, TextField örneğini, Video örneğini, Shape örneğini ya da başka bir görüntüleme nesnesini
de işleseniz, bu işlevler aynı şekilde davranır. İlerleyen bölümlerde bu ortak görüntüleme nesnesi işlemelerinin birçoğu
ayrıntılı şekilde ele alınmaktadır.
Konum değiştirme
Herhangi bir görüntüleme nesnesinin en temel işlenmesi, ekrandaki konumunun değiştirilmesidir. Görüntüleme
nesnesinin konumunu ayarlamak için, nesnenin x ve y özelliklerini değiştirin.
myShape.x = 17;
myShape.y = 212;
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 286
Görüntü programlama
Görüntüleme nesnesi konumlandırma sistemi, Sahne Alanı'nı Kartezyen koordinat sistemi (yatay x ekseni ve dikey y
eksenine sahip ortak ızgara sistemi) olarak değerlendirir. Koordinat sisteminin başlangıç noktası (x ve y eksenlerinin
buluştuğu 0,0 koordinatı), Sahne Alanı'nın sol üst köşesindedir. Bu noktadan itibaren, x değerleri pozitif olarak sağa
ve negatif olarak sola giderken (tipik grafik sistemlerinin tersine), y değerleri pozitif olarak aşağı ve negatif olarak
yukarı gider. Örneğin, kodun önceki satırları myShape nesnesini 17 x koordinatına (başlangıç noktasının 17 piksel
sağına) ve 212 y koordinatına (başlangıç noktasının 212 piksel aşağısına) taşır.
Varsayılan olarak, ActionScript kullanılarak bir görüntüleme nesnesi oluşturulduğunda, x ve y özelliklerinin her ikisi
de 0 değerine ayarlanır ve böylece nesne, üst içeriğinin sol üst köşesine yerleştirilir.
Sahne Alanı'na göre konum değiştirme
x ve y özelliklerinin her zaman, üst görüntüleme nesnesinin eksenlerinin 0,0 koordinatına göre görüntüleme
nesnesinin konumunu ifade ettiğinin unutulmaması önemlidir. Bu nedenle de, bir Sprite örneğinin içinde yer alan bir
Shape örneği (örn. bir daire) için, Shape nesnesinin x ve y özelliklerinin 0 olarak ayarlanması sonucunda daire Sprite
öğesinin sol üst köşesine yerleştirilir ve bunun her zaman Sahne Alanı'nın sol üst köşesi olması gerekmez. Bir nesnesi
genel Sahne Alanı koordinatlarına göre konumlandırmak için, koordinatları genel (Sahne Alanı) koordinatlardan
yerel (görüntüleme nesnesi konteyneri) koordinatlarına dönüştürmek için aşağıdaki gibi, herhangi bir görüntüleme
nesnesinin globalToLocal() yöntemini kullanabilirsiniz:
// Position the shape at the top-left corner of the Stage,
// regardless of where its parent is located.
// Create a Sprite, positioned at x:200 and y:200.
var mySprite:Sprite = new Sprite();
mySprite.x = 200;
mySprite.y = 200;
this.addChild(mySprite);
// Draw a dot at the Sprite's 0,0 coordinate, for reference.
mySprite.graphics.lineStyle(1, 0x000000);
mySprite.graphics.beginFill(0x000000);
mySprite.graphics.moveTo(0, 0);
mySprite.graphics.lineTo(1, 0);
mySprite.graphics.lineTo(1, 1);
mySprite.graphics.lineTo(0, 1);
mySprite.graphics.endFill();
// Create the circle Shape instance.
var circle:Shape = new Shape();
mySprite.addChild(circle);
// Draw a circle with radius 50 and center point at x:50, y:50 in the Shape.
circle.graphics.lineStyle(1, 0x000000);
circle.graphics.beginFill(0xff0000);
circle.graphics.drawCircle(50, 50, 50);
circle.graphics.endFill();
// Move the Shape so its top-left corner is at the Stage's 0, 0 coordinate.
var stagePoint:Point = new Point(0, 0);
var targetPoint:Point = mySprite.globalToLocal(stagePoint);
circle.x = targetPoint.x;
circle.y = targetPoint.y;
Aynı şekilde, yerel koordinatları Sahne Alanı koordinatlarına dönüştürmek için de DisplayObject sınıfının
localToGlobal() yöntemini kullanabilirsiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 287
Görüntü programlama
Sürükleyip bırakma etkileşimi oluşturma
Görüntüleme nesnesinin taşınmasının yaygın bir nedeni, sürükleyip bırakma etkileşimi oluşturmaktır, böylece
kullanıcı bir nesneyi tıklattığında, fare hareket ettikçe nesne de hareket eder ve fare düğmesi serbest bırakılıncaya kadar
bu böyle devam eder. Sürükleyip bırakma etkileşimi ActionScript'te iki şekilde oluşturulabilir. Her iki durumda da iki
fare olayı kullanılır: fare düğmesine basıldığında, nesneye fare imlecini takip etmesi bildirilir ve düğme serbest
bırakıldığında, nesneye fare imlecini takip etmeyi durdurması bildirilir.
Birinci yol olan startDrag() yönteminin kullanılması daha basittir ancak sınırlıdır. Fare düğmesine basıldığında,
sürüklenecek görüntüleme nesnesinin startDrag() yöntemi çağrılır. Fare düğmesi serbest bırakıldığında,
stopDrag() yöntemi çağrılır.
// This code creates a drag-and-drop interaction using the startDrag()
// technique.
// square is a DisplayObject (e.g. a MovieClip or Sprite instance).
import flash.events.MouseEvent;
// This function is called when the mouse button is pressed.
function startDragging(event:MouseEvent):void
{
square.startDrag();
}
// This function is called when the mouse button is released.
function stopDragging(event:MouseEvent):void
{
square.stopDrag();
}
square.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
square.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
Bu teknik önemli ölçüde bir sınırlama içerir: startDrag() kullanılarak aynı anda yalnızca bir öğe sürüklenebilir.
Yalnızca bir görüntüleme nesnesi sürüklenirken startDrag() yöntemi başka bir görüntüleme nesnesinde çağrılırsa,
birinci görüntüleme nesnesi fareyi takip etmeyi hemen durdurur. Örneğin, startDragging() işlevi burada
gösterildiği gibi değiştirilirse, square.startDrag() yöntemi çağrısına rağmen yalnızca circle nesnesi sürüklenir:
function startDragging(event:MouseEvent):void
{
square.startDrag();
circle.startDrag();
}
startDrag() kullanılarak yalnızca bir nesnenin sürüklenebilmesinin sonucunda, stopDrag() yöntemi herhangi bir
görüntüleme nesnesinde çağrılabilir ve geçerli olarak sürüklenen nesneyi durdurur.
Birden çok görüntüleme nesnesi sürüklemeniz gerekiyorsa veya birden çok nesnenin startDrag() yöntemini
kullanması durumunda çakışma oluşması olasılığını önlemek için, en iyisi sürükleme etkisini oluşturmak için fareyi
takip etme tekniğinin kullanılmasıdır. Bu teknikte, fare düğmesine basıldığında, bir işlev, Sahne Alanı'nın mouseMove
olayına dinleyici olarak abone olur. Daha sonra fare her hareket ettiğinde çağrılacak olan bu işlev, sürüklenen
nesnenin, farenin x, y koordinatına atlamasına neden olur. Fare düğmesi serbest bırakıldıktan sonra, işlevin dinleyici
olarak aboneliği kaldırılır, başka bir deyişle, artık fare hareket ettiğinde bu işlev çağrılmaz ve nesne fare imlecini takip
etmeyi durdurur. Aşağıda, bu tekniği gösteren birkaç kod yer almaktadır:
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 288
Görüntü programlama
// This code creates a drag-and-drop interaction using the mouse-following
// technique.
// circle is a DisplayObject (e.g. a MovieClip or Sprite instance).
import flash.events.MouseEvent;
var offsetX:Number;
var offsetY:Number;
// This function is called when the mouse button is pressed.
function startDragging(event:MouseEvent):void
{
// Record the difference (offset) between where
// the cursor was when the mouse button was pressed and the x, y
// coordinate of the circle when the mouse button was pressed.
offsetX = event.stageX - circle.x;
offsetY = event.stageY - circle.y;
// tell Flash Player to start listening for the mouseMove event
stage.addEventListener(MouseEvent.MOUSE_MOVE, dragCircle);
}
// This function is called when the mouse button is released.
function stopDragging(event:MouseEvent):void
{
// Tell Flash Player to stop listening for the mouseMove event.
stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragCircle);
}
// This function is called every time the mouse moves,
// as long as the mouse button is pressed down.
function dragCircle(event:MouseEvent):void
{
// Move the circle to the location of the cursor, maintaining
// the offset between the cursor's location and the
// location of the dragged object.
circle.x = event.stageX - offsetX;
circle.y = event.stageY - offsetY;
// Instruct Flash Player to refresh the screen after this event.
event.updateAfterEvent();
}
circle.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
circle.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
Görüntüleme nesnesinin fare imlecini takip etmesini sağlamaya ek olarak, sürükleyip bırakma etkileşiminin ortak bir
parçasını da sürüklenen nesnenin diğer tüm nesnelerin yukarısında kayıyor gibi görünmesi için görüntünün önüne
taşınması oluşturur. Örneğin, her ikisi de sürükleyip bırakma etkileşimine sahip olan, biri daire ve biri kare olmak
üzere iki nesneniz olduğunu varsayın. Görüntüleme listesinde daire karenin aşağısında bulunursa ve siz de imlecin
karenin üzerine gelmesi için daireyi tıklatıp sürüklerseniz, daire karenin arkasından kayıyor gibi görünür ve bu da
sürükleyip bırakma görüntüsünü bozar. Bunun yerine, daire tıklatıldığında görüntüleme listesinin üst kısmına gidecek
şekilde ayarlama yapabilir ve böylece dairenin diğer tüm içeriklerin en üstünde görüntülenmesini sağlayabilirsiniz.
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 289
Görüntü programlama
Aşağıdaki kod (önceki örnekten uyarlanan), bir daire ve bir kare olmak üzere, iki görüntüleme nesnesi için sürükleyip
bırakma etkileşimi oluşturur. Fare düğmesine her basıldığında, öğe Sahne Alanı'nın görüntüleme listesinin en üst
kısmına taşınır, böylece sürüklenen öğe her zaman en üstte görüntülenir. Yeni olan veya önceki listeden değiştirilen
kod kalın yazı tipinde görüntülenir.
//
//
//
//
This code creates a drag-and-drop interaction using the mouse-following
technique.
circle and square are DisplayObjects (e.g. MovieClip or Sprite
instances).
import flash.display.DisplayObject;
import flash.events.MouseEvent;
var offsetX:Number;
var offsetY:Number;
var draggedObject:DisplayObject;
// This function is called when the mouse button is pressed.
function startDragging(event:MouseEvent):void
{
// remember which object is being dragged
draggedObject = DisplayObject(event.target);
// Record the difference (offset) between where the cursor was when
// the mouse button was pressed and the x, y coordinate of the
// dragged object when the mouse button was pressed.
offsetX = event.stageX - draggedObject.x;
offsetY = event.stageY - draggedObject.y;
// move the selected object to the top of the display list
stage.addChild(draggedObject);
// Tell Flash Player to start listening for the mouseMove event.
stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject);
}
// This function is called when the mouse button is released.
function stopDragging(event:MouseEvent):void
{
// Tell Flash Player to stop listening for the mouseMove event.
stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject);
}
FLASH IÇIN ACTIONSCRIPT 3.0 PROGRAMLAMA 290
Görüntü programlama
// This function is called every time the mouse moves,
// as long as the mouse button is pressed down.
function dragObject(event:MouseEvent):void
{
// Move the dragged object to the location of the cursor, maintaining
// the offset between the cursor's location and the location
// of the dragged object.
draggedObject.x = event.stageX - offsetX;
draggedObject.y = event.stageY - offsetY;
// Instruct Flash Player to refresh the screen after this event.
event.updateAfterEvent();
}
circle.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
circle.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
square.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
square.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
Bu etkiyi daha fazla genişletmek için (örn. kümeler arasında işaret veya kartların taşındığı bir oyun için), "alındığında"
sürüklenen nesneyi Sahne Alanı'nın görüntüleme listesine ekleyebilir ve daha sonra fare düğmesi serbest
bırakıldığında bunu başka bir listeye (bırakıldığı "küme" gibi) ekleyebilirsiniz.
Son olarak, etkiyi geliştirmek için, tıklatıldığında (sürüklemeye başladığınızda) görüntüleme nesnesine bir gölge
filtresi ekleyebilir ve nesne serbest bırakıldığında gölgeyi kaldırabilirsiniz. ActionScript'te gölge filtresinin ve diğer
görüntüleme nesnesi filtrelerinin kullanılmasıyla ilgili ayrıntılar için, bkz. “Görüntüleme nesnelerine filtre uygulama”
sayfa 346.
Görüntüleme nesnelerini yatay ve dikey kaydırma
Görüntülemek istediğiniz alana sığamayacak kadar büyük olan bir görüntüleme nesneniz varsa, görüntüleme
nesnesinin görüntülenebilir alanını tanımlamak için scrollRect özelliğini kullanabilirsiniz. Ayrıca, kullanıcı
girdisine yanıt olarak scrollRect özelliğini değiştirerek içeriğin sola ve sağa veya yukarı ve aşağı kaydırılmasını
sağlayabilirsiniz.
scrollRect özelliği, bir dikdörtgen alanını tek bir nesne olarak tanımlamak için gerekli değerleri birleştiren bir sınıf
niteliğindeki Rectangle sınıfının bir örneğidir. Görüntüleme nesnesinin görüntülenebilir alanını başlangıçta
tanımlamak için, yeni bir Rectangle örneği oluşturun ve bunu görüntüleme nesnesinin scrollRect özelliğine atayın.
Daha sonra, dikey veya yatay kaydırma için, scrollRect özelliğini ayrı bir Rectangle değişkenine yazar ve istediğiniz
özelliği değiştirirsiniz. (Örneğin, yatay kaydırma için Rectangle örneğinin x özelliğini veya dikey kaydırma için y
özelliğini değiştirirsiniz.) Bunun ardından, değiştirilen değeri görüntüleme nesnesin