Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: Resim Uygulama Örneği (Firebird+Zeos)  (Okunma sayısı 4907 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Emre

  • Global Moderatör
  • *****
  • İleti: 74
  • Rep: +6/-0
Resim Uygulama Örneği (Firebird+Zeos)
« : 11 Ekim 2005 10:19:58 »
www.delphidunyasi.com  
emre_lineus@yahoo.com          
emre_lineus@delphidunyasi.com                                                                                                                     25 Mart 2005

RESİMLERİMİZİ BARINDIRACAK BİR FIREBIRD VERİTABANI TASARIMI VE BORLAND DELPHI UYGULAMASI İLE BU VERİTABANININ KULLANILMASI

Firebird 2.0 ’ın (http://firebird.sourceforge.net/) deneme testlerinin yapıldığı ve alpha sürümünün yayımlanmasının eli kulağında olduğu şu günlerde, açık kaynak kodlu İlişkisel Veritabanı Yönetim Sistemi (Relational Database Management System) olarak kendini ispatlamış olan bu veritabanın kullanımı gün geçtikçe yaygınlaşmaktadır.

Bu hususu dikkate alarak hazırladığım bu yazıda; tercih ettiğim araçlar ile bir firebird veritabanı tasarlayarak, bu veritabanı üzerinde temel işlemleri (veri görüntüleme, kayıt ekleme, kayıt arama, kayıt silme vb…) gerçekleştireceğimiz bir Borland Delphi (http://www.borland.com/delphi) uygulaması yazacağız. Başlıkta da belirtildiği gibi bu veritabanı resimlerimizi barındıran bir veritabanı olacak.

“Adım adım metodu” ile, yapacağım açıklamaların yeterince açıklayıcı olacağını umuyorum.

 

Veritabanı tasarımının yapılacağı ve ilgili uygulamanın çalıştırılacağı bilgisayarda firebird sunucusunun “süper sunucu” (superserver) olarak  kurulu olduğunu varsayarak (Firebird’ ün isteğe bağlı olarak klasik sunucu (classic) yada “süper sunucu” (superserver) olarak kurulumunun yapılabileceğini hatırlatmak isterim) devam etmek istiyorum. Eğer bilgisayarınızda firebird sunucusu yok ise devam etmeden önce http://prdownloads.sourceforge.net/firebird/Firebird-1.5.2.4 731-Win32.exe dosyasını bilgisayarınıza indirerek bu dosya aracılığıyla sunucuyu “superserver” olarak kurmalısınız. Burada “superserver” yapısını tercih etmemin sebebi, Firebird’ü geliştirenlerin Windows ortamında çalışacak bir firebird sunucusunun “superserver” olarak kurulmasını önermeleridir



Şekil 1: Firebird sunucusunun süper sunucu "superserver" olarak kurulması

Veritabanı tasarımı ve yönetimi yaparken, hem görsel desteği mevcut hem de SQL ifadeleri yazıp, görüntüleyebileceğimiz birçok araç olmasının yanında; kullanım rahatlığı ve ücretsiz olması (freeware) nedeniyle üç araç kullanıyorum:

 Birincisi fenisql.exe  firebird ilişkisel veritabanı tasarımı ve yönetimı aracı. GPL (General Public Licance) altında dağıtılıyor. Bu aracın temin edildiği site aynı zamanda firebird veritabanına erişim sağlayan kendi Delphi ve Kylix komponentlerini dağıtıyor. Yine  bunlar da GPL altında.

İkincisi IBEasy+.exe. Bu araç freeware yani ücretsiz. Programın Interbase/Firebird için birarada desteği mevcut.

Üçüncüsü, sourcefourge.net üyesi olan flamerobin.exe. Özellikle firebird için geliştirilmiş tamamen açık kaynak kodlu ve ücretsiz bir uygulama.

Biz burada ikinci ve üçüncü araçlardan faydalanacağız.

Flamerobin aracılığıyla bir firebird veritabanı oluşturuyoruz:

          Flamerobin yüklendikten sonra ilk çalıştırıldığında, program için başka firebird sunucularının ve veritabanlarının sicile geçirilebileceğini söyleyen bir mesaj karşımıza çıkacaktır. Tamam butonuna bastıktan sonra Şekil 2’deki pencere ekrana geliyor. Görüldüğü gibi sistemimizde, yüklü bir firebird sunucusu mevcut olduğu için “localhost” adında bir sunucu bu yüklü firebird sunucusunu zaten temsil etmektedir. Sunucumuzda yeni bir veritabanı oluşturmak için "localhost” yazısına sağ tıklayıp, “Create new database” komutunu veriyoruz. (Şekil 3)

Firebird, istemci/sunucu (client/server) uygulamalarda başarı ile kullanılmasının yanısıra; Paradox ya da Access veritabanı gibi yerel (local) olarakta kullanılabilmektedir. Sistemimizde yüklü bir firebird sunucusu olduğunda programın bu sunucuyu localhost olarak tanımlaması ve host adresi olarak 127.0.0.1 değerini vermesi bu sebepledir. “Localhost” üzerinde açılacak Şekil 3 te görülen popup menüden “Server registration info” komutu verilerek bu durum görülebilir.  

 
Şekil 2 : Localhost  adındaki  sunucumuz.  Şekil 3 : "Create new database" komutu

 Karşımıza gelen “Create New database” penceresini ben Şekil 4’teki gibi doldurdum.
 Burada “Database path” ile, oluşturacağımız veritabanının yolu ve veritabanımızın ismi (örn: Resimlerim.fdb) belirtiliyor.

“Username” ve “Password” ise firebird sunucuya giriş için gerekli yönetici adı ve şifresi olup benim sunucum için olduğu gibi diğer tüm firebird sunucularda varsayılan (default) olarak gelen ve sırasıyla “SYSDBA” ve “masterkey” olan değerleri kullandım.
 “Charset” veritabanının kullanacağı karakter setini temsil eder.
 Veritabanı blok yapılardan oluşmuştur ve bu blok yapılara page adı verilir. Sunucunun yönetimi ve girişler blok blok yapılır.  “Page size” veritabanı bloklarının byte olarak büyüklüğüdür. “Page size” değerinin yüksek olması sunucu performansını olumsuz yönde etkiler.
                “SQL Dialect”  deyimi 1 ve 3 değerlerini alabilmektedir. 1 değeri Interbase 5 için, 3 değeri Interbase 6 / Firebird için verilmektedir.


Şekil 4 : Yeni bir firebird veritabanının tanımlanması

Create butonuna basıldığında C: dizini altında yukarıdaki paramaetrelere sahip firebird veritabanımız oluşturulmuş olacaktır. Yani “RESIMLERIM.FDB”…

Eğer aşağıdaki gibi bir hata mesajı alırsanız ve veritabanını oluşturamazsanız, “Page Size” değerini düşürerek; mesela 2048 yaparak tekrar denemelisiniz


Şekil 5 : Büyük "Page size" değerinden kaynaklanan hata mesajı

Çevrimdışı Emre

  • Global Moderatör
  • *****
  • İleti: 74
  • Rep: +6/-0
Resim Uygulama Örneği (Firebird)
« Yanıtla #1 : 11 Ekim 2005 10:32:47 »
IBEasy+ ile Resimlerim.fdb veritabanımızı yapılandırıyoruz:             Flamerobin ile oluşturduğumuz veritabanımızı (Resimlerim.fdb) yapılandırmaya yine Flamerobin ile devam edebilirdik. Ancak kullanımının daha kolay olması ve SQL + görsel tasarım desteği vermesi nedeniyle IBEasy+ yazılımını tercih ediyoruz.

IBEasy+ açıldığında üstteki Database menüsü altındaki “Register a database” komutu ile başlıyoruz. Açılan pencere ile; varolan bir veritabanı, belirleyeceğimiz takma ad (alias) ile sicile  geçirilecek.

Şekil 6’ da görüldüğü gibi sol üst köşeden “new alias” komutu ile yeni bir hesap oluşturmalıyız. Sonrasında,  sağ taraftaki Database bölümünden ilgili veritabanımızın adını “Name” karşısına girdikten sonra (C:\RESIMLERIM.FDB) en üstteki DB Alias menüsünden veritabanımız için bir takma ad seçiyoruz (RESIMLERIM). Server kısmında sunucu adresi (address) olarak 127.0.0.1 değerini vererek sunucunun bizim bilgisayarımızda olduğunu belirtiyor ve Protocol olarak TCP/IP iletişim protokolünü

 seçiyoruz. Buradaki diğer seçeneklerden SPX, Novell işletim sistemi tarafından kullanılan protokol iken; NETBeui gerçek anlamda bir ağ protokolü değil bir Windows protokolüdür. OK butonuna bastıktan sonra Sol taraftaki listede RESIMLERIM takma adına sahip ve sağda görülen özellikleri içeren veritabanımızı program siciline geçirmiş olduk.  


Şekil 6 : RESIMLERIM.FDB' nin sicile geçirilmesi

             Exit butonu ile bu formdan çıktıktan sonra ana formdaki file menüsü altından “open database” komutunu çağırıyoruz. “Register Database” altından RESIMLERIM adlı takma adı seçtiğimiz zaman diğer alanlar az önce oluşturduğumuz değerleri otomatikman alacaktır. OK diyoruz ve bir aksilik olmazsa, RESIMLERIM takma adına sahip RESIMLERIM.FDB ile bağlantı kurulacaktır.


Şekil 7 : RESIMLERIM.FDB ile bağlantı kurulması

             Sıra geldi bu veritabanı üzerinde bir tablo oluşturmaya. Tables, Views, Queries… bölümünden Tables sekmesi seçildikten sonra, sağdaki aktif  “New”  butonuna tıklayarak kullanıcı arabirimine sahip, tablo oluşturmaya yardımcı formumuz açılıyor.

                 Bu kısımdan bir tablo için gerekli her işlemi gerçekleştirebiliriz. Alan tanımlama, index oluşturma, trigger desteği, tablonun SQL tanımı, tabloya kayıt ekleme, kayıt silme, tabloyu güncelleme vb..

             Önce alan tanımlama (field description) ile başlıyoruz. “Mnemonic” başlığına sahip sütunun ilk satırı tıklandığında veri girişine hazır hale geliyor. Bu sütuna alan adımızı yazacağız. İlk alan resmimizin adını tutan string bir ifade olsun; mesela “RESMINADI”. Yani alan adı olarak “RESMINADI” yazıyoruz. “Domain” sütununda ise bu alanın tipini seçiyoruz: ”VARCHAR”. Aşağıya iniyor ve “Size” ile alanın karakter uzunluğunu belirliyoruz. Ben maksimum 30 karakter olmasını istiyorum. Size değerinin hemen yanında alanımız için karakter setinin seçilmesi gerekiyor. Biz, sıralamalarda Türkçe karakter desteği istediğimiz için combobox tarzı birinci kutudan WIN1254 ve ikinci kutudan PXW_TURK  değerlerini seçtikten sonra alt taraftaki “NULL not allowed”  seçiminin işaretli olmasına dikkat ediyoruz. Böylece isimsiz resimler oluşmasını önlemiş oluyoruz. Alttaki OK butonuna basıyoruz.

             İkinci alanımız resimlerimizin kendilerini barındıracak alan olsun. Yukarıdaki menüden “New field” komutunu veriyoruz ve yeni bir satır (alan) oluşuyor. Bu alan ile ilgili değerler ise şöyle:

Alan Adı (Mnemonic): RESIM
Alan tipi: BLOB
Type : 0
Segment : 2048
Açıklama :BLOB alan tipi, grafik dosyalarından tutun da müzik ve video dosyalarına kadar büyük dosyaları barındırmak içindir. BLOB type 0 vererek bu alandaki verinin ikilik (binary) veri olacağını belirtiyoruz. Segment ise veritabanına okuma-yazmalarda performansı arttıran bir değer olup, FB 1.5 versiyonu için 2048 değeri önerilmektedir.

RESIM alanı için de “NULL not allowed”  seçeneğini işaretledikten sonra tekrar OK butonuna basıyoruz. Son olarak “EKLENMETARIHI” adında ve “DATE”  alan tipine sahip olan bir alan oluşturuyoruz. Bu alanda da resimlerimizin veritabanına eklenme tarihlerini tutmayı planlıyoruz.

             Tabloyu kaydetmeden önce bir birincil anahtar (primary key) oluşturacağız. Sıralamanın yapılmasını istediğimiz alan “RESMINADI” alanı olduğu için birinci satıra gelerek sağ tıklayıp açılan popup menüden “primary key” komutunu veriyoruz. “Save table” komutu ile tablomuzu kaydetmek istediğimizde çıkan pencerede tablomuzun adını belirliyor ve bir isim vererek kaydediyoruz. Ben adını EMRE koydum.


 Şekil 8 : Veritabanı tablomuzun yapılandırılmış hali

             Tablomuzun SQL ile ifadesi ise şöyledir:
Kod: SQL
  1. /* Table: EMRE, Owner: SYSDBA */
  2. CREATE TABLE "EMRE"
  3. (
  4. "RESMINADI"   VARCHAR(30) CHARACTER SET WIN1254 NOT NULL COLLATE  PXW_TURK,
  5.                "RESIM"         ; ;  BLOB SUB_TYPE 0 SEGMENT SIZE 2048 NOT NULL,
  6.                "EKLENMETARIHI"      DATE NOT NULL,
  7.  PRIMARY KEY ("RESMINADI")
  8. );
« Son Düzenleme: 21 Haziran 2009 01:31:07 by Kocaturk »

Çevrimdışı Emre

  • Global Moderatör
  • *****
  • İleti: 74
  • Rep: +6/-0
Resim Uygulama Örneği (Firebird)
« Yanıtla #2 : 11 Ekim 2005 10:38:46 »
Tabloda İndeks (Index) oluşturma:
             İndeks oluşturmak özellikle veritabanında yapılacak aramalarda hızlandırma sağlayacaktır. İndekslenen alanlar üzerinde yapılan arama sonuçlarının daha hızlı geriye dönmesi için indeks kullanmak gerekir. Özellikle kayıt sayısı büyük veritabanlarında kaydadeğer bir hızlandırma sağlayacaktır. Gereksiz yere indekslenen alanlar ise veri girişi, güncelleme ve kaydetme gibi işlemlerin yavaşlamasına neden olacaktır.

             Bizim veritabanımızda indekslenecek alanlarımız, RESMINADI ve EKLENMETARIHI alanlarıdır. Çünkü, yazacağımız programda, kullanıcının kayıtlı resimleri resmin adına göre yada ekleniş tarihine göre arama imkanının olmasını sağlayacağız.

               IBEasy+ ana formunda tablomuz seçili iken, sağdaki “Modify” butonuna basarak tablomuzu açalım. Önce, RESMINADI alanı için artan bir indeks oluşturalım. Bunun için “Index” başlığına tıkladıktan sonra “New index” komutunu verirsek imleç “Index name” girişine odaklanır. İndeks adını buradan giriyoruz. Benimkisi ARTANAD. Hemen yandan “Index order” bölümünden indeksimizin artan mı azalan mı olacağını belirtiyoruz. “Ascending” yani artan indeks seçiyoruz. “Unique” kısmından ise indeksimizin benzersiz (birbirinden farklı) değerlere sahip olup olmayacağını belirliyoruz. Bu indeksi kullanacak alan veya alanlardaki değerlerin kendi içlerinde birbirinden farklı olmasını istediğimiz için “Yes” seçili olmalı. Zira aynı isimde ada sahip iki yada daha fazla resim adı istemeyiz. Son olarak “Fields” alanına tıkladığımızda karşımıza gelen “Index fields” (indeks alanları) penceresinden indekslenecek alanlarımızı belirliyoruz. Dikkat edilmesi gereken nokta; eğer birden fazla alanı indeksleyeceksek, sağdan sola aktaracağımız ilk alanın ne olacağıdır. Çünkü indeks öncelikle bu alana göre sıralanacaktır. Biz, alan olarak sadece RESMINADI alanını sağdan sola aktarıyoruz ve bu alanın indekslenmesi gerektiğini belirterek OK butonu ile onaylıyoruz. (Şekil 9). İndeksin oluşturulmasını bitirmek için OK butonuna basıyoruz.


Şekil 9 : İndeks alanlarının belirlenmesi    

Veritabanımız için oluşturduğumuz diğer indeksler ve özellikleri ise Şekil 10’ da gösterilmiştir. Tablomuzu kaydederek çıkmayı unutmuyoruz.


Şekil 10 : Tablomuz için oluşturduğumuz indeksler

    Bu işlemlerden sonra tablomuzun SQL ifadesi şöyle olacaktır:
Kod: SQL
  1. /* Table: EMRE, Owner: SYSDBA */
  2. CREATE TABLE "EMRE"
  3. (
  4. "RESMINADI"   VARCHAR(30) CHARACTER SET WIN1254 NOT NULL COLLATE  PXW_TURK,
  5.                "RESIM"         ;  BLOB SUB_TYPE 0 SEGMENT SIZE 2048 NOT NULL,
  6.                "EKLENMETARIHI"      DATE NOT NULL,
  7.  PRIMARY KEY ("RESMINADI")
  8. );
  9.  
  10. /* Indices */
  11.  
  12. CREATE UNIQUE DESC INDEX AZALANAD
  13.                ON EMRE(RESMINADI);
  14. CREATE INDEX ARTANTARIH
  15.                ON EMRE(RESMINADI,EKLENMETARIHI);
  16. CREATE DESC INDEX AZALANTARIH
  17.                ON EMRE(RESMINADI,EKLENMETARIHI);
  18. CREATE UNIQUE INDEX ARTANAD
  19.                ON EMRE(RESMINADI);
« Son Düzenleme: 21 Haziran 2009 01:30:35 by Kocaturk »

Çevrimdışı Emre

  • Global Moderatör
  • *****
  • İleti: 74
  • Rep: +6/-0
Resim Uygulama Örneği (Firebird)
« Yanıtla #3 : 11 Ekim 2005 10:47:25 »
DELPHI İLE UYGULAMAMIZI (Resimlerim.exe) YAZIYORUZ:
 
          Sıra geldi bu veritabanının uygulamalar tarafından nasıl kullanılabileceğini göstermeye. Uygulamamızın temel amacı; oluşturduğumuz firebird veritabanı (C:\RESIMLERIM.FDB) üzerinde, temel veritabanı işlemlerinin nasıl yapılabileceğini göstermek. Yazının sonundaki linkten, yazdığımız programın kaynak kodlarının bulunduğu klasörü indirebilirsiniz.
 
        Uygulamamızı bir Borland (http://www.borland.com/) ürünü olan Delphi programlama dili vasıtasıyla yazacağız. Uygulama ortamı olarak “Delphi 2005 Architect Edition” kullandım. İşletim sistemi olarak Windows XP SP2 altında çalışacağım. Yazının bu bölümünden itibaren Delphi uygulama geliştirme ortamı (Delphi IDE) içinden anlatımlarımıza devam edeceğimiz için “bds.exe” (yeni delphi sürümünde) ya da ”delphi32.exe” (eski Delphi sürümleri için) çalıştırarak Delphi’ yi açıyoruz.
 
          Uygulamamız bir VCL (Visual Component Library) uygulaması olacak. Programcılar, Delphi 2005 ortamında hem yeni bir teknoloji olan .Net uygulamaları, hem de VCL uygulamaları yazabiliyorlar. Bunun için “File” menüsünden “New” kısmına gelerek “VCL Forms Application – Delphi  for Win32” kısmına tıklıyoruz. Yeni bir VCL projesi açılmış olacaktır.
 
             Kullanacağımız temel bileşen grupları ve bunların özellikleri şöyle olacak:
 
1.       Uygulamamız içinden veritabanına ulaşım için kullanacağımız bileşenler şu meşhur ZEOS veritabanı erişim ve yönetim bileşenleri. ZeosDbo olarak bilinen bu bileşenler, tamamen ücretsiz ve açık kaynak kodlu bileşenler olup; en son kararlı versiyonuna http://prdownloads.sourceforge.net/zeoslib/zeosdbo-6.1.5-sta ble.zip?download adresinden ulaşarak Delphi içinden kullanılabilecek şekilde yüklemelisiniz. Burada bu bileşenlerin Delphi içine nasıl yüklendiği konusuna yer vermeyecek, bileşen paketini yüklediğinizi kabul edeceğim.
 
Delphi’nin standart veritabanına erişim bileşenleri yerine Zeos bileşenlerini tercih etmemin nedeni ise herşeyden önce istemci / sunucu uygulamalar için tasarlanmış, performansı yüksek (yüksek hızlı) bileşenler olmalarıdır. BDE ve ADO bileşenleri açısından düşünecek olursak; Zeos bileşenlerinin bu bileşenlerden farklı olarak veritabanına herhangi bir arabirim kullanmadan direkt ulaşabilmelerinin bir avantaj olduğunu söyleyebiliriz. Delphi ile gelen standart Interbase bileşenleri yerine ki bu bileşenler firebird veritabanına erişim için de kullanılabilecek bileşenlerdir, Zeos bileşenlerini tercih ediyor olmam; zaten daha önceleri birçok makale ve örnekte kullanılmış olan Interbase bileşenlerinin burada tekrar edilmemesi ile alakalıdır. Ayrıca Zeos bileşenleri sadece Firebird veritabanına ulaşmakla kalmayıp, Firebird yanında Oracle, MSSQL, Sybase, Interbase, MySQL, PostgreSQL  gibi çok geniş ve en çok tercih edilen sunucular ile de kullanılabilmektedir. Bunun anlamı; sunucu ve veritabanı değişikliklerinde, Zeos bileşenlerini kullanarak yazdığımız uygulamaların, çok az bir değişiklikle çok kısa bir sürede yeni veritabanları ile kullanılabilir hale getirilebilmesidir.
 
Tırnak içinde şunu söylemek isterim ki; Delphi – Interbase / Firebird projelerinizde kullanmanızı tavsiye edeceğim ve en az ZeosDbo kadar güçlü bir diğer paket; http://www.ibobjects.com/ adresindeki “IBObjects” tir.



Şekil 12 :Bileşenlerin form üzerine yerleşimi


Tüm bu bileşenleri yerleştirdikten sonra “save all” komutu ile projemizi bir klasöre kaydediyoruz. Şimdi, bileşenleri yapılandırmadan önce yapmamız gereken ilk şey bilgisayarımızda Firebird sunucusunun yüklü olduğu klasörü açmak (eğer Firebird’ü kurarken bu klasörü değiştirmediyseniz bu klasörün yolu C:\Program Files\Firebird\Firebird_1_5). Bu klasör içindeki “bin” klasörünü açarak içindeki “fbclient.dll” dosyasını kopyalayıp kendi projemizin bulunduğu klasörün içine yapıştırmalısınız. Bu dosya bir dinamik bağlantı kütüphanesi (dynamic link library – DLL) dir ve programımız bir istemci (client) gibi çalışacağı için bu dosya içindeki fonksiyonlara ihtiyaç duyacaktır.

Tekrar Delphi içine dönelim. TZConnection bileşeni ile başlayalım. Bu bileşen veritabanı ile programımız arasındaki bağlantıyı sağlayan ve yöneten bir bileşendir. TZConnection bir Zeos uygulamasında olmazsa olmaz diyebileceğimiz tek bileşendir. Çünkü diğer tüm Zeos bileşenleri veritabanı işlemleri için bir bağlantıya ihtiyaç duyacaklardır ki bunu sağlayan bileşen TZConnection bileşenidir. Delphi Formumuz üzerindeki ZConnection1 bileşeninin ayarladığımız özellikleri Şekil 13’ de gösterilmiştir.

Çevrimdışı Emre

  • Global Moderatör
  • *****
  • İleti: 74
  • Rep: +6/-0
Resim Uygulama Örneği (Firebird)
« Yanıtla #4 : 11 Ekim 2005 10:55:49 »

Şekil 13 : “ZConnection1” bileşeninin ayarlanmış özellikleri

              Veritabanımızı belirttikten sonra “User” (kullanıcı adı) karşısına veritabanımızı tasarlarken kullandığımız “SYSDBA” değerini ve “Password” (şifre) karşısına “masterkey” değerini girerek, tüm bağlantı özellklerini belirledikten sonra veritabanı ile bağlantımızı aktif hale getirdiğimizde hata mesajı almayı önlüyoruz.
 
Veritabanı uygulamalarına yabancı olmayanlar “LoginPrompt” özelliğine de yabancı değildirdirler. Bu özellik,  veritabanı ile bağlantı kurmaya çalışan istemci uygulamaların veritabanına girişini bir kullanıcı adı ve şifre ile doğrulamalarını ister. Eğer veritabanınıza, kullanıcı adı ve şifreyi bilmeyenlerin girmelerini istemiyorsanız bu özelliği “True” olarak ayarlayabilirsiniz. “True” olarak ayarlandığında uygulamamız başladığında veya uygulamamız ile veritabanı bağlantısının kesilip tekrar bağlantı kurulmaya çalışılması esnasında bir onay penceresi ile kullanıcı adı ve şifresinin girilmesi istenecektir.
 
Gelelim “TransactIsolationLevel” özelliğine. Veritabanının çoklu kullanımlarında veritabanı üzerinde diğer kullanıcılar tarafından yapılan değişikliklerin kullanıcı tarafından görüntülenip görüntülenmeyeceği gibi özellikleri bu özellik belirliyor. “tiNone” değeri ile programımızın sadece program içinden yapılan veritabanı değişikliklerini göstereceğini belirtiyoruz. Bir ağ ortamında ise “tiReadCommitted” seçeneğini vererek tüm kullanıcılar tarafından yapılan değişikliklerin bizim programımız içinden görünebilmesini sağlayabilirdik.
 
Önemli olan bir diğer özellik ise “Properties” kısmı. Buradan veritabanı bağlantısı ile ilgili diğer istenen tüm özellikler verilebilmektedir. Bu da veritabanı ile iletişim adına daha çok seçenek sunar. “TStrings” tıklandığında karşımıza gelen editörden “codepage=WIN1254” yazıyoruz. Biz veritabanımızı Türkçe karakter desteğine göre tasarlamıştık. Veritabanımız Türkçe karakter desteği verirken istemci uygulamanın da bu desteği bilmesi gerekir ki veritabanı işlemlerinde (okuma, yazma, silme, arama vb…) karakterlerin tanınmamasından oluşacak hatalar engellensin. İşte bu ifade istemci uygulamamızın Türkçe karakterleri tanımasını sağlar.


Şekil 14 : “String List Editor”

Son olarak; veritabanı üzerinde değişiklikler yapmamızı engelleyen “ReadOnly” özelliğinin “False” değerini “True” olarak değiştirdikten sonra “Connected” özelliğini “True” yapıyoruz ve eğer bir hiçbir hata mesajı almıyorsak veritabanına (C:\RESIMLERIM.FDB) bağlantıyı gerçekleştirmişiz demektir.

                            İkinci bileşenimiz TZQuery bileşeni. Bu Zeos bileşeni veritabanı işlemlerinin yapılmasından sorumlu olan bileşendir ve SQL ifadeleri ile veritabanı üzerinde denetimi sağlar. Programımızın kalbi bu bileşende atar desek yeridir. Bu bileşenden formumuzda 2 tane var ve biri veritabanındaki kayıtların sayısını tutmaktan diğeri veritabanı üzerinde işlemler yapmaktan sorumlu olan bileşen. Daha belirgin olması için birincinin adını “ZQueryIstatistik”, ikincinin adını “ZQueryAlVer” olarak değiştirerek işe başlayalım. Her iki bileşenin yapılandırılmış özellliklerini Şekil15’ te bulabilirsiniz.


 Şekil 15 : “ZQueryIstatistik” ve“ZQueryAlVer” bileşenlerinin yapılandırılmış özellikleri



Her iki bileşen için de “Connection” özelliği olarak “ZConnection1” giriyoruz. Yani az önce yapılandırdığımız ZConnection1 bileşeninin kurmuş olduğu veritabanı bağlantısını (C:\RESIMLERIM.FDB) ve özelliklerini kullanacağımız anlamına geliyor.

             SQL özelliği ile devam etmek istiyorum. Burada hangi SQL ifadesinin ne işe yaradığını söyleyeceğim ve çoğu kitaptan bulabileceğiniz SQL ile ilgili detaylara girmeyeceğiz. “TStrings” tıklandığında açılan SQL editor penceresine SQL ifadeleri yazarak hazırlamaya başlıyoruz:


Şekil 16 : “ZQueryIstatistik” SQL ifadesi


Şekil 17 : “ZQueryAlVer” SQL ifadesi


“EMRE” veritabanı tablomuzun adıydı. İlk ifadede “Count(*)” bölümü ile veritabanındaki toplam kayıt sayısı hesaplatılıyor. Bu ifadenin kullanımı özellikle önemlidir. Çünkü ZQueryIstatistik bileşeninin “RecordCount” özelliğine karşılık gelir. Ancak eğer “Record Count” çağrımı ile toplam kaydı öğrenmeye çalışsaydık tüm veritabanı verilerinin istemci uygulamamıza taşınması anlamına gelen ve özellikle istemci / sunucu uygulamalarda hiçte önerilmeyen bir durum ile karşı karşıya kalırdık. Biz, “RecordCount” yerine toplam kayıt sayısını veren bu SQL ifadesini kullanarak veri sayısını veritabanı sunucusu tarafında yani yerinde hesaplatıyoruz.

Kod: SQL
  1. SELECT COUNT(*) FROM EMRE”
SQL ifadesini çalıştırmak için ZQueryIstatistik  bileşeninin “Active” özelliğini “True” yaptığımızda SQL ifadesi işletilmiş olacaktır. Peki geriye dönen değeri nasıl öğreneceğiz? Evet, Formdaki ZQueryIstatistik bileşenini sağ tıklayıp “Fields Editor…” komutunu veriyoruz. Açılan pencere, ilgili SQL ifadesine göre oluşturulan veritabanı alanlarının gösterildiği ve bu alanların forma bir bileşenmişçesine ilave edilmesini sağlayan bir pencere. Pencere içinde tekrar sağ tıklayıp “Add all fields” komutunu verdiğimizde “COUNT” adında ve “TIntegerField” tipinde bir alanın eklendiğini görebiliriz. Bu alan sadece bu pencereye eklenmekle kalmaz; az önce belirttiğim gibi Forma ‘da bir bileşen gibi aynen eklenir ve “ObjectInspector” penceresi altından kullanılabilir. Bu alanın uygulalmamız içindeki adı ise “ZQueryIstatistikCOUNT” tir. İşte bu alan yardımı ile SQL ifademizden geri dönen değeri öğreneceğiz. Programın içinden aldığım bir kod parçası buna bir örnek teşkil ediyor:
Kod: Delphi
  1.  result := ZQueryIstatistikCOUNT.Value
« Son Düzenleme: 21 Haziran 2009 01:34:40 by Kocaturk »

Çevrimdışı Emre

  • Global Moderatör
  • *****
  • İleti: 74
  • Rep: +6/-0
Resim Uygulama Örneği (Firebird)
« Yanıtla #5 : 11 Ekim 2005 11:10:18 »
 

Şekil 18 : “Fields Editor” içindeki “COUNT” ifadesi ve forma eklenen “ZQueryIstatistikCOUNT” alanının özellikleri



 Yukarıdaki anlatıma benzer bir şekilde
Kod: SQL
  1. “SELECT FIRST 0 * FROM EMRE”
SQL ifadesinin aktif hale getirilmesi ile oluşan alanlar ise veritabanı tablomuzdaki alanlara bağlı olarak şöyle:

 

Oluşan alan: ZQueryAlVerRESMINADI

Alanın tipi:  TStringField

Veritabanındaki karşılığı :  RESMINADI

 

Oluşan alan: ZQueryAlVerRESIM

Alanın tipi:  TBlobField

Veritabanındaki karşılığı :  RESIM

 

Oluşan alan: ZQueryAlVerEKLENMETARIHI

Alanın tipi: TDateField

Veritabanındaki karşılığı :  EKLENMETARIHI


 

 “ZQueryAlVer” bileşenimizin özellikle iki özelliğine dikkat etmemiz gerekiyor. Birincisi “RequestLive” . SQL sorgusu sonucu geri dönen veriler sadece okunabilirdir (read only). Yani üzerlerinde değişiklik yapılmasına izin verilmez. Bunu aşmak için “RequestLive” özelliğini “True” yapmalıyız. İkincisi “UpdateObject” özelliğinin alacağı değer. “UpdateObject” özelliği aslında bir bileşeni temsil eder. Bu özelliğe verilecek bileşen, veritabanı üzerinde kayıtları güncelleme, yeni bir kayıt açma, kayıt silme işlemlerini yaptıracak bir diğer bileşenimiz olan “ZUpdateSQL1” bileşeninin kendisidir.



Şekil 19 : “ZUpdateSQL1” bileşeni



ZUpdateSQL1 bileşeninin “DeleteSQL” özelliği ile veritabanındaki bir kayıt silinebilir. “InsertSQL” ifadesi ile veritabanına yeni bir kayıt eklenebilir ve “ModifySQL” özelliği ile varolan bir kayıt güncellenebilir. Tüm bu SQL ifadelerini yazmamız için bileşenin kendisi bir editor sunar ve bu editor bahsedilen SQL ifadelerini bir tıklama ile oluşturabilir (SQL generation). Bunun için “ZUpdateSQL1” bileşenimize sağ tıklayarak “updateSql editor” komutunu vererek editor penceresine ulaşıyoruz.



 Şekil 20’den göreceğimiz gibi tüm alanlar seçilerek “Generate SQL” butonuna basarsak, pencerenin “SQL” sayfasında üretilen SQL ifadelerini görebiliriz.





Şekil 20 : “ZUpdateSQL1” SQL üreteci



“ModifySQL “ özelliği için SQL ifadesi:

Kod: SQL
  1. UPDATE EMRE SET
  2.  
  3.   EMRE.RESMINADI = :RESMINADI,
  4.  
  5.   EMRE.RESIM = :RESIM,
  6.  
  7.   EMRE.EKLENMETARIHI = :EKLENMETARIHI
  8.  
  9. WHERE
  10.  
  11.   EMRE.RESMINADI = :OLD_RESMINADI AND
  12.  
  13.   EMRE.EKLENMETARIHI = :OLD_EKLENMETARIHI


 “InsertSQL “ özelliği için SQL ifadesi:

Kod: SQL
  1. INSERT INTO EMRE
  2.  
  3.   (EMRE.RESMINADI, EMRE.RESIM, EMRE.EKLENMETARIHI)
  4.  
  5. VALUES
  6.  
  7.   (:RESMINADI, :RESIM, :EKLENMETARIHI)


“DeleteSQL “ özelliği için SQL ifadesi:

Kod: SQL
  1. DELETE FROM EMRE
  2.  
  3. WHERE
  4.  
  5.   EMRE.RESMINADI = :OLD_RESMINADI AND
  6.  
  7.   EMRE.EKLENMETARIHI = :OLD_EKLENMETARIHI


TDataSource nesnesine gelince, bu bileşen Delphi’nin standart bileşenlerinden biri olup programımızda kullandığımız görsel veritabanı veri görüntüleme bileşenleri açısından önemlidir. TDataSource nesnesi bu bileşenler ile TZQuery bileşenleri arasında köprü görevi görerek verilerin görsel bileşenler içerisinde görüntülenmesini sağlar. Form üzerindeki DataSource1 nesnesinin “DataSet” özelliğini “ZQueryAlVer” yapıyoruz. Aynı zamanda “Enabled” özelliği de “True” olmalı. Bileşen olarak kullandığımız ve resimlerimizin adını ve kayıt tarihini görüntüleyecek bileşenler olarak kullanacağımız DBText1 ve DBText2 nesnelerinin “DataSource” özelliklerini “DataSource1” seçtikten sonra, DBText1 için “DataField” olarak RESMINADI ve DBText2 için “DataField” olarak EKLENMETARIHI değerlerini seçerek verileri görüntülemeye hazır hale getiriyoruz.





Şekil 21 : DataSource1, DBText1 ve DBText2 bileşenleri





Veritabanı nesneleri dışında kullandığımız diğer standart nesnelerin özelliklerini burada açıklamıyorum. Onlara indirebileceğiniz *.dpr içinden bakabilirsiniz.



Bileşenlerimizle ilgili tasarım zamanı (design time) yapılandırmasını bu şekilde yaptıktan sonra sıra çalışma zamanı (run time) işletilebilir kodları yazmaya geldi: Programımızın kodları şöyle:

Çevrimdışı Emre

  • Global Moderatör
  • *****
  • İleti: 74
  • Rep: +6/-0
Resim Uygulama Örneği (Firebird)
« Yanıtla #6 : 11 Ekim 2005 11:12:20 »
Kod: Delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, Variants, SysUtils, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ZConnection, DB, DBCtrls, ZAbstractRODataset, ZAbstractDataset,
  8.   ZDataset, StdCtrls, ExtDlgs, ExtCtrls, ZSqlUpdate, XPMan, ComCtrls,
  9.   Buttons, ActnList, Menus;
  10.  
  11. type
  12.   TForm1 = class(TForm)
  13.     ZConnection1: TZConnection;
  14.     ZQueryIstatistik: TZQuery;
  15.     DataSource1: TDataSource;
  16.     OpenPictureDialog1: TOpenPictureDialog;
  17.     ZUpdateSQL1: TZUpdateSQL;
  18.     StatusBar1: TStatusBar;
  19.     XPManifest1: TXPManifest;
  20.     ZQueryAlVer: TZQuery;
  21.     ZQueryAlVerRESMINADI: TStringField;
  22.     ZQueryAlVerRESIM: TBlobField;
  23.     ZQueryAlVerEKLENMETARIHI: TDateField;
  24.     ZQueryIstatistikCOUNT: TIntegerField;
  25.     ScrollBox1: TScrollBox;
  26.     Image1: TImage;
  27.     Panel1: TPanel;
  28.     BitBtn1: TBitBtn;
  29.     BitBtn2: TBitBtn;
  30.     ActionList1: TActionList;
  31.     ActionYukle: TAction;
  32.     ActionIlkKayit: TAction;
  33.     ActionSil: TAction;
  34.     DBText1: TDBText;
  35.     DBText2: TDBText;
  36.     ActionDegistir: TAction;
  37.     Panel2: TPanel;
  38.     Button1: TButton;
  39.     Button2: TButton;
  40.     Button3: TButton;
  41.     Button4: TButton;
  42.     PopupMenu1: TPopupMenu;
  43.     Action11: TMenuItem;
  44.     ActionDegistir1: TMenuItem;
  45.     ActionSil1: TMenuItem;
  46.     lkresmegit1: TMenuItem;
  47.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  48.     procedure BitBtn2Click(Sender: TObject);
  49.     procedure BitBtn1Click(Sender: TObject);
  50.     procedure ActionDegistirExecute(Sender: TObject);
  51.     procedure ActionSilExecute(Sender: TObject);
  52.     procedure ActionIlkKayitExecute(Sender: TObject);
  53.     procedure ActionYukleExecute(Sender: TObject);
  54.     procedure FormCreate(Sender: TObject);
  55.   private
  56.     procedure ResmiOrtala;
  57.     function KayitSayisi: integer;
  58.     procedure KayitSayisiniGoster;
  59.     procedure Kontroller;
  60.     procedure SecilenResmiGoster(var Resimlik: TImage; var VeriTutan: TZQuery;
  61.                                        var Alan: TBlobField);
  62.     { Private declarations }
  63.   public
  64.     { Public declarations }
  65.   end;
  66.  
  67.   function ResimEkle(const ResimSecici: TOpenPictureDialog;
  68.                         const VeriTutan: TZQuery; var AdAlani: TStringField;
  69.                         var ResimAlani: TBlobField; var TarihAlani: TDateField;
  70.                         const Guncelleyen: TZUpdateSQL): boolean;
  71.   function ResmiSil(const VeriTutan: TZQuery; var AdAlani: TStringField;
  72.                       var TarihAlani: TDateField; const Guncelleyen: TZUpdateSQL)
  73.                       : boolean;
  74.   function ResmiDegistir(const ResimSecici: TOpenPictureDialog;
  75.                              const VeriTutan: TZQuery; var AdAlani: TStringField;
  76.                              var ResimAlani: TBlobField; var TarihAlani: TDateField;
  77.                              const Guncelleyen: TZUpdateSQL): boolean;
  78.   procedure IlkResmiAl(var VeriTutan: TZQuery);
  79.   procedure SonrakiResmiAl(var VeriTutan: TZQuery);
  80.   procedure OncekiResmiAl(var VeriTutan: TZQuery);
  81.  
  82. var
  83.   Form1: TForm1;
  84.   SonrakiOnceki: integer;
  85.  
  86. implementation
  87.  
  88. {$R *.dfm}
  89.  
  90. function TForm1.KayitSayisi: integer;
  91. begin
  92.   ZQueryIstatistik.Active := False;
  93.   ZQueryIstatistik.Active := True;
  94.   result := ZQueryIstatistikCOUNT.Value;
  95. end;
  96.  
  97. procedure TForm1.Kontroller;
  98. var
  99.   KytSys: integer;
  100. begin
  101.   KytSys := KayitSayisi;
  102.   if KytSys = 0 then
  103.   begin
  104.     ActionSil.Enabled := False;
  105.     ActionIlkKayit.Enabled := False;
  106.     ActionDegistir.Enabled := False;
  107.     BitBtn2.Enabled := False;
  108.     BitBtn1.Enabled := False;
  109.   end
  110.   else
  111.   begin
  112.     case KytSys of
  113.     1:
  114.       begin
  115.         ActionSil.Enabled := True;
  116.         ActionIlkKayit.Enabled := False;
  117.         ActionDegistir.Enabled := True;
  118.         BitBtn2.Enabled := False;
  119.         BitBtn1.Enabled := False;
  120.       end;
  121.     else
  122.       begin
  123.         ActionSil.Enabled := True;
  124.         ActionDegistir.Enabled := True;
  125.         if SonrakiOnceki <= 0 then
  126.         begin
  127.           BitBtn2.Enabled := False;
  128.           ActionIlkKayit.Enabled := False;
  129.         end
  130.         else
  131.         begin
  132.           BitBtn2.Enabled := True;
  133.           ActionIlkKayit.Enabled := True;
  134.         end;
  135.         if SonrakiOnceki < KytSys - 1 then
  136.           BitBtn1.Enabled := True
  137.         else
  138.           BitBtn1.Enabled := False;
  139.       end;
  140.     end;
  141.   end;
  142. end;
  143.  
  144. procedure TForm1.KayitSayisiniGoster;
  145. var
  146.   KytSys: integer;
  147. begin
  148.   KytSys := KayitSayisi;
  149.   with StatusBar1.Panels do
  150.   begin
  151.     Items[0].Text := 'Toplam'+#32+IntToStr(KytSys)+#32+'kayıt bulundu';
  152.     Items[1].Text := IntToStr(SonrakiOnceki + 1)+' / '+IntToStr(KytSys);
  153.   end;
  154. end;
  155.  
  156. function ResimEkle(const ResimSecici: TOpenPictureDialog;
  157.                      const VeriTutan: TZQuery; var AdAlani: TStringField;
  158.                      var ResimAlani: TBlobField; var TarihAlani: TDateField;
  159.                      const Guncelleyen: TZUpdateSQL): boolean;
  160. var
  161.   uzanti: string;
  162. begin
  163.   with ResimSecici do
  164.   begin
  165.     if Execute = true then
  166.     begin
  167.       if FileName <> '' then
  168.       begin
  169.         uzanti := ExtractFileExt(FileName);
  170.         if (uzanti = '.bmp') then
  171.         begin
  172.           try
  173.               VeriTutan.Insert;
  174.               AdAlani.AsString := ExtractFileName(FileName);
  175.               ResimAlani.LoadFromFile(FileName);
  176.               TarihAlani.AsDateTime := Date;
  177.               Guncelleyen.InsertSQL;
  178.               VeriTutan.CachedUpdates := True;
  179.               VeriTutan.ApplyUpdates;
  180.               VeriTutan.CachedUpdates := False;
  181.               result := True;
  182.           except
  183.               begin
  184.                 VeriTutan.Cancel;
  185.                 VeriTutan.CachedUpdates := False;
  186.                 VeriTutan.CancelUpdates;
  187.                 result := False;
  188.               end;
  189.           end;
  190.         end;
  191.       end;
  192.     end
  193.     else
  194.       result := False;
  195.   end;
  196. end;
  197.  
  198. function ResmiSil(const VeriTutan: TZQuery; var AdAlani: TStringField;
  199.                     var TarihAlani: TDateField; const Guncelleyen: TZUpdateSQL)
  200.                     : boolean;
  201. var
  202.   Donen: integer;
  203. begin
  204.   Donen := Application.MessageBox('Bu resmi silmek istiyor musunuz?', 'DİKKAT',
  205.                                         Mb_YESNO + mb_DefButton2 + mb_ICONEXCLAMATION);
  206.   case Donen of
  207.     6:
  208.     begin
  209.       try
  210.         VeriTutan.Delete;
  211.         Guncelleyen.Params[3].Value := AdAlani.Value;
  212.         Guncelleyen.Params[4].Value := TarihAlani.Value;
  213.         Guncelleyen.DeleteSQL;
  214.         VeriTutan.CachedUpdates := True;
  215.         VeriTutan.ApplyUpdates;
  216.         VeriTutan.CachedUpdates := False;
  217.         result := True;
  218.       except
  219.         begin
  220.           VeriTutan.Cancel;
  221.           VeriTutan.CachedUpdates := False;
  222.           VeriTutan.CancelUpdates;
  223.           result := False;
  224.         end;
  225.       end;
  226.     end;
  227.     7: result := False;
  228.   end;
  229. end;
  230.  
  231. function ResmiDegistir(const ResimSecici: TOpenPictureDialog;
  232.                            const VeriTutan: TZQuery;  var AdAlani: TStringField;
  233.                            var ResimAlani: TBlobField; var TarihAlani: TDateField;
  234.                            const Guncelleyen: TZUpdateSQL): boolean;
  235. var
  236.   uzanti: string;
  237. begin
  238.   with ResimSecici do
  239.   begin
  240.     if Execute = true then
  241.     begin
  242.       if FileName <> '' then
  243.       begin
  244.         uzanti := ExtractFileExt(FileName);
  245.         if (uzanti = '.bmp') then
  246.         begin
  247.           try
  248.               VeriTutan.Edit;
  249.               Guncelleyen.Params[3].Value := AdAlani.Value;
  250.               Guncelleyen.Params[4].Value := TarihAlani.Value;
  251.               AdAlani.AsString := ExtractFileName(FileName);
  252.               ResimAlani.LoadFromFile(FileName);
  253.               TarihAlani.AsDateTime := Date;
  254.               Guncelleyen.ModifySQL;
  255.               VeriTutan.CachedUpdates := True;
  256.               VeriTutan.ApplyUpdates;
  257.               VeriTutan.CachedUpdates := False;
  258.               result := True;
  259.           except
  260.               begin
  261.                 VeriTutan.Cancel;
  262.                 VeriTutan.CachedUpdates := False;
  263.                 VeriTutan.CancelUpdates;
  264.                 result := False;
  265.               end;
  266.           end;
  267.         end;
  268.       end;
  269.     end
  270.     else
  271.       result := False;
  272.   end;
  273. end;
  274.  
  275. procedure IlkResmiAl(var VeriTutan: TZQuery);
  276. begin
  277.   with veritutan do
  278.   begin
  279.     Close;
  280.     SQL.Clear;
  281.     SQL.Add('SELECT FIRST 1 SKIP :nerdeki * FROM EMRE');
  282.     SonrakiOnceki := 0;
  283.     ParamByName('nerdeki').AsInteger := SonrakiOnceki;
  284.     Open;
  285.   end;
  286. end;
  287.  
  288. procedure SonrakiResmiAl(var VeriTutan: TZQuery);
  289. begin
  290.   with VeriTutan do
  291.   begin
  292.     if SonrakiOnceki < Form1.KayitSayisi - 1 then
  293.     begin
  294.       Close;
  295.       SQL.Clear;
  296.       SQL.Add('SELECT FIRST 1 SKIP :nerdeki * FROM EMRE');
  297.       Inc(SonrakiOnceki, 1);
  298.       ParamByName('nerdeki').AsInteger := SonrakiOnceki;
  299.       Open;
  300.     end;
  301.   end;
  302. end;
  303.  
  304. procedure OncekiResmiAl(var VeriTutan: TZQuery);
  305. begin
  306.   with VeriTutan do
  307.   begin
  308.     if SonrakiOnceki > 0 then
  309.     begin
  310.       Close;
  311.       SQL.Clear;
  312.       SQL.Add('SELECT FIRST 1 SKIP :nerdeki * FROM EMRE');
  313.       Dec(SonrakiOnceki, 1);
  314.       ParamByName('nerdeki').AsInteger := SonrakiOnceki;
  315.       Open;
  316.     end;
  317.   end;
  318. end;
  319.  
  320. procedure TForm1.SecilenResmiGoster(var Resimlik: TImage; var VeriTutan: TZQuery;
  321.                                           var Alan: TBlobField);
  322. var
  323.   Bitmap: TBitmap;
  324.   Akitma: TStream;
  325. begin
  326.   try
  327.     Bitmap := TBitmap.Create;
  328.     Akitma := TStream.Create;
  329.     Akitma := VeriTutan.CreateBlobStream(Alan, bmread);
  330.     Bitmap.LoadFromStream(Akitma);
  331.     Resimlik.Picture.Assign(Bitmap);
  332.   finally
  333.     begin
  334.       Akitma.Free;
  335.       Bitmap.Free;
  336.     end;
  337.   end;
  338. end;
  339.  
  340. procedure TForm1.ResmiOrtala;
  341. begin
  342.   with ScrollBox1 do
  343.   begin
  344.     if (Image1.Width <= Width) and (Image1.Height <= Height) then
  345.     begin
  346.       Image1.Left := (Width - Image1.Width) div 2;
  347.       Image1.Top := (Height - Image1.Height) div 2;
  348.     end;
  349.     if (Image1.Width > Width) and (Image1.Height <= Height) then
  350.     begin
  351.       Image1.Left := 0;
  352.       Image1.Top := (Height - Image1.Height) div 2;
  353.     end;
  354.     if (Image1.Width <= Width) and (Image1.Height > Height) then
  355.     begin
  356.       Image1.Left := (Width - Image1.Width) div 2;
  357.       Image1.Top := 0;
  358.     end;
  359.     if (Image1.Width > Width) and (Image1.Height > Height) then
  360.     begin
  361.       Image1.Left := 0;
  362.       Image1.Top := 0;
  363.     end;
  364.   end;
  365. end;
  366.  
  367. procedure TForm1.FormCreate(Sender: TObject);
  368. begin
  369.   SonrakiOnceki := -1;
  370.   Form1.Width := 700;
  371.   Form1.Height:= 645;
  372.   with ScrollBox1 do
  373.   begin
  374.     Width := 640;
  375.     Height := 480;
  376.     SetBounds((Form1.ClientWidth - ClientWidth) div 2,
  377.                  35, Width, Height);
  378.     Panel1.SetBounds((Form1.ClientWidth - Panel1.ClientWidth) div 2,
  379.                         Top + Height, Panel1.Width, Panel1.Height);
  380.     Panel2.SetBounds((Form1.ClientWidth - Panel2.ClientWidth) div 2,
  381.                         Top + Height + Panel1.Height, Panel2.Width, Panel2.Height);;
  382.     DBText2.SetBounds(Left, top - DBText2.Height, DBText2.Width, DBText2.Height);
  383.     DBText1.SetBounds(Left, top - DBText2.Height - DBText1.Height, DBText1.Width,
  384.                           DBText1.Height);
  385.   end;
  386.   if KayitSayisi > 0 then
  387.     ActionIlkKayit.Execute
  388.   else
  389.     KayitSayisiniGoster;
  390.   Kontroller;
  391. end;
  392.  
  393. procedure TForm1.ActionYukleExecute(Sender: TObject);
  394. var
  395.   donen: boolean;
  396. begin
  397.   donen := ResimEkle(OpenPictureDialog1, ZQueryAlVer, ZQueryAlVerRESMINADI,
  398.                         ZQueryAlVerRESIM, ZQueryAlVerEKLENMETARIHI, ZUpdateSQL1);
  399.   if donen = true then
  400.   begin
  401.     SecilenResmiGoster(Image1, ZQueryAlVer, ZQueryAlVerRESIM);
  402.     ResmiOrtala;
  403.     SonrakiOnceki := KayitSayisi - 1;
  404.     KayitSayisiniGoster;
  405.     Kontroller;
  406.   end;
  407. end;
  408.  
  409. procedure TForm1.ActionSilExecute(Sender: TObject);
  410. var
  411.   donen: boolean;
  412.   KytSys: integer;
  413. begin
  414.   donen := ResmiSil(ZQueryAlVer, ZQueryAlVerRESMINADI, ZQueryAlVerEKLENMETARIHI,
  415.                       ZUpdateSQL1);
  416.   if donen = True then
  417.   begin
  418.     KytSys := KayitSayisi;
  419.     case KytSys of
  420.       0:
  421.       begin
  422.         SonrakiOnceki := -1;
  423.         with Image1 do
  424.         begin
  425.           Picture := nil;
  426.           SetBounds(Left, Top, 100, 100);
  427.         end;
  428.       end;
  429.       else
  430.       with ZQueryAlVer do
  431.       begin
  432.         Close;
  433.         SQL.Clear;
  434.         if KytSys = SonrakiOnceki then
  435.           Dec(SonrakiOnceki, 1);
  436.         SQL.Add('SELECT FIRST 1 SKIP :nerdeki * FROM EMRE');
  437.         ParamByName('nerdeki').AsInteger := SonrakiOnceki;
  438.         Open;
  439.         SecilenResmiGoster(Image1, ZQueryAlVer, ZQueryAlVerRESIM);
  440.         ResmiOrtala;
  441.       end;
  442.     end;
  443.     KayitSayisiniGoster;
  444.     Kontroller;
  445.   end;
  446. end;
  447.  
  448. procedure TForm1.ActionDegistirExecute(Sender: TObject);
  449. var
  450.   donen: boolean;
  451. begin
  452.   donen := ResmiDegistir(OpenPictureDialog1, ZQueryAlVer, ZQueryAlVerRESMINADI,
  453.                           ZQueryAlVerRESIM, ZQueryAlVerEKLENMETARIHI, ZUpdateSQL1);
  454.   if donen = true then
  455.   begin
  456.     SecilenResmiGoster(Image1, ZQueryAlVer, ZQueryAlVerRESIM);
  457.     ResmiOrtala;
  458.     KayitSayisiniGoster;
  459.   end;
  460. end;
  461.  
  462. procedure TForm1.BitBtn1Click(Sender: TObject);
  463. begin
  464.   SonrakiResmiAl(ZQueryAlVer);
  465.   SecilenResmiGoster(Image1, ZQueryAlVer, ZQueryAlVerRESIM);
  466.   ResmiOrtala;
  467.   KayitSayisiniGoster;
  468.   Kontroller;
  469. end;
  470.  
  471. procedure TForm1.BitBtn2Click(Sender: TObject);
  472. begin
  473.   OncekiResmiAl(ZQueryAlVer);
  474.   SecilenResmiGoster(Image1, ZQueryAlVer, ZQueryAlVerRESIM);
  475.   ResmiOrtala;
  476.   KayitSayisiniGoster;
  477.   Kontroller;
  478. end;
  479.  
  480. procedure TForm1.ActionIlkKayitExecute(Sender: TObject);
  481. begin
  482.   IlkResmiAl(ZQueryAlVer);
  483.   SecilenResmiGoster(Image1, ZQueryAlVer, ZQueryAlVerRESIM);
  484.   ResmiOrtala;
  485.   KayitSayisiniGoster;
  486.   Kontroller;
  487. end;
  488.  
  489. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  490. begin
  491.   ZConnection1.Disconnect;
  492. end;
  493.  
  494. end.
« Son Düzenleme: 21 Haziran 2009 01:29:37 by Kocaturk »

Çevrimdışı Emre

  • Global Moderatör
  • *****
  • İleti: 74
  • Rep: +6/-0
Resim Uygulama Örneği (Firebird)
« Yanıtla #7 : 11 Ekim 2005 11:16:48 »
Bu kodlar ile çalıştırıp denediğimizde programın çıktısı aşağıdaki gibi olacaktır:


Şekil 22 : Resimlerim.exe çalışma zamanı

Buraya Tıklayarak Örnek Projeyi İndirebilirsiniz

Hepinize kolay gelsin…

Emre Özgür İnce

Çevrimdışı secret_boy

  • Yeni Üye
  • *
  • İleti: 12
  • Rep: +0/-0
  • Cinsiyet: Bay
Ynt: Resim Uygulama Örneği (Firebird)
« Yanıtla #8 : 14 Aralık 2005 01:25:57 »
çooook teşekkürler
« Son Düzenleme: 14 Aralık 2005 01:27:04 by secret_boy »
Dünya üç grup insandan oluşur;sonuçları ortaya çıkaran ve yapan küçük bir seçkin grup,olup biteni seyreden oldukça büyük bir diğer grup ve nelerin olup bittigini bilmeyen muazzam bir kalabalık.