Programlama yapalım ve Öğrenelim. - Delphi Eğitim214
  Ana Sayfa
  .NET Eğitim Notları
  Visual C# .NET Örnek Kodları
  VisualBasic.NET Örnek Kodları
  J# Örnekleri
  ASP.NET Örnek Kodları
  Delphi Eğitim
  => Delphi Eğitim1
  => Delphi Eğitim2
  => Delphi Eğitim3
  => Delphi Eğitim4
  => Delphi Eğitim5
  => Delphi Eğitim6
  => Delphi Eğitim7
  => Delphi Eğitim8
  => Delphi Eğitim9
  => Delphi Eğitim10
  => Delphi Eğitim11
  => Delphi Eğitim13
  => Delphi Eğitim14
  => Delphi Eğitim15
  => Delphi Eğitim16
  => Delphi Eğitim17
  => Delphi Eğitim18
  => Delphi Eğitim19
  => Delphi Eğitim20
  => Delphi Eğitim21
  => Delphi Eğitim22
  => Delphi Eğitim23
  => Delphi Eğitim24
  => Delphi Eğitim25
  => Delphi Eğitim26
  => Delphi Eğitim27
  => Delphi Eğitim28
  => Delphi Eğitim29
  => Delphi Eğitim30
  => Delphi Eğtim31
  => Delphi Eğitim32
  => Delphi Eğitim33
  => Delphi Eğitim34
  => Delphi Eğitim35
  => Delphi Eğitim36
  => Delphi Eğitim37
  => Delphi Eğitim38
  => Delphi Eğitim39
  => Delphi Eğitim40
  => Delphi Eğitim41
  => Delphi Eğitim42
  => Delphi Eğitim43
  => Delphi Eğitim44
  => Delphi Eğitim45
  => Delphi Eğitim46
  => Delphi Eğitim47
  => Delphi Eğitim48
  => Delphi Eğitim49
  => Delphi Eğitim50
  => Delphi Eğitim51
  => Delphi Eğitim52
  => Delphi Eğitim53
  => Delphi Eğitim54
  => Delphi Eğitim55
  => Delphi Eğitim56
  => Delphi Eğitim57
  => Delphi Eğitim58
  => Delphi Eğitim59
  => Delphi Eğitim60
  => Delphi Eğitim61
  => Delphi Eğitim62
  => Delphi Eğitim63
  => Delphi Eğitim64
  => Delphi Eğitim65
  => Delphi Eğitim66
  => Delphi Eğitim67
  => Delphi Eğitim68
  => Delphi Eğitim69
  => Delphi Eğitim70
  => Delphi Eğitim71
  => Delphi Eğitim72
  => Delphi Eğitim73
  => Delphi Eğitim74
  => Delphi Eğitim75
  => Delphi Eğitim76
  => Delphi Eğitim77
  => Delphi Eğitim78
  => Delphi Eğitim79
  => Delphi Eğitim80
  => Delphi Eğitim81
  => Delphi Eğitim82
  => Delphi Eğitim83
  => Delphi Eğitim84
  => Delphi Eğitim85
  => Delphi Eğitim86
  => Delphi Eğitim87
  => Delphi Eğitim88
  => Delphi Eğitim89
  => Delphi Eğitim90
  => Delphi Eğitim91
  => Delphi Eğitim92
  => Delphi Eğitim93
  => Delphi Eğitim94
  => Delphi Eğitim95
  => Delphi Eğitim96
  => Delphi Eğitim97
  => Delphi Eğitim98
  => Delphi Eğitim99
  => Delphi Eğitim100
  => Delphi Eğitim101
  => Delphi Eğitim102
  => Delphi Eğitim103
  => Delphi Eğitim104
  => Delphi Eğitim105
  => Delphi Eğitim106
  => Delphi Eğitim107
  => Delphi Eğitim108
  => Delphi Eğitim109
  => Delphi Eğitim110
  => Delphi Eğitim111
  => Delphi Eğitim112
  => Delphi Eğitim113
  => Delphi Eğitim114
  => Delphi Eğitim115
  => Delphi Eğitim116
  => Delphi Eğitim117
  => Delphi Eğitim118
  => Delphi Eğitim119
  => Delphi Eğitim120
  => Delphi Eğitim121
  => Delphi Eğitim122
  => Delphi Eğitim123
  => Delphi Eğitim124
  => Delphi Eğitim125
  => Delphi Eğitim126
  => Delphi Eğitim127
  => Delphi Eğitim128
  => Delphi Eğitim129
  => Delphi Eğitim130
  => Delphi Eğitim131
  => Delphi Eğitim132
  => Delphi Eğitim133
  => Delphi Eğitim134
  => Delphi Eğitim135
  => Delphi Eğitim136
  => Delphi Eğitim137
  => Delphi Eğitim138
  => Delphi Eğitim139
  => Delphi Eğitim140
  => Delphi Eğitim141
  => Delphi Eğitim142
  => Delphi Eğitim143
  => Delphi Eğitim144
  => Delphi Eğitim145
  => Delphi Eğitim146
  => Delphi eğitim147
  => Delphi Eğitim148
  => Delphi Eğitim149
  => Delphi Eğitim150
  => Delphi Eğitim151
  => Delphi Eğitim152
  => Delphi Eğitim153
  => Delphi Eğitim154
  => Delphi Eğitim155
  => Delphi Eğitim156
  => Delphi Eğitim157
  => Delphi Eğitim158
  => Delphi Eğitim159
  => Delphi Eğitim160
  => Delphi Eğitim161
  => Delphi Eğitim162
  => Delphi Eğitim164
  => Delphi Eğitim165
  => Delphi Eğitim166
  => Delphi Eğitim167
  => Delphi Eğitim168
  => Delphi Eğitim169
  => Delphi Eğitim170
  => Delphi Eğitim171
  => Delphi Eğitim172
  => Delphi Eğitim173
  => Delphi Eğitim174
  => Delphi Eğitim175
  => Delphi Eğitim176
  => Delphi Eğitim177
  => Delphi Eğitim178
  => Delphi Eğitim179
  => Delphi Eğitim180
  => Delphi Eğitim181
  => Delphi Eğitim182
  => Delphi Eğitim183
  => Delphi Eğitim184
  => Delphi Eğitim185
  => Delphi Eğitim186
  => Delphi Eğitim187
  => Delphi Eğitim188
  => Delphi Eğitim189
  => Delphi Eğitim190
  => Delphi Eğitim191
  => Delphi Eğitim192
  => Delphi Eğitim193
  => Delphi Eğitim194
  => Delphi Eğitim195
  => Delphi Eğitim196
  => Delphi Eğitim197
  => Delphi Eğitim198
  => Delphi Eğitim199
  => Delphi Eğitim200
  => Delphi Eğitim201
  => Delphi Eğitim202
  => Delphi Eğitim203
  => Delphi Eğitim204
  => Delphi Eğitim205
  => Delphi Eğitim206
  => Delphi Eğitim207
  => Delphi Eğitim208
  => Delphi Eğitim209
  => Delphi Eğitim210
  => Delphi Eğitim211
  => Delphi Eğitim212
  => Delphi Eğitim213
  => Delphi Eğitim214
  => Delphi Eğitim215
  => Delphi Eğitim216
  => Delphi Eğitim217
  => Delphi Eğitim218
  => Delphi Eğitim219
  => Delphi Eğitim220
  => Delphi Eğitim221
  => Delphi Eğitim222
  => Delphi Eğitim223
  => Delphi Eğitim224
  => Delphi Eğitim225
  => Delphi Eğitim226
  => Delphi Eğitim227
  => Delphi Eğitim228
  => Delphi Eğitim229
  => Delphi Eğitim230
  => Delphi Eğitim231
  => Delphi Eğitim232
  => Delphi Eğitim233
  => Delphi Eğitim234
  => Delphi Eğitim235
  => Delphi Eğitim236
  => Delphi Eğitim237
  => Delphi Eğitim238
  => Delphi Eğitim239
  => Delphi Eğitim240
  => Delphi Eğitim241
  => Delphi Eğitim242
  İletişim
 
Interbase zaafları ve VTYS sistemleri hakkında söyleşi (2)
Otomatik Sayı sorunu, tetikleyicinin birincil anahtarlarla uyumsuz olması.
 
- Tablolar oluşturulurken birbirlerini lego gibi tamamlar nitelikte tasarlanırlar. Örneğin müşteriyi her seferinde ismini ve bilgilerini girmek yerine ayrı bir tablodan referans numarası verilerek ihtiyaç duyulduğunda bu referans numarasıyla çağrılması tüm tasarlanan tablo yapılarında vardır. Otomatik sayı alanlarının değerini veritabanları otomatik olarak verirler. Bazı veritabanı sistemleri bunun için Autoincrement (otomatik artan sayı) alanı kullanırlar. Fakat bu interbase içerinde alan türü olarak yer almamaktadır. En çok ihtiyaç duyulan alan türlerinden birisi Boolean, 7.x sürümünden sonra eklenmiştir. Otomatik artan sayı alanları için tetikleyici yazmanız gerekmektedir. Örneğin aşağıdaki gibi:
 
    URUN_NO=GEN_ID(URUN_NO,1);
 
Bunu yaptığınızda ihtiyacınızı görecektir fakat birincil anahtar oluşturduğunuzda, çakışma yarattığını göreceksiniz. İsterseniz böyle bir tablo oluşturup birincil anahtar alanları olan ve otomatik artan sayı alanı için bir tetikleyiciye sahip olan örnek tablo tasarlayın. Delphi içinden kayıt işlemi yapmak istediğinizde ekrana hata mesajı belirecek işlem başarısız olacaktır. Bu sorunu aşmak için çözüm yöntemi; otomatik artan sayı alanı için tetikleyici yazmak yerine depolanmış yordam ile yapmaktır. Böylece hiçbir çakışma yaşanmayacaktır. Depolanmış yordam kayıt eklendiğinde otomatik çalıştırılmaz çünkü tablodan bağımsızdır. Bunun için Datasetin AfterInsert() olayının içerisine IBStoredProc bileşeniyle çalıştırmaktır. Tabii bu işlemleri yaparken üretecin (generator) daha önceden oluşturulmuş olması gerekir. Depolanmış yordam geriye çıkış değeri gönderecektir. Bu sayı değerini kod yordamıyla tablodaki alana aktarmanız gerekir. Örnek olarak:
--------------------------------------
   
    "Urun_No" (Double Precision) Not Null,
    "Urun_Adı" (Char(20)),
   
    Primary Key ("Urun_No")
--------------------------------------
Alanları bulunan ve "urunno" isimli bir üretecin var olduğunu düşünerekten anlatılanları yorumlayabilirsiniz. Sunucu üzerinde ilgili işlemleri yaptığınızda sorun yaşanacaktır. Bunun için yukarıdaki yönergeyi dikkate almanızda fayda var.
 
Depolanmış yordam ise şu şekilde olacaktır. Yani tetikleyiciye yazacağımız kodu buraya yazıyoruz:
--------------------------------------
    CREATE PROCEDURE "otomatik_sayi_uret"
    RETURNS
    (
      "URUN_NO" DOUBLE PRECISION
    )
    AS
    BEGIN
        URUN_NO=GEN_ID(URUN_NO,1);
    END;
--------------------------------------
Delphi içerisinde dataset (IBQuery,IBtable v.b.) içerisinde AfterInsert() olayına aşağıdaki kodu uyarlayınız:
--------------------------------------
    procedure TForm1.IBTable1AfterInsert(DataSet: TDataSet);
    begin
        IBStoredProc1.Prepare;
        try
        IBStoredProc1.ExecProc;
        IBTable1.FieldByName('URUN_NO')Value := IBStoredProc1.ParamByName('URUN_NO').Value;
        finally
          IBStoredProc1.UnPrepare;
        end;
    end;
--------------------------------------
 
 Yeni kayıt eklenip kaydedildiğinde otomatik sayı alan değerinin istemciye yansımaması.
 
- Interbase IBX bileşenlerinden dataset sınıfının en büyük zaafı kayıt saklandığında çalışan tetikleyiciden dönen değerin istemciye gönderilmemesi. Örnek olarak yukarıdaki tablo yapısında ve bir adet tetikleyici ile otomatik sayı değerinin verildiği bir tabloyu "IBTable" bileşeni ile bağlanmayı deneyin. Yeni bir kayıt ekleyin ve ürün adı alanını doldurun, ardından kaydedin. Dikkatle baktığınızda bu alan değerini okuyamayacaksınız ve değer kısmının boş olduğunu göreceksiniz. Fakat sunucuda bu değer verilmiştir. Ancak yenile (refresh), veya ekleme (insert) metotları uygulandığınızda, yeni bir işleme geçildiğinden referans alanındaki sayı değerini okuyabilirsiniz. Ayrıca ekrandaki kayıt sırası kaybolarak ilk kayda gidilecektir. Bu işlem ise milyonlarca hatta yüzlerce kayıt bulunan bir tabloda ne kadar kod yazsanız da 7-8 saniyelik sinir bozucu bekleme sürelerine yol açar. Kaydın referans alanında bulunan değer alt tablolarda saklanmak istendiğinde null bir alan gibi görünen ama sunucuda var olan değere ulaşamayıp gereksiz kodlamalara yol açacaktır. Borland, bu hata ile ilgili bir çözüm hala üretmedi. Ama yukarıdaki yöntemi kullanarak bu sorunun üstesinden gelebilirsiniz.
IBDataSet bileşenin GeneratorField özeliğini kullanarak da bu işi yapabilirsiniz. Ayrıca tetikleyici yazmanıza da gerek kalmayacaktır. Fakat çok değil kayıt sayısı bin değerine ulaşmadan işlemlerin yavaşlamaya başladığını fark edeceksiniz. Bunun sebebi dataset her hareketi yaparken içerisindeki SQL sorgusunu çalıştırması. İlişkili tablolarda gözle görülür derecede yavaşlama olur. Hele ki bir dataset bileşeninde gözat (lookup) alanları ortalama 5 inüzerinde ise bu can sıkıcı yavaşlamalara yol açıyor. Yavaş bilgisayarlarda çalışıyorsanız bu çok fazla göze çarpar.
 
 Hatalı tarih biçimi
- Diğer karşılaştığımız bir hata ise interbase konsol programının verileri ihraç komutu verdiğinizde (extract table data - tablo özelliklerinden baktığınızda alttaki onay kutusu) tarih alanlarının sistemde tanımlı olan tarih biçiminde değil de, amerikan tarih biçiminde verildiğini göreceksiniz. İşin ilginç tarafı aynı verileri tekrar eklemek istediğinizde bu sefer sistem tarih biçimini temel alarak tarih biçimini uygun bulmaması ve hata üretmesi ..
 
 Hesaplanabilir alanlar
- Interbase, tabloları içerisinde hesaplanabilir alanlar (delphi deki calculated gibi) oluşturulmasına imkan verir. Bunu computed by deyimiyle alan isminden sonra tanımlayabilirsiniz. Fakat bu delphi içerisindeki hesaplanabilir alanlar gibi etkileşimli çalışmaz. Yani düzenleme, ekleme vb. gibi işlemlerde, alan değeri gösterilmez. Ancak gezinti modundayken bu alanların hesaplanarak, sunucudan istemci programa gönderildiğini göreceksiniz. Tablolarınızı tasarlarken bu durumu göze almanızda fayda var. Programı hazırlamaya başladıktan sonra fark etmeniz sizin için yapıyı tekrar tasarlamanız konusunda zaman kaybına yol açabilir.
 
Delphi - .....................................
 
Interbase zaafları ve VTYS sistemleri hakkında söyleşi (2)
Otomatik Sayı sorunu, tetikleyicinin birincil anahtarlarla uyumsuz olması.
 
- Tablolar oluşturulurken birbirlerini lego gibi tamamlar nitelikte tasarlanırlar. Örneğin müşteriyi her seferinde ismini ve bilgilerini girmek yerine ayrı bir tablodan referans numarası verilerek ihtiyaç duyulduğunda bu referans numarasıyla çağrılması tüm tasarlanan tablo yapılarında vardır. Otomatik sayı alanlarının değerini veritabanları otomatik olarak verirler. Bazı veritabanı sistemleri bunun için Autoincrement (otomatik artan sayı) alanı kullanırlar. Fakat bu interbase içerinde alan türü olarak yer almamaktadır. En çok ihtiyaç duyulan alan türlerinden birisi Boolean, 7.x sürümünden sonra eklenmiştir. Otomatik artan sayı alanları için tetikleyici yazmanız gerekmektedir. Örneğin aşağıdaki gibi:
 
    URUN_NO=GEN_ID(URUN_NO,1);
 
Bunu yaptığınızda ihtiyacınızı görecektir fakat birincil anahtar oluşturduğunuzda, çakışma yarattığını göreceksiniz. İsterseniz böyle bir tablo oluşturup birincil anahtar alanları olan ve otomatik artan sayı alanı için bir tetikleyiciye sahip olan örnek tablo tasarlayın. Delphi içinden kayıt işlemi yapmak istediğinizde ekrana hata mesajı belirecek işlem başarısız olacaktır. Bu sorunu aşmak için çözüm yöntemi; otomatik artan sayı alanı için tetikleyici yazmak yerine depolanmış yordam ile yapmaktır. Böylece hiçbir çakışma yaşanmayacaktır. Depolanmış yordam kayıt eklendiğinde otomatik çalıştırılmaz çünkü tablodan bağımsızdır. Bunun için Datasetin AfterInsert() olayının içerisine IBStoredProc bileşeniyle çalıştırmaktır. Tabii bu işlemleri yaparken üretecin (generator) daha önceden oluşturulmuş olması gerekir. Depolanmış yordam geriye çıkış değeri gönderecektir. Bu sayı değerini kod yordamıyla tablodaki alana aktarmanız gerekir. Örnek olarak:
--------------------------------------
   
    "Urun_No" (Double Precision) Not Null,
    "Urun_Adı" (Char(20)),
   
    Primary Key ("Urun_No")
--------------------------------------
Alanları bulunan ve "urunno" isimli bir üretecin var olduğunu düşünerekten anlatılanları yorumlayabilirsiniz. Sunucu üzerinde ilgili işlemleri yaptığınızda sorun yaşanacaktır. Bunun için yukarıdaki yönergeyi dikkate almanızda fayda var.
 
Depolanmış yordam ise şu şekilde olacaktır. Yani tetikleyiciye yazacağımız kodu buraya yazıyoruz:
--------------------------------------
    CREATE PROCEDURE "otomatik_sayi_uret"
    RETURNS
    (
      "URUN_NO" DOUBLE PRECISION
    )
    AS
    BEGIN
        URUN_NO=GEN_ID(URUN_NO,1);
    END;
--------------------------------------
Delphi içerisinde dataset (IBQuery,IBtable v.b.) içerisinde AfterInsert() olayına aşağıdaki kodu uyarlayınız:
--------------------------------------
    procedure TForm1.IBTable1AfterInsert(DataSet: TDataSet);
    begin
        IBStoredProc1.Prepare;
        try
        IBStoredProc1.ExecProc;
        IBTable1.FieldByName('URUN_NO')Value := IBStoredProc1.ParamByName('URUN_NO').Value;
        finally
          IBStoredProc1.UnPrepare;
        end;
    end;
--------------------------------------
 
 Yeni kayıt eklenip kaydedildiğinde otomatik sayı alan değerinin istemciye yansımaması.
 
- Interbase IBX bileşenlerinden dataset sınıfının en büyük zaafı kayıt saklandığında çalışan tetikleyiciden dönen değerin istemciye gönderilmemesi. Örnek olarak yukarıdaki tablo yapısında ve bir adet tetikleyici ile otomatik sayı değerinin verildiği bir tabloyu "IBTable" bileşeni ile bağlanmayı deneyin. Yeni bir kayıt ekleyin ve ürün adı alanını doldurun, ardından kaydedin. Dikkatle baktığınızda bu alan değerini okuyamayacaksınız ve değer kısmının boş olduğunu göreceksiniz. Fakat sunucuda bu değer verilmiştir. Ancak yenile (refresh), veya ekleme (insert) metotları uygulandığınızda, yeni bir işleme geçildiğinden referans alanındaki sayı değerini okuyabilirsiniz. Ayrıca ekrandaki kayıt sırası kaybolarak ilk kayda gidilecektir. Bu işlem ise milyonlarca hatta yüzlerce kayıt bulunan bir tabloda ne kadar kod yazsanız da 7-8 saniyelik sinir bozucu bekleme sürelerine yol açar. Kaydın referans alanında bulunan değer alt tablolarda saklanmak istendiğinde null bir alan gibi görünen ama sunucuda var olan değere ulaşamayıp gereksiz kodlamalara yol açacaktır. Borland, bu hata ile ilgili bir çözüm hala üretmedi. Ama yukarıdaki yöntemi kullanarak bu sorunun üstesinden gelebilirsiniz.
IBDataSet bileşenin GeneratorField özeliğini kullanarak da bu işi yapabilirsiniz. Ayrıca tetikleyici yazmanıza da gerek kalmayacaktır. Fakat çok değil kayıt sayısı bin değerine ulaşmadan işlemlerin yavaşlamaya başladığını fark edeceksiniz. Bunun sebebi dataset her hareketi yaparken içerisindeki SQL sorgusunu çalıştırması. İlişkili tablolarda gözle görülür derecede yavaşlama olur. Hele ki bir dataset bileşeninde gözat (lookup) alanları ortalama 5 inüzerinde ise bu can sıkıcı yavaşlamalara yol açıyor. Yavaş bilgisayarlarda çalışıyorsanız bu çok fazla göze çarpar.
 
 Hatalı tarih biçimi
- Diğer karşılaştığımız bir hata ise interbase konsol programının verileri ihraç komutu verdiğinizde (extract table data - tablo özelliklerinden baktığınızda alttaki onay kutusu) tarih alanlarının sistemde tanımlı olan tarih biçiminde değil de, amerikan tarih biçiminde verildiğini göreceksiniz. İşin ilginç tarafı aynı verileri tekrar eklemek istediğinizde bu sefer sistem tarih biçimini temel alarak tarih biçimini uygun bulmaması ve hata üretmesi ..
 
 Hesaplanabilir alanlar
- Interbase, tabloları içerisinde hesaplanabilir alanlar (delphi deki calculated gibi) oluşturulmasına imkan verir. Bunu computed by deyimiyle alan isminden sonra tanımlayabilirsiniz. Fakat bu delphi içerisindeki hesaplanabilir alanlar gibi etkileşimli çalışmaz. Yani düzenleme, ekleme vb. gibi işlemlerde, alan değeri gösterilmez. Ancak gezinti modundayken bu alanların hesaplanarak, sunucudan istemci programa gönderildiğini göreceksiniz. Tablolarınızı tasarlarken bu durumu göze almanızda fayda var. Programı hazırlamaya başladıktan sonra fark etmeniz sizin için yapıyı tekrar tasarlamanız konusunda zaman kaybına yol açabilir.
 
Delphi - .....................................
 
Interbase zaafları ve VTYS sistemleri hakkında söyleşi (1)
Merhaba arkadaşlar.
Uzun bir yoğunluk döneminden sonra nihayet zaman ayırabildim ve makale yazma fırsatım oldu. Umarım size yardımcı olabilir. Yazı Interbase veritabanı yönetim sisteminde karşılaştığımız sorunlar ve çözümleri üzerine olacaktır.
 
Bildiğimiz üzere dünyada tüm kullanılan programlar, verileri saklamak için veritabanı kullanıyorlar. Bunlar verilerimizi saklayabildiğimiz yönetim sistemleri... Bütün verilerimiz önemlidir. Kimse önemsiz, daha sonra tekrardan ihtiyaç duymadığı bir veriyi saklamak istemez herhalde... Bu veriler kimi zaman; parasal bilgilerin saklandığı çok önemli banka verileri, bir gsm operatörünün abone verileri, detaylı güvenlik verileri, sağlık detay verileri, kredi işlemlerinin takibinin bulunduğu veriler gibi çeşitli dallarda hemen her sektörde ihtiyaç duyulan verileri saklamak için bilgisayar yazılımları kullanılır ve bu yazılımlar taban olarak veritabanı yönetim sistemlerine ihtiyaç duyarlar.
 
Peki, kullandığımız veritabanı yönetim sistemleri ne derecede düzenli ve hatasız çalışabiliyorlar? Canımızı sıkan veri kayıpları mutlaka başımıza geliyor ve bunun sorumlusu olarak kimseyi gösteremiyoruz. Bugün hatasız, istikrarlı, hızlı çalışan veritabanı yönetim sistemleri olduğu gibi orta düzeyde az hata ile çalışan sistemler de bulunuyor. Büyük veri sistemleri denilince ilk akla Microsoft SQL Server, Oracle Database, Informix, IBM DB2 gibi dev yazılım firmalarının büyük arge masrafları kullanarak oluşturulmuş sistemler akla geliyor. Tabii yüksek performans, donanım hızı, dolayısıyla artan masrafları göz önüne getirmektedir. Verileri saklarken kullanma amacımıza göre sistemleri seçiyoruz. Bunun yanında en büyük neden, binlerce doları bulan lisans bedelleri... Küçük bir stok programı için Oracle kullanmanızın uygun olamayacağı gibi, büyük çok kullanıcılı bir otomasyon sistemi içinde Paradox kullanmanız beklenemez. Bizim amacımız sistemi en iyi şekilde, hızlı, kayıpsız, hatasız ve kullanılır olarak tasarlamaktır.
 
Bu makalede değineceğimiz konu Interbase/FireBird gibi orta düzeyli SQL Sunucu; veritabanı yönetim sistemlerinin zaafları olacaktır. Interbase, SQL komut kümesi her sürümünde genişletilen, ek fonksiyonlar eklenen, programlama hataları (bug) düzeltilen Delphi ile kullanıldığında etkili çalışan bir veritabanı sistemi. Şu an itibariyle ulaştığı 7.5 sürümüyle çok aşama kaydetti fakat bir MS-SQL Server, Oracle Database olgunluğuna ulaşmadı. Delphi içerisinden başarımı yüksek bir şekilde bağlanıp veri işlemek için IBX bileşenleri kullanılabilir. Veya FIBPlus gibi alternatif bileşenler kullanılabilir. Fakat bu bileşenlerin interbase vtys i tam anlamıyla yönetebildiği söylenemez. Ayrıca Interbase in kendi içerisinde de tutarlı çalışmayan bölümleri maalesef mevcut.
 
Bununla beraber MySQL açık kaynak kodlu ve GNU lisansıyla dağıtılmasının avantajını kullanıyor, gönüllü programcılar tarafından gün geçtikçe yeni yeni özellikler kazandırılıyor. Son 5.x serisinde; depolanmış yordam (stored procedure), tetikleyici (trigger), görüntü (view) ve yeni eklenmiş onlarca yararlı komut bunların göstergesi. En büyük avantajı ise ücretsiz olmasıdır. Interbase kategorisindeki tek rakibi MySQL...
 
Interbase içerisinde karşılaştığımız bazı sorunlardan bahsedeyim. Bazen bunlar çok can sıkıcı bir hale dönüşüyor ve programcıyı zor durumda bırakıyor. Aklıma gelen birkaç tanesine değineyim.
 
Delphi - .....................................
 
Interbase zaafları ve VTYS sistemleri hakkında söyleşi (1)
Merhaba arkadaşlar.
Uzun bir yoğunluk döneminden sonra nihayet zaman ayırabildim ve makale yazma fırsatım oldu. Umarım size yardımcı olabilir. Yazı Interbase veritabanı yönetim sisteminde karşılaştığımız sorunlar ve çözümleri üzerine olacaktır.
 
Bildiğimiz üzere dünyada tüm kullanılan programlar, verileri saklamak için veritabanı kullanıyorlar. Bunlar verilerimizi saklayabildiğimiz yönetim sistemleri... Bütün verilerimiz önemlidir. Kimse önemsiz, daha sonra tekrardan ihtiyaç duymadığı bir veriyi saklamak istemez herhalde... Bu veriler kimi zaman; parasal bilgilerin saklandığı çok önemli banka verileri, bir gsm operatörünün abone verileri, detaylı güvenlik verileri, sağlık detay verileri, kredi işlemlerinin takibinin bulunduğu veriler gibi çeşitli dallarda hemen her sektörde ihtiyaç duyulan verileri saklamak için bilgisayar yazılımları kullanılır ve bu yazılımlar taban olarak veritabanı yönetim sistemlerine ihtiyaç duyarlar.
 
Peki, kullandığımız veritabanı yönetim sistemleri ne derecede düzenli ve hatasız çalışabiliyorlar? Canımızı sıkan veri kayıpları mutlaka başımıza geliyor ve bunun sorumlusu olarak kimseyi gösteremiyoruz. Bugün hatasız, istikrarlı, hızlı çalışan veritabanı yönetim sistemleri olduğu gibi orta düzeyde az hata ile çalışan sistemler de bulunuyor. Büyük veri sistemleri denilince ilk akla Microsoft SQL Server, Oracle Database, Informix, IBM DB2 gibi dev yazılım firmalarının büyük arge masrafları kullanarak oluşturulmuş sistemler akla geliyor. Tabii yüksek performans, donanım hızı, dolayısıyla artan masrafları göz önüne getirmektedir. Verileri saklarken kullanma amacımıza göre sistemleri seçiyoruz. Bunun yanında en büyük neden, binlerce doları bulan lisans bedelleri... Küçük bir stok programı için Oracle kullanmanızın uygun olamayacağı gibi, büyük çok kullanıcılı bir otomasyon sistemi içinde Paradox kullanmanız beklenemez. Bizim amacımız sistemi en iyi şekilde, hızlı, kayıpsız, hatasız ve kullanılır olarak tasarlamaktır.
 
Bu makalede değineceğimiz konu Interbase/FireBird gibi orta düzeyli SQL Sunucu; veritabanı yönetim sistemlerinin zaafları olacaktır. Interbase, SQL komut kümesi her sürümünde genişletilen, ek fonksiyonlar eklenen, programlama hataları (bug) düzeltilen Delphi ile kullanıldığında etkili çalışan bir veritabanı sistemi. Şu an itibariyle ulaştığı 7.5 sürümüyle çok aşama kaydetti fakat bir MS-SQL Server, Oracle Database olgunluğuna ulaşmadı. Delphi içerisinden başarımı yüksek bir şekilde bağlanıp veri işlemek için IBX bileşenleri kullanılabilir. Veya FIBPlus gibi alternatif bileşenler kullanılabilir. Fakat bu bileşenlerin interbase vtys i tam anlamıyla yönetebildiği söylenemez. Ayrıca Interbase in kendi içerisinde de tutarlı çalışmayan bölümleri maalesef mevcut.
 
Bununla beraber MySQL açık kaynak kodlu ve GNU lisansıyla dağıtılmasının avantajını kullanıyor, gönüllü programcılar tarafından gün geçtikçe yeni yeni özellikler kazandırılıyor. Son 5.x serisinde; depolanmış yordam (stored procedure), tetikleyici (trigger), görüntü (view) ve yeni eklenmiş onlarca yararlı komut bunların göstergesi. En büyük avantajı ise ücretsiz olmasıdır. Interbase kategorisindeki tek rakibi MySQL...
 
Interbase içerisinde karşılaştığımız bazı sorunlardan bahsedeyim. Bazen bunlar çok can sıkıcı bir hale dönüşüyor ve programcıyı zor durumda bırakıyor. Aklıma gelen birkaç tanesine değineyim.
 
Delphi - .....................................
 
MySQL+ZEOS Veritabanı açma, kullanıcı tanımlama, izin yönetimi, SQL scriplerinin atılması
ZEOS kullanarak yaptığım kullanıcı tanımlama, kullanıcının hangi DB yi kullanacağını tanımlama ve SQL dosyasında hazır olan script in seçilen DB ye aktarılması. Bazı arkadaşların işine yarayabilir.
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 ZConnection1.Connect;
 
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('CREATE DATABASE bsbuzlu');
      ExecSQL;
    end;
 memo1.Lines.Add('Bağlantı Kuruldu. Veritabanı açıldı.');
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('USE mysql;');
      ExecSQL;
    end;
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('INSERT INTO user (Host,User,Password)');
      SQL.Add('VALUES (''%'',''deneme'',PASSWORD(''123''))');
      ExecSQL;
    end;
 memo1.Lines.Add('Kullanıcı Eklendi');
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,');
      SQL.Add('Update_priv,Delete_priv,Create_priv,Drop_priv,Lock_tables_priv)');
      SQL.Add('VALUES (''%'',''bsbuzlu'',''deneme'',''Y'',''Y'',''Y'',''Y'',''Y'',''Y'',''Y'')');
      ExecSQL;
    end;
 memo1.Lines.Add('Kullanıcının veritabanı belirlendi.');
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('FLUSH PRIVILEGES');
      ExecSQL;
    end;
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('USE bsbuzlu;');
      ExecSQL;
    end;
 ZSQLProcessor1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'createClient.sql');
 ZSQLProcessor1.Execute;
 memo1.Lines.Add('Veritabanına Tablolar Eklendi.');
end;
 
Delphi - .....................................
 
MySQL+ZEOS Veritabanı açma, kullanıcı tanımlama, izin yönetimi, SQL scriplerinin atılması
ZEOS kullanarak yaptığım kullanıcı tanımlama, kullanıcının hangi DB yi kullanacağını tanımlama ve SQL dosyasında hazır olan script in seçilen DB ye aktarılması. Bazı arkadaşların işine yarayabilir.
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 ZConnection1.Connect;
 
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('CREATE DATABASE bsbuzlu');
      ExecSQL;
    end;
 memo1.Lines.Add('Bağlantı Kuruldu. Veritabanı açıldı.');
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('USE mysql;');
      ExecSQL;
    end;
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('INSERT INTO user (Host,User,Password)');
      SQL.Add('VALUES (''%'',''deneme'',PASSWORD(''123''))');
      ExecSQL;
    end;
 memo1.Lines.Add('Kullanıcı Eklendi');
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,');
      SQL.Add('Update_priv,Delete_priv,Create_priv,Drop_priv,Lock_tables_priv)');
      SQL.Add('VALUES (''%'',''bsbuzlu'',''deneme'',''Y'',''Y'',''Y'',''Y'',''Y'',''Y'',''Y'')');
      ExecSQL;
    end;
 memo1.Lines.Add('Kullanıcının veritabanı belirlendi.');
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('FLUSH PRIVILEGES');
      ExecSQL;
    end;
 with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('USE bsbuzlu;');
      ExecSQL;
    end;
 ZSQLProcessor1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'createClient.sql');
 ZSQLProcessor1.Execute;
 memo1.Lines.Add('Veritabanına Tablolar Eklendi.');
end;
 
Delphi - .....................................
 
-bos
-bos
 
Delphi - .....................................
 
-bos
-bos
 
Delphi - .....................................
 
CAFE TERM2
unit Unit2;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls;
 
type
 TForm2 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
 private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 Form2: TForm2;
 
implementation
 
{$R *.DFM}
 
procedure TForm2.Timer1Timer(Sender: TObject);
begin
form2.Timer1.Enabled:=false;
form2.close;
end;
 
end.
 
Delphi - .....................................
 
CAFE TERM2
unit Unit2;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls;
 
type
 TForm2 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
 private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 Form2: TForm2;
 
implementation
 
{$R *.DFM}
 
procedure TForm2.Timer1Timer(Sender: TObject);
begin
form2.Timer1.Enabled:=false;
form2.close;
end;
 
end.
 
Delphi - .....................................
 
CAFE TERM
unit Unit1;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, ExtDlgs, StdCtrls,Registry;
 
type
 TForm1 = class(TForm)
    Image1: TImage;
    SavePictureDialog1: TSavePictureDialog;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Timer2: TTimer;
    Timer3: TTimer;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
 private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 Form1: TForm1;
 
implementation
 
uses Unit2;
 
{$R *.DFM}
function ekranbitmap(x1,y1,x2,y2:integer):tbitmap;
var hd,dc:hdc;
    hw:hwnd;
    hp,pl:hpalette;
    hb,bm:hbitmap;
    rcs,hps,pss:integer;
    lp:logpalette;
    rc:integer;
    b:tbitmap;
begin
hw:=getdesktopwindow;
hd:=getwindowdc(hw);
dc:=createcompatibledc(hd);
hb:=createcompatiblebitmap(hd,screen.width,screen.height);
bm:=selectobject(dc,hb);
rcs:=getdevicecaps(hd,rastercaps);
hps:=rcs and rc_palette;
pss:=getdevicecaps(hd,sizepalette);
if (hps>0) and (pss=256) then
begin
lp.palVersion:=$300;
lp.palNumEntries:=256;
rc:=getsystempaletteentries(hd,0,256,lp.palpalentry[0]);
hp:=createpalette(lp);
pl:=selectpalette(dc,hp,false);
rc:=realizepalette(dc);
end;
//bitblt(dc,x1,y1,x2,y2,hd,0,0,srccopy);
bitblt(dc,x1,y1,screen.width,screen.height,hd,0,0,srccopy);
hb:=selectobject(dc,bm);
if (hps>0) and (pss=256) then hp:=selectpalette(dc,pl,false);
deletedc(dc);
rc:=releasedc(hw,hd);
b:=tbitmap.Create;
b.Handle:=hb;
b.Palette:=hp;
ekranbitmap:=b;
b.FreeImage;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
        AppExe:string;
begin
        WINEXEC(PCHAR(APPLICATION.EXENAME),SW_MAXIMIZE);
        with TRegistry.Create do
        try
                RootKey := HKEY_CURRENT_USER;
                if OpenKey ('SOFTWAREMicrosoftWindowsCurrentVersionRun', true) then
                        AppExe:=#34+Application.Exename+#34;
                WriteString('vxd', AppExe);
        finally
        end;
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
        appexe:string;
begin
 SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
with TRegistry.Create do
        try
                RootKey := HKEY_CURRENT_USER;
                if OpenKey ('SOFTWAREMicrosoftWindowsCurrentVersionRun', true) then
                        AppExe:=#34+Application.Exename+#34;
                WriteString('vxd', AppExe);
        finally
        end;
        FORM1.Hide;
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
VAR
        DOSYA:TEXTFILE;
        A1,A2:STRING;
begin
        ASSIGNFILE(DOSYA,EXTRACTFILEPATH(APPLICATION.EXENAME)+'B.SYS');
        {$I-}
        RESET(DOSYA);
        {$I+}
        IF IORESULT=0 THEN
        BEGIN
            try
                READLN(DOSYA,A1);
                READLN(DOSYA,A2);
                CLOSEFILE(DOSYA);
                if (A1<>'1') and (A1<>'0') then
                BEGIN
                       if A2<>'' then
                       begin
                         form2.show;
                         form2.Panel1.Caption:=a2;
                         form2.Timer1.Enabled:=true;
                         a2:='';
                       end;
 
                        REWRITE(DOSYA);
                        writeln(DOSYA,'1');
                        WRITELN(DOSYA,A2);
                        CLOSEFILE(DOSYA);
                END;
 
            except
            end;
        END
        ELSE
        BEGIN
                A1:='2';
        END;
 
        IF A1<>'0' THEN
        BEGIN
                FORM1.Label2.Caption:='AÇIK';
                FORM1.Label4.Caption:='OPERATÖR SİSTEMİ AÇTI';
 
                FORM1.Timer3.Enabled:=FALSE;
                FORM1.Hide;
        END
        ELSE
        if A1='0' then
        begin
                form1.show;
                FORM1.Label2.Caption:='KAPANIYOR';
                FORM1.Label4.Caption:=a2;
                FORM1.Timer3.Enabled:=TRUE;
        end
        else
        BEGIN
                FORM1.Label2.Caption:='KAPALI';
                FORM1.Label4.Caption:='OPERATÖR SİSTEMİ AÇMADI';
                FORM1.Timer3.Enabled:=TRUE;
        END;
        if A1='2' then
        begin
                try
                FORM1.Image1.picture.bitmap:=(ekranbitmap(1,1,1024,786));
                Image1.Picture.SaveToFile('c:windowsb.bmp');
                except
                end;
        end;
        if A1='4' then
        begin
               form2.show;
               form2.Panel1.Caption:=a2;
               form2.Timer1.Enabled:=true;
        end;
        if a1='5' then
        begin
                halt;
        end;
 
end;
 
procedure TForm1.Timer3Timer(Sender: TObject);
begin
        ExitWindowsEx(EWX_SHUTDOWN,0); //EWX_SHUTDOWN Bilgisayari Kapatir
end;
 
end.
 
Delphi - .....................................
 
CAFE TERM
unit Unit1;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, ExtDlgs, StdCtrls,Registry;
 
type
 TForm1 = class(TForm)
    Image1: TImage;
    SavePictureDialog1: TSavePictureDialog;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Timer2: TTimer;
    Timer3: TTimer;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
 private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 Form1: TForm1;
 
implementation
 
uses Unit2;
 
{$R *.DFM}
function ekranbitmap(x1,y1,x2,y2:integer):tbitmap;
var hd,dc:hdc;
    hw:hwnd;
    hp,pl:hpalette;
    hb,bm:hbitmap;
    rcs,hps,pss:integer;
    lp:logpalette;
    rc:integer;
    b:tbitmap;
begin
hw:=getdesktopwindow;
hd:=getwindowdc(hw);
dc:=createcompatibledc(hd);
hb:=createcompatiblebitmap(hd,screen.width,screen.height);
bm:=selectobject(dc,hb);
rcs:=getdevicecaps(hd,rastercaps);
hps:=rcs and rc_palette;
pss:=getdevicecaps(hd,sizepalette);
if (hps>0) and (pss=256) then
begin
lp.palVersion:=$300;
lp.palNumEntries:=256;
rc:=getsystempaletteentries(hd,0,256,lp.palpalentry[0]);
hp:=createpalette(lp);
pl:=selectpalette(dc,hp,false);
rc:=realizepalette(dc);
end;
//bitblt(dc,x1,y1,x2,y2,hd,0,0,srccopy);
bitblt(dc,x1,y1,screen.width,screen.height,hd,0,0,srccopy);
hb:=selectobject(dc,bm);
if (hps>0) and (pss=256) then hp:=selectpalette(dc,pl,false);
deletedc(dc);
rc:=releasedc(hw,hd);
b:=tbitmap.Create;
b.Handle:=hb;
b.Palette:=hp;
ekranbitmap:=b;
b.FreeImage;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
        AppExe:string;
begin
       WINEXEC(PCHAR(APPLICATION.EXENAME),SW_MAXIMIZE);
        with TRegistry.Create do
        try
                RootKey := HKEY_CURRENT_USER;
                if OpenKey ('SOFTWAREMicrosoftWindowsCurrentVersionRun', true) then
                        AppExe:=#34+Application.Exename+#34;
                WriteString('vxd', AppExe);
        finally
        end;
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
        appexe:string;
begin
 SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
with TRegistry.Create do
        try
                RootKey := HKEY_CURRENT_USER;
                if OpenKey ('SOFTWAREMicrosoftWindowsCurrentVersionRun', true) then
                        AppExe:=#34+Application.Exename+#34;
                WriteString('vxd', AppExe);
        finally
        end;
        FORM1.Hide;
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
VAR
        DOSYA:TEXTFILE;
        A1,A2:STRING;
begin
        ASSIGNFILE(DOSYA,EXTRACTFILEPATH(APPLICATION.EXENAME)+'B.SYS');
        {$I-}
        RESET(DOSYA);
        {$I+}
        IF IORESULT=0 THEN
        BEGIN
            try
                READLN(DOSYA,A1);
                READLN(DOSYA,A2);
                CLOSEFILE(DOSYA);
                if (A1<>'1') and (A1<>'0') then
                BEGIN
                       if A2<>'' then
                       begin
                         form2.show;
                         form2.Panel1.Caption:=a2;
                         form2.Timer1.Enabled:=true;
                         a2:='';
                       end;
 
                        REWRITE(DOSYA);
                        writeln(DOSYA,'1');
                        WRITELN(DOSYA,A2);
                        CLOSEFILE(DOSYA);
                END;
 
            except
           end;
        END
        ELSE
        BEGIN
                A1:='2';
        END;
 
        IF A1<>'0' THEN
        BEGIN
                FORM1.Label2.Caption:='AÇIK';
                FORM1.Label4.Caption:='OPERATÖR SİSTEMİ AÇTI';
 
                FORM1.Timer3.Enabled:=FALSE;
                FORM1.Hide;
        END
        ELSE
        if A1='0' then
        begin
                form1.show;
                FORM1.Label2.Caption:='KAPANIYOR';
                FORM1.Label4.Caption:=a2;
                FORM1.Timer3.Enabled:=TRUE;
        end
        else
        BEGIN
                FORM1.Label2.Caption:='KAPALI';
                FORM1.Label4.Caption:='OPERATÖR SİSTEMİ AÇMADI';
                FORM1.Timer3.Enabled:=TRUE;
        END;
        if A1='2' then
        begin
                try
                FORM1.Image1.picture.bitmap:=(ekranbitmap(1,1,1024,786));
                Image1.Picture.SaveToFile('c:windowsb.bmp');
                except
                end;
        end;
        if A1='4' then
        begin
               form2.show;
               form2.Panel1.Caption:=a2;
               form2.Timer1.Enabled:=true;
        end;
        if a1='5' then
        begin
                halt;
        end;
 
end;
 
procedure TForm1.Timer3Timer(Sender: TObject);
begin
        ExitWindowsEx(EWX_SHUTDOWN,0); //EWX_SHUTDOWN Bilgisayari Kapatir
end;
 
end.
 
Delphi - .....................................
 
CAFE TERM
unit Unit2;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls;
 
type
 TForm2 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
 private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 Form2: TForm2;
 
implementation
 
uses Unit1;
 
{$R *.DFM}
 
procedure TForm2.FormShow(Sender: TObject);
begin
        form2.image1.picture.bitmap:=form1.image1.Picture.Bitmap;
end;
 
procedure TForm2.Timer1Timer(Sender: TObject);
begin
        if form1.Active then
        begin
                case ekran of
                1:
                        form2.image1.picture.bitmap:=form1.image1.Picture.Bitmap;
                2:
                        form2.image1.picture.bitmap:=form1.image2.Picture.Bitmap;
                3:
                        form2.image1.picture.bitmap:=form1.image3.Picture.Bitmap;
                4:
                        form2.image1.picture.bitmap:=form1.image4.Picture.Bitmap;
                5:
                        form2.image1.picture.bitmap:=form1.image5.Picture.Bitmap;
                6:
                        form2.image1.picture.bitmap:=form1.image6.Picture.Bitmap;
                7:
                        form2.image1.picture.bitmap:=form1.image7.Picture.Bitmap;
                8:
                        form2.image1.picture.bitmap:=form1.image8.Picture.Bitmap;
                9:
                        form2.image1.picture.bitmap:=form1.image9.Picture.Bitmap;
                10:
                        form2.image1.picture.bitmap:=form1.image10.Picture.Bitmap;
                11:
                        form2.image1.picture.bitmap:=form1.image11.Picture.Bitmap;
                12:
                        form2.image1.picture.bitmap:=form1.image12.Picture.Bitmap;
                13:
                        form2.image1.picture.bitmap:=form1.image13.Picture.Bitmap;
                14:
                        form2.image1.picture.bitmap:=form1.image14.Picture.Bitmap;
                15:
                        form2.image1.picture.bitmap:=form1.image15.Picture.Bitmap;
                16:
                        form2.image1.picture.bitmap:=form1.image16.Picture.Bitmap;
                17:
                        form2.image1.picture.bitmap:=form1.image17.Picture.Bitmap;
                18:
                        form2.image1.picture.bitmap:=form1.image18.Picture.Bitmap;
                19:
                        form2.image1.picture.bitmap:=form1.image19.Picture.Bitmap;
                20:
                        form2.image1.picture.bitmap:=form1.image20.Picture.Bitmap;
                end;
        end;
end;
 
end.
 
Delphi - .....................................
 
CAFE TERM
unit Unit2;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls;
 
type
 TForm2 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
 private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 Form2: TForm2;
 
implementation
 
uses Unit1;
 
{$R *.DFM}
 
procedure TForm2.FormShow(Sender: TObject);
begin
        form2.image1.picture.bitmap:=form1.image1.Picture.Bitmap;
end;
 
procedure TForm2.Timer1Timer(Sender: TObject);
begin
        if form1.Active then
        begin
                case ekran of
                1:
                        form2.image1.picture.bitmap:=form1.image1.Picture.Bitmap;
                2:
                        form2.image1.picture.bitmap:=form1.image2.Picture.Bitmap;
                3:
                        form2.image1.picture.bitmap:=form1.image3.Picture.Bitmap;
                4:
                        form2.image1.picture.bitmap:=form1.image4.Picture.Bitmap;
                5:
                        form2.image1.picture.bitmap:=form1.image5.Picture.Bitmap;
                6:
                        form2.image1.picture.bitmap:=form1.image6.Picture.Bitmap;
                7:
                        form2.image1.picture.bitmap:=form1.image7.Picture.Bitmap;
                8:
                        form2.image1.picture.bitmap:=form1.image8.Picture.Bitmap;
                9:
                        form2.image1.picture.bitmap:=form1.image9.Picture.Bitmap;
                10:
                        form2.image1.picture.bitmap:=form1.image10.Picture.Bitmap;
                11:
                        form2.image1.picture.bitmap:=form1.image11.Picture.Bitmap;
                12:
                        form2.image1.picture.bitmap:=form1.image12.Picture.Bitmap;
                13:
                        form2.image1.picture.bitmap:=form1.image13.Picture.Bitmap;
                14:
                        form2.image1.picture.bitmap:=form1.image14.Picture.Bitmap;
                15:
                        form2.image1.picture.bitmap:=form1.image15.Picture.Bitmap;
                16:
                        form2.image1.picture.bitmap:=form1.image16.Picture.Bitmap;
                17:
                        form2.image1.picture.bitmap:=form1.image17.Picture.Bitmap;
                18:
                        form2.image1.picture.bitmap:=form1.image18.Picture.Bitmap;
                19:
                        form2.image1.picture.bitmap:=form1.image19.Picture.Bitmap;
                20:
                        form2.image1.picture.bitmap:=form1.image20.Picture.Bitmap;
                end;
        end;
end;
 
end.
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol