Merhaba

Pamukkale Teknokent de gerçekleştireceğimiz eğitimde 0 dan mobil programlama giriş eğitimler başlıyor.

Sizde aşağıdaki linlten hemen başvuru yapabilirsiniz.

 

Kurs katılımcılarının RadStudio  kurulu  1 adet notebook  ve test için 1 adet android cihaz bulundurmaları gerkmektedir.

 

 

 

https://docs.google.com/forms/d/1sxUyQSkVB4EEXCgR_S33FjwRQn3wg9ksKwi9qgTht-E/prefill

 

 

Delphi (VCL) ile veri tabanı işlemleri - 2

https://www.youtube.com/watch?v=QQEo5SxTW7A

Delphide rapor tool’u olarak kullanabileceğiniz çok sayıda araç bulunmaktadır. Biz FastReport ile örnek gerçekleştireceğiz. Örneğimizi bir önceki yazımızda yaptığımız örneğin üzerine devam ederek gerçekleştireceğiz.

Önceki örneğimizde bir adet FDConnection ile mssql veritabanına bağlantı kurmuştuk. Veri tabanımızda kayıt ve hareket isimli iki adet tablomuz vardı. Kayıt tablomuzu master , hareket tablomuzuda detail olarak ayarlamıştık.

Bu örneğimizde projemize raporlama işlemi ekleyeceğiz. Bunun için bir adet button ekliyoruz. Button1 > caption> Yazdır. frxReport bileşeni ekliyoruz. Master ve detail tablolarımızla bağlantı kurmak için iki adet frxDBDataset nesnesi ekliyoruz. Fastreport bileşenine çift tıkladığımızda ana penceremizi görebiliyoruz. Buradaki araçları nesneleri kullanarak istediğimiz özellikteki raporları hazırlayabiliyoruz. frxDBDataset1 > object inspector> dataset> qKayit (master tablomuz) seçiyoruz. Name> fqKayit olarak isimlendiriyoruz. frxDBDataset2 > object inspector> dataset> qhareket (detail tablomuz) seçiyoruz. Name> fqhareket olarak isimlendiriyoruz. frxReport’a çift tıklıyoruz ya da sağ tıklayıp >edit rapor seçebilirsiniz. Ana penceremiz açılıyor. Sol üst köşede report alanının seçeneklerinden Data’ya tıklıyoruz açılan pencereden kullanmak istediğimiz veritabanı nesnelerini seçiyoruz yani tabloları seçiyoruz gibi düşünebilirsiniz. Sağ kenarda data kısmının penceresini göreceksiniz orada data alanından veri tabanınızın nesnelerini görsel olarak görebiliyor olmalısınız. Sol kısımda alt alta sıralanmış simgeler mevcut bu simgeler rapor tasarımı için kullanabileceğimiz nesnelerdir. Simgelerden üstten 6.simgeye tıklıyoruz buradan ilk olarak rapor ekranımıza Rapor Title ekliyoruz. Ardından Master Data açılan pencerede frxdataset1(master tablomuz bağlı) seçiyoruz. Detail Data ekliyoruz ve açılan pencereden frxdataset2 (detail tablomuz bağlı) seçiyoruz. Bir adet Page Footer ekliyoruz. Sağ kısımdaki data alanından raporumuzda yer almasını istediğimiz nesneleri seçerek raporumuza ekliyoruz. Bu alandan çıkarak formumuza eklediğimiz buttona çift tıklıyoruz;


procedure TfrmMain.Button1Click(Sender : TObject);
begin
frxReport.ShowReport();
end;

Çalıştırıyoruz yazdır buttonuna tıkladığımızda açılan pencerede rapor verilerimizi görebiliyoruz. Çeşitli nesnelerle, çizgilerle, geometrik şekillerle rapor sayfamızı düzenli hale getirebiliyoruz.

frxBarCodeObject nesnesini ekleyelim. Bu nesne sayesinde raporumuza barkod ekleyebileceğiz. FastReport’u açıyoruz, sol kısımda en alttaki barkod bileşeni simgesine tıklayarak hangi tip barkodu istersek onu seçiyoruz biz code128 seçtik. Barkodda gösterilecek alanı seçiyoruz ve görüntülenmesini istediğimiz yere bırakıyoruz. Çalışıtırdığımızda barkod alanınında eklendiğini görebiliyoruz.

https://www.youtube.com/watch?v=4cbbuiBdOU8

Delphi ile Vcl Veri Tabanı İşlemleri

İçerik;

-Delphi ile veri tabanı bağlantısı Master Detail Bağlantı yapılması

-Grid üzerinde verilerin gösterilmesi

 -Arama işlemlerinin yapılması

- Uygulamamız MsSql üzerinde olmak ile beraber Firedac'ın esnek özellikleri sayesinde destek verilen tüm veri tabanlarında aynı adımları takip ederek bağlanabilirsiniz.

Neden Delphi ile veri tabanı ile uygulaması geliştirmek tercih ediliyor?

Bu soruya verilebilecek çok fazla cevap olması ile beraber temelde 2 özellik yer alıyor.

  1. İleri seviye yazılım bilgimiz olmadan ileri seviye yazılım üretmemizi sağlıyor.
  2. Kolaylıkla Framework yapısının oluşturulabiliyor olması.

Delphide büyük bir veri tabanı uygulaması oluşturulurken izlenen yöntem ;

Delphi ile framework oluşturuyorsunuz. Bu framework’ten sizin oluşturduğunuz altyapı ile kullanıcılar kendi ihtiyacı olan raporları formları oluşturabiliyorlar. Delphi ile bu işlemi yapması oldukça kolay bunun nedeni ise delphideki dinamik kütüphanelerin çokluğu ve zenginliği.

Uygulamada kullanacağımız veri tabanı tabloları ve kolon bilgileri;

TBL_KAYIT: {ID, ADI, SOYADI, FOTO}

TBL_HAREKET: {HAREKET_ID, HAREKET_KAYIT_ID, HAREKET_ACIKLAMA, HAREKET_TUTAR}

Kullanılacak tablolarda birer tane otomatik artan sayı ve indexlenmiş alan olması önerilir.

Demo

Uygulamamızı açıyoruz. File> New> Vcl Application seçerek boş bir form açılmasını sağlıyoruz. Formumuzun üzerine FDConnection koyuyoruz.

FDConnection : Bir veri tabanı ile bağlantı kurmak ve ilişkili veri kümelerini yönetmek için kullanılır.

(Biz FireDAC’ın bileşenini kullandık fakat siz başka 3.parti bileşenlerini tercih edebilirsiniz. )

FDConnection’a çift tıklıyoruz açılan pencerede Driver ID = Mssql seçiyoruz siz hangi veri tabanına bağlanmak istiyorsanız onu seçebilirsiniz. Sürümlere göre erişilen veri tabanları değişiklik göstermektedir. (Community sürümü kullanıyor iseniz mssql veri tabanına bağlanamıyorsunuz)

Biz mssql seçtikten sonra Sql Server Management Studio’yu açıyoruz server name kısmını kopyalıyoruz FDConnection penceresindeki server alanına yapıştırıyoruz. Ücretli bir sql server versiyonunuz varsa o zaman bu kısma ip adresini yazmanız yeterli olacaktır. Database kısmına veri tabanı ismimizi yazıyoruz. User_Name ve Password alanlarını doldurmamız gerekiyor  bu alanı doldurmanın iki yolu var. Birinci yol sql serverda bir kullanıcı oluşturmak ve kullanmak. İkinci yol OSAuthent kısmını yes seçmek bu şekilde Windows’ta login olduğumuz kullanıcı adı ve şifreyle yetki al demiş olduk. Eğer Windows’unuz ve sql server’iniz aynı domainde ise ya da aynı bilgisayarda ise ikinci yolu kullanabilirsiniz. Test butonuna tıklıyoruz ve bağlantının başarılı olduğu penceresini ekranda görebiliyoruz. FDConnection için Login Prompt özelliğini object inspector’dan false yapıyoruz.

Login Prompt: Bağlantıdan önce oturum açma penceresinin açılıp açılmayacağını belirtir.

Bu haliyle projemizi kaydedelim isimlendirmelerimizi yapalım. Unit1.pas > uMain , Project1.dproj> WebinarDb.

Formumuza tıklayıp object inspector kısmından name> frmMain olarak adlandırıyoruz. İsimlendirmeleri kendi uygulamanızın yapısına göre değiştirebilirsiniz. Formumuza FDQuery yerleştiriyoruz. Name> qKayit olarak değiştiriyoruz. Bu queryden TBL_KAYIT tablomuza ulaşacağımız için biz bu şekilde adlandırdık.

FDQuery : Sql sorgularını yürütmemizi, sonuç küme kayıtlarını görmeyi ve düzenlemeyi sağlar.

QKayit’ a çift tıklıyoruz ve açılan pencerede verisini almak istediğimiz tablo için sorgu yazıyoruz. Bizim sorgumuz;

SELECT * FROM TBL_KAYIT

Execute tıklayarak alt kısımda tablonun içindeki verileri görebiliyoruz.

Not:  FDConnection’un connected özelliği her zaman false olmalı ve program açıldıktan sonra bir button yardımı ile açılmalı. Buna dikkat etmeliyiz çünkü bazı veri tabanlarında veri tabanına ulaşılamadığı için program açılmadan hata vermektedir.

Forma DbNavigator ve DbGrid ekliyoruz. Align’larını alTop yapıyoruz her ikisinin de. Ekran düzenini kendi isteğinize göre de ayarlayabilirsiniz. Bir adet DataSource ekliyoruz. Name> dsKayit olarak adlandırıyoruz. DbGrid ve DbNavigator’ün object inspector da DataSource alanlarını dsKayit olarak seçiyoruz.  Aynı işlemi sağ tık ile bind visually seçerek açılan ekranda gerekli bağlamaları yaparak da gerçekleştirebilirsiniz. Bir adet Panel ekliyoruz. Align> bottom ayarlıyoruz. Panel’in içine bir adet button ekliyoruz. Align> alleft , name> btnConnect ayarlıyoruz. Butona çift tıklıyoruz;


procedure TfrmMain.btnConnectClick(Sender : TObject);
begin
FDConnection1.open();
qKayit.Open();
end;

Çalıştırıp buttona tıkladığımızda verilerin geldiğini görebiliyoruz.

Ek Bilgi : Nesneleri grid üzerinde değilde örneğin edit üzerinde göstermek istersek query’e sağ tık> fields editor seçerek açılan pencerede sağ tıklayıp add all fields seçerek bu alanda fieldsleri görebiliriz buradan forma sürükleyerek ya da edit bileşenleri yerleştirerek kullanabiliriz. Formu çalıştırdığımızda biz kayıtlar üzerinde gezdikçe editlerde de verilerin değiştiğini görebiliyoruz bunun sebebi editlerinde dbedit olmasıdır. Bu halini projemizde kullanmayacağız örnek olması açısından formdaki görüntüsü aşağıdaki gibidir;

 

Forma bir query daha ekliyoruz. Name> qHareket olarak adlandırıyoruz. Query’e çift tıklıyoruz. Açılan pencereye ; SELECT * FROM TBL_HAREKET yazıyoruz. 1 Tane FDConnection olduğu için otomatik olarak ona bağlandı execute tıklayınca aşağıda verileri görebiliyoruz. qHareket’in object inspectordan MasterSource kısmını >dsKayit , MasterFields> ID, IndexFieldName> HAREKET_KAYIT_ID seçiyoruz. Forma bir tane daha DataSource yerleştiriyoruz. Object inspectorda Name> dsHareket , DataSet> qHareket yazıyoruz. Bir adet DbGrid ve DbNavigator yerleştiriyoruz. DbGrid align> alclient. DbNavigator> align albottom seçiyoruz. Her ikisininde DataSource kısmını dsHareket seçiyoruz.

btnConnectClick buttonuna ekliyoruz;


qHareket.Open();

Çalıştırıyoruz ve navigatörlerden yardım alarak hareket tablomuza kayıt ekliyoruz. Kayıt tablomuzda kayıtları geziyoruz. Kayıtları eklediğimiz idlere geldiğimizde hareket tablosundaki kayıtları görebiliyoruz.

Master Detail kısmı bu şekildeydi fakat burada dikkat etmemiz gereken bir konudan bahsetmek istiyorum. qHareket querysini açalım execute ettiğimizde görüyoruz ki tüm kayıtlar geliyor. Bu şekilde olması doğru değil. Burada where ile filtreleyerek parametre ile sorgulamamız gerekiyor. Master kısmında seçilen id’ye sahip detail kısmının gelmesi için. Bizim tablomuz için sorgumuzun yeni hali ;

 SELECT * FROM TBL_HAREKET

WHERE HAREKET_KAYIT_ID = :kayit_id

Bulunduğumuz pencerede 2. sekme olan parameters sekmesine geliyoruz. Burada yazdığımız parametrenin (kayit_id) oluşturulduğunu görüyoruz. Paramtype > ptInput, DataType> ftString seçiyoruz. Kendimiz doğru sonuç verip vermediğini kontrol etmek için value kısmına tabloda verisi olan idllerden birini yazarak execute tıklayarak deniyoruz ve aşağıda verileri görebiliyoruz. Formu çalıştırdığımızda aynı şekilde sonucu göremiyoruz bunu düzeltmek için qKayit’ın object inpsctordan event kısmından AfterScroll’a çift tıklıyoruz;


procedure TfrmMain.qKayitAfterScroll(DataSet : TDataSet);
begin
qHareket.Params[0].Value := qKayitID.value ;  //(burada fieldbyname’ de kullanabilirsiniz)
qHareket.close;
qHareket.Open();
end;

Bu kod aynı anda işlemin ekrandaki nesnelerde gözükmesini sağlayacaktır. Bu şekilde bu kısmı da tamamladık.

Formun çalışır görüntüsü aşağıdaki gibidir;

Edit ile arama işlemini yapmak için az önce kullandığımız proje üzerinden devam edeceğiz. Projemize eklemeler yaparak kolayca tamamlayacağız.  Bir panel ekliyoruz panelin içine bir adet button ve edit ekliyoruz. Button için  text> ara, name>btnAra. Edit için textini temizliyoruz, name> EditAra şeklinde adlandırıyoruz. Buttona çift tıklıyoruz. Kodlarımızda query’nin sql kısmına ekleme yapacağız fakat önceden sql’ de yazılı olan sorgu için bir global değişken tanımlıyoruz. oldSql : string tipinde tanımladık bunu bu kısımda kullanacağız.


procedure TfrmMain.btnAraClick(Sender : TObject);
begin
qKayit.close;
oldSql := qKayit.sql.text;
qKayit.sql.clear;
qKayit.sql.Add(‘SELECT * FROM TBL_KAYIT’);
qKayit.sql.Add(‘WHERE ADI = ‘+ QuotedStr(EditAra.text)’);
qKayit.open();
end;

Edite tablodan bir kayıt yazdığımızda filtrenin çalıştığını verinin geldiğini görüyoruz.

Formun çalışır haldeki görüntüsü aşağıdaki gibidir;

Interposer kelimesinin karşılığı aracı, aracılık yapan demektir. Yani başlık aslında "Aracı Sınıf Nedir" şeklinde de yazılabilirdi.

Bir Interposer Sınıfı, (hiyerarşik anlamda konuşacaksak) bir sınıfın (kendisinden türediği) bir ata sınıf ile bu sınıfın türüne ait bir nesnenin beyanı arasında konumlandırılış bir "Aracı sınıftır". Ana karakteristiği, ata sınıf ile aynı isme sahip olmasıdır. Bu sayede uygulamalarda ata sınıfın kullanıldığı durumlarda süreci basitleştirmek hedeflenmiştir. Bu teknik aslında 1998'den beri var ve Delphi ile yeteri kadar haşırneşir olanların çok sık kullandığı bir teknik diyebilirim.
 

https://www.youtube.com/watch?v=jWDq4fhixCg

Modbus nedir ?

Endüstriyel cihazlar arasında çok sık kullanılan bir protokoldür. Modbus bağlantısının en kolay yolu modbus  componentini kurarak yapılıyor. 

PLC nedir?

PLC (Programlanabilir Mantıksal Denetleyici), fabrikalardaki üretim bölümlerinde veya makinelerin kontrolü gibi işlemlerin denetiminde kullanılan otomasyon cihazıdır.

Bu işlem için öncelikle PLC’nin IP'sini bilmemiz gerekiyor. Angry Ip Scanner ücretsiz tool ile networkümüzde arama yaptırarak bulabiliyoruz. Plc’nin kendi yazılımına geçiyoruz seçenekler> haberleşme ayarları açılan pencerede Tip → etharnet seçiyoruz. Birden fazla ethernet kartı varsa bilgisayarınızda hangi ethernet kart ile haberleşmek istediğinizi seçmelisiniz. Ethernet ayarında ip atama işaretleyerek yandaki kutucuğa öğrendiğimiz ip’yi yazıyoruz tamam diyerek kapatıyoruz. Benzer işlemleri haberleşme> haberleşme oto-algılama seçeneğini seçerek de yapabiliriz.

Yeni proje açıyoruz açılan pencerede proje adımızı yazıyoruz proje başlığı> test -  model tipi> plc -  seç >SE şeklinde dolduruyoruz ve tamam diyoruz. Komut giriş kısmına yazıyoruz sırayla ; Idm2 - outy1 -  id<d100 - k100 - outy3. Programımızı plc’ye gönderiyoruz. Plc’yi run moduna alıyoruz ve plc deki çalışma ışıklarını görüyoruz. 

Bu işlemleri  Delphi ile yapmayı göstereceğiz. File> New> vcl application diyerek formumuzu açıyoruz. Formumuza yüklediğimiz componentin modbus clientini yerleştirelim name →PLC diyelim çünkü plc ile ilgili işlemlerimizi bu component üzerinden gerçekleştireceğiz. Host alanına ip adresimizi yazıyoruz bu şekilde plcmiz ile bağlantı sağlayacağız. 1 Adet panel, 2 adet edit ve editlerin önüne 2 adet label yerleştiriyoruz.  Editlerimizin içine sabit değerler yazacağız. Edit1> text = 4097 (delta plc için) bu değer d’li adreslerin başlangıç adresidir. Edit1 >name→ EditAdres. Edit1’in önüne label yerleştiriyoruz caption → Plc Adresi. Edit2’nin önüne de label yerleştiriyoruz caption → Uzunluk. Edit2> text → 1 yazdık ne kadar okuyacağını göstermek için – name→ EditUzunluk . Panelin içine 1 adet buton yerleştiriyoruz button1> caption → Plc’den Oku. Buttona çift tıklayarak kod yazmaya başlayabiliriz.

procedure TForm2.ButtonClick(Sender : TObject);
var 
  Data: array [0..4096] of word;
  Data2: Dword;
  iAmount : integer;
  Sline : string;
  i : integer;
begin 
  iAmount := StrToInt(EditUzunluk.Text);
  if iAmount >0 then 
  begin 
    if plc.ReadHoldingRegisters(StrToInt(EditAdres.Text) , iAmount,data) then
    begin 
       SLine := ‘Okunan adres :’ ;
       for := 0 to iAmount -1 do
         SLine := Sline + #13#10’ ‘
         +IntToStr (StrToInt(EditAdres.Text)+ i) +
         ‘ : 0x’ +
         IntToStr(Data[i]);
         ShowMessage(SLine);
    end;
  end;
end;
end.

Data isminde bir değişken tanımladık bu bir array  0’dan 4096’ya kadar gidecek ve word tipinde değerler içerecek. Data2 isminde bir değişken tanımladık dword tipinde bir değişken. Bir değişken daha tanımladık iAmount isminde bu da integer tipinde. SLine isminde string tipinde bir değişken daha tanımladık bu değişkene göndereceğimiz verinin içeriğini yükleyeceğiz buradan kolaylıkla  veriyi gönderebileceğiz.  Plc’den gelen değeri okuyoruz okuduğumuz değeri array’in içerisine aldığımız için array daki tüm değerleri okuyarak SLine ismindeki değişkene ekliyoruz en son olarakta SLine değişkeninin içerisindeki veriyi ekrana ShowMessage komutu ile yazdırıyoruz. Çalıştırıyoruz, başlangıç değer olarak yazdırdığımız değer d1’i ifade ediyor başlangıç değerini değiştirdikçe o değeri okuyabiliyoruz. Veri okuma işlemi bu kadardı.Şimdi veri yazma işlemine bakalım. 

Veri Yazma İşlemi;

Componentleri  aynı kullanacağız kopyala yapıştır yaparak devam edebilirsiniz. İsimleri değiştirerek devam edelim edit1> name→ EditAdresYaz. edit2> name → EditUzunlukYaz. Button2 > caption → Plc’ye Yaz. Label5 caption → Yeni değer, şeklinde yeni isimlendirmelerimizi yaptık. Button2’ ye çift tıklıyoruz ve kodlarımızı yazmaya başlıyoruz;

procedure TForm2.Button2Click(Sender : TObject);
begin
   if plc.WriteRegister(StrToInt(EditAdresYaz.Text), StrToInt(EditUzunlukYaz.Text)) then
   begin
     MessageDlg((‘Plc’ye başarı ile yazıldı’), mtInformation,[mbOK],0)
   end
   else
     MessageDlg((‘Hata ! ! ! Plc’ye yazılmadı’), mtError,[mbOK], 0)
end;
end.

Çalıştırıyoruz. Okuma kısmındaki değeri yazıp görelim sonrasında yeni değer kısmına bir değer girelim ve okuma kısmındaki değerin değiştiğini görebiliyoruz. Girdiğiniz değer tanımladığımız şarttan küçük bir değer ise  plc’nin ışığının söndüğünü görebilirsiniz. 

Son olarak ip’yi bilgisayardan komut olarak göndermeyi öğrenelim. Bu sayede birden fazla plc’den veri okutabiliriz o zaman plc’nin hangi plc’ye okuma talebi gönderdiğini ip olarak yazmamız gerekir.

Formumuza birer adet label ve textbox ekliyoruz. label> caption → ip. Edit5 >text → bu kısma ip’mizi yazıyoruz. Formumuza çift tıklayalım kodları bu kısma yazacağız edite yazdığımız ip’yi okuması için formun create’inde komutu göndereceğiz;

procedure TForm2.FormCreate(Sender : TObject);
begin
  plc.Host:= edit3.text;
end;
end.

Delphi’de Fonksiyon ve Prosedür Çağırma Düzenleri (Calling Conventions)

Nedir bu “Calling Conventions” derseniz, Türkçe karşılığı Çağırma Düzeni/Biçimi gibi çevrilebilir. Ancak bu pek anlamını karşılamıyor. Yazımda zaman zaman İngilizce halini kullanabilirim. Anlaşılmazlığa sebep olursa affola. Yazıda bir çok yerde “Fonksiyon ve Prosedür” demek yerine Fonksiyon diyeceğim. Siz onu Fonksiyon ve Prosedür olarak algılayabilirsiniz 🙂

Calling Convention’lar için parametrelerin iletilme sırasını, yerini (yığıt/register), yığıt temizleyicisini ve hata/exception yakalayıcısını belirleyen fonksiyon çalışma modelidir diyebiliriz.

Prosedür veya fonksiyon tanımlarken “register; pascal; cdecl; stdcall; safecall” anahtar kelimeleri ile Calling Convention belirtebilirsiniz. Örneğin;

function MyFunction(X, Y: Real): Real; cdecl;

Yukarıda da belirttiğim gibi Delphi’de 5 farklı Convention var. Eğer Convention belirtmeden tanım yaparsanız varsayılan olarak register kabul edilir.
Register, özellikle de yığıt oluşturmadığı sürece acayip verimlidir. En verimlisidir.
C/C++ fonksiyonlarını çağırırken Cdecl kullanışlıdır.
Stdcall, Safecall dışarıdan çağrılan kodlarda genel olarak verimlidir. (Stdcall, Cdecl’den daha verimlidir.)
Ayrıca Win32 API’lar Stdcall ve safecall kullanır. Diğer işletim sistemleri genellikle Cdecl kullanır.
Near, far, export 16-bit Windows programlamadan kalan convention’lar da geriye dönük uyumluluk için desteklenmektedir. Fakat Win32’de bir özelliği olmadığı için yazımda onlara yer vermeyeceğim.

Cdecl
İsmi “C Declaration” kısaltmasıdır. İsimden de anlaşılacağı üzere, köken olarak C programlama dilinden çıkmıştır. x86 mimarideki bir çok C derleyicisi bunu kullanmaktadır.

Parametrelerin tamamı yığıtta iletilir. Parametreler yığıta ters yazılır (Sağdan sola). Fonksiyonu çağıran fonksiyondan geri dönüşü aldıktan sonra yığıtı temizler.

Dönüş değerleri ise;
Integer değerler ve bellek adresleri (Pointer) EAX register’ı ile,
Float değerler ise ST0 x87 register’ı ile alınır.

EAX, ECX, EDX Register’ları fonksiyonu çağıran tarafından kaydedilir. Diğerleri ise çağrılan fonksiyon tarafından kaydedilir.
ST0 .. ST7 (x87 floating point (Kayan Nokta) register’ları) fonksiyonu çağırırken boş olmalıdır. ST1 .. ST7 fonksiyondan çıkarken boş olmalıdır. ST0 da dönüş değeri için kullanılmamışsa boş olmalıdır.

Bazı derleyiciler Fonksiyon dönüş değeri olarak basit 2 register’a sığacak struct yapılarını EAX, EDX register’ları ile,
Büyük struct’ları ve exception yakalayıcısı tarafından özel muamele gereken sınıf nesnelerini ise bellek üzerinde geri döndürür.

Bellek üzerinden dönüş işlemi için, çağıran bellekte ilgili struct/class kadar yer ayırır ve gizli bir ilk parametre olarak fonksiyona bellek adresini (pointer) gönderir. Çağrılan fonksiyon ise bellekteki yeri ilgili struct/class ile doldurup, dönüş değeri olarak yine pointer’ı gönderir. (Bu ayrılan yerin çağıran tarafından temizleneceğini söylememe gerek yok sanırım 🙂 )

Son bahsettiğim (struct ve class dönüş değeri) kısım bazı derleyicilerde değişkenlik gösterebiliyor. Bu faktörler dolayısı ile farklı C derleycileri arasında uyumsuzluk, hatta aynı derleyicinin farklı işletim sistemlerine derlemeleri arasında farklılıklar söz konusu olabiliyor.

Stdcall
İsminin “Standard Call” kısaltması olduğu çok bellidir. Ancak isim bize pek açıklayıcı değil. Köken olarak aslında Pascal convention’dan gelir ancak biraz farklı.

Cdecl convention’ın aksine yığıt temizleme işini çağrılan fonksiyon yapmaktadır. Aslında bu yazıda bahsedeceğim tüm Convention’larda (Cdecl hariç) yığıtı çağrılan fonksiyon temizler.

Cdecl gibi parametreler yığıta ters yazılır. (Sağdan sola)

EAX, ECX, EDX register’larını fonksiyon içinde kullanmak üzere tasarlanmıştır. Dönüş değerleri ise EAX register ile alınmaktadır.

Stdcall, Win32 API’larının standart convention’ıdır.

Bonus: Winapi
Hadi yine iyisiniz, kaptınız bonusu. Delphi’de “Winapi” isminde bir convention daha var. Aslında kendisi bir convention değildir.

Win32 API Convention’ının Stdcall olduğunu yukarıda belirttim. Windows CE API Convention’ı ise Cdecl. “Winapi” ise Stdcall veya Cdecl arasında seçimi derleyiciye yaptırmakta.

Yani, kendisinin gerçek adı Stdcall ve kendisi gizli convention’dır. (şaka!)

Safecall
Delphi ve Free Pascal’da COM (Component Object Model) veya OLE hata yönetimi sağlayan bir Convention’dır. Exception’lar fonksiyonu çağırana gönderilmez ancak HResult dönüş değeri içinde bir hata raporu bulunur. Safecall bir fonksiyon Delphi’de çağırıldığı zaman Delphi otomatik olarak HResult değerini de kontrol eder ve gerekliyse exception oluşturur.

Safecall, stdcall ile aynıdır. Farkı ise fonksiyon çağırana EAX üzerinde HResult değerini gönderir. Dönüş değeri ise yığıtta refarans edilen bellek adresinde döner.

Bu convention ile bir Delphi fonksiyonunu Delphi’den çağırırsanız, aynı diğer fonksiyonlar gibi dönüş değerini size iletip, aynı zamanda EAX ile gelen HResult değerini kontrol ederek gereken exception’ı otomatik olarak oluşturur.

Yani,

function Fonksiyon(Parametre: DWORD): DWORD; safecall;

Şeklinde tanımladığımız fonksiyon aslında budur:

function Fonksiyon(Parametre: DWORD; out Result: DWORD): HResult; stdcall;

Tabi HResult değerini biz hiç görmüyoruz, Delphi gerekli müdahaleleri kendisi yapıyor.

Register
“Borland Register” olarak da bilinir. Delphi’nin 32-bit Windows derleyicisinde varsayılan convention’dır. Linux kernel’ının bazı versiyonları i386’da bu convention’ı kullanır.

3 parametreye kadar yığıt kullanmadan EAX, EDX, ECX (Bu sırayla) register’larını parametre iletmek için kullanır. Geriye kalan parametreler ise yığıt ile iletilir. Parametre iletimi yukarıdakilerin aksine düz bir şekilde gerçekleşir. (Soldan sağa) Yığıtı çağrılan fonksiyon temizler.

Fakat Real, Method Pointer, Variant, Int64 ve Yapısal tipler(Record/Class) register ile iletilmeye müsait olmadığı için bunlar da yığıt ile iletilecektir.

Örneğin;

procedure Test(A: Integer; var B: Char; C: Double; const D: string; E: Pointer);

A: EAX (32-bit Integer), B: EDX (Char Pointer), D: ECX (Long-string bellek alanına Pointer)
C(Double) ve E(32-bit Pointer) ise yığıta yazılır. (E, boş register kalmadığı için yığıta yazılır. C, her halukarda yığıtta iletilecekti)

Fonksiyonlar EBX,ESI, EDI, EBP register’ları korumak zorundadır. Fakat EAX, EDX, ECX üzerinde değişiklik yapabilir.

Pascal
İsmi zaten olayı ele veriyor. Pascal programlama dilinin convention’ı. Artık kullanılmamaktadır, geriye dönük uyumluluk için bulundurulmaktadır. OS/2 1.x 16-Bit ve Windows 3.x 16-Bit API’larda bu convention kullanılmaktadır. Ayrıca Borland Delphi 1 de bu convention’ı kullanmaktadır.

Parametreler yığıta düz bir şekilde yazılarak iletilir. (Soldan sağa) Çağrılan fonksiyon dönüş değerini iletmeden önce yığıtı temizlemekle yükümlüdür.

 

Sanırım konudan bu kadar bahsetmek yeterli. Görüşmek üzere kendinize iyi bakın.

 

Alıntı : akcakir.net/delphide-fonksiyon-ve-prosedur-cagirma-duzenleri-calling-conventions/

 

https://www.youtube.com/watch?v=i7qaEEyv3Xk&t=1095s

Sensor nedir?

Bir cihazdaki dış ortamla ilgili verileri cihaza bildiren araçlardır. Her birinin içerisinde  API’si mevcuttur. Bu APIlere erişerek cihazdan gelen veriyi alabiliyoruz.

İki sensor üzerinde anlatım yapacağız;

  • Lokasyon sensor
  • Oryantasyon sensor

Lokasyon Sensor : Cihazın o anda ki enlem ve boylam bilgisini alır.

Oryantasyon sensor : Cihazın hangi pozisyonda, açıda tutulduğunun bilgisini alıyor.

Diğer sensorler hakkında bilgi almak için Embarcadero’nun kendi web sitesinden ve Github Getit üzerinden ulaşabilirsiniz.

DEMO – 1

Mobil cihazdaki konum verisini alıp web browserdan hangi konumda olduğunu göstereceğiz.

File> New> Multi Device Application> Blank Application. Projemiz açılıyor ve kaydediyoruz. Palette> toolbar ekliyoruz. Toolbar’ın içine checkbox ekliyoruz. Checkbox> Object Inspector >align >right – name →items editor açılan pencereden 1 adet ListboxGroupHeader 2 adet ListboxItem ekliyoruz. Yüksekliklerini ayarlamak için height> 45 veriyoruz. Textlerini temizliyoruz. Listbox1’in içine label ekliyoruz.Label1 >align >left – text → Enlem – name→ lblenlem. 2tane daha label ekliyoruz. Bir tanesi toolbarın içine text → Lokasyon Uygulamasu diğeri listboxitem2’nin içerisine text→Boylam – name→lblboylam – align >left. Listboxların içinde yer alan labelları yanlarına kopyalayıp yanlarına ekliyoruz bu labellar ile değerleri göstereceğiz. Değer göstereceğimiz labelların align> client – text→0 – HorzAlign > center.

Bir adet web browser ekliyoruz ve bir lokasyon sensoru yerleştiriyoruz bu bize mobil cihazdan konum bilgisini alıp enlem ve boylam olarak okumamızı sağlayacak. Kodları checkboxa yazacağız. Checkbox aktifse lokasyon sensorumuzde aktif olacak. Checkboxa çift tıklıyoruz. Hazır bir kod ekliyoruz Android 7’den sonrası için izin alabilmemiz için bu kodu eklememiz gerekiyor. Hazır koddaki nesne isimlerini kendi nesne isimlerimizle değiştiriyoruz.


Procedure TForm2.cbSensorAcChange(Sender : TObject);
const
PermissionAccessFineLocation = ‘android.permission.ACCESS_FINE_LOCATION’;
begin
{$IFDEF ANDROID}
PermissionsService.RequestPermissions([PermissionAccesFineLocation],
procedure (const APermissions: TArray <string>: const AGrantResults:TArray < TPermissionStatus>)
begin
if (Length (AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
{activate or deactivate the location sensor}
LocationSensor1.Active := swLocationSensorActive.IsChecked
else
begin
swLocationSensorActive.IsChecked := False;
 
TDialogService.ShowMessage(‘Location permission not qranted’);
end;
end);
end;
end

Kodların sonuna her cihazda çalışması gereken kodlarımızı ekliyoruz.


{$ELSE}
LocationSensor1.Active := cbSensorAc.Checked;
{$ENDIF}
LocationSensor’e gidip event kısmında onLocationChange çift tıklıyoruz ve komutlarımızı yazıyoruz.
procedure TForm2.LocationSensorLocationChanged(Sender : TObject;
const OldLocation , NewLocation: TLocationCoord2D);
const
GoogleMapsUrl: String = ‘https: //maps.google.com/maps?q=%s’;
begin
var Enlem := Newlocation.Latitude.ToString(ffGeneral, 8,5,TFormatSettings.Create(‘en-US’));
var Boylam := Newlocation.Longitude.ToString(ffGeneral, 8,5,TFormatSettings.Create(‘en-Us’));
lblEnlem.Text := Enlem;
lblBoylam.Text := Boylam;
WebBrowser1.Navigate(Format(GoogleMapsURL,(Enlem,Boylam)));
end;
end.

Google’ın sabit adresinide ekledik çünkü web browser’a adres olarak göndereceğiz. 2 adet değişken tanımladık enlem ve boylam. Formatlama işlemi yaptık çünkü browsera göndereceğiz browser aracılığı ile Google’a göndereceğiz. Google’ın istediği formata uydurabilmemiz için enlem ve boylam bilgimizi göndermeyi bu şekilde yapıyoruz.

Uses kısmına fmx.DialogService ekliyoruz. Target Platforms> Target burada bağladığımız cihazımızı görebiliyoruz uygulamamızı derliyoruz ve gönderiyoruz. Mobil cihazımızda checbox aktif ediyruz. Konum kullanımına izin veriyoruz ve bulunduğumuz konumun enlem ve boylam değerlerini görebiliyoruz.

DEMO – 2

ORYANTASYON SENSORU

Cihazın hangi konumda tutulacağını belirleyen sensorümüzdür.

Zaman kaybetmemek için bu projemizi emarcadero’nun örnek uygulamaları üzerinden yapacağız. Delphi’yi açıyoruz > open a sample project menüsüne tıklıyoruz, burada Embarcadero’nun kendi demolorunun bulunduğu klasörü açan kısayol ekranı geliyor. Object pascal> Mobile snippets> Accelerometer>  Accelerometer.dpr ve örnek uygulamamız açılıyor. Eğer bu sample klasörünü daha önceden yüklemediysek tools> manage performans> additional options> samples’ı işaretleyerek kuruyoruz. Açılan uygulamamızın kodları aşağıdaki gibi;


 procedure TAccelerometerForm.swAccelerometerSensorActiveSwitch(Sender: TObject);
begin
  { activate or deactivate the reading of the accelerometer sensor }
  MotionSensor1.Active := swAccelerometerSensorActive.IsChecked;
  Timer1.Enabled := swAccelerometerSensorActive.IsChecked;
end;

Gelin kodları inceleyelim. Açılan uygulamada bir önceki demomuza benzer bir arayüzümüz var. Burada motionsensor componenti kullanılmış. Bir adet timer var. Sensorumuzu açıp kapama için TSwitch mevcut. Switch checbox ile hemen hemen aynı. Motion componentimizin aktif kısmı switchbox’ın checkine bağlanmış. Timer da aynı şekilde switchbox’ın check özelliğine bağlı.


procedure TAccelerometerForm.Timer1Timer(Sender: TObject);
var
  LProp: TCustomMotionSensor.TProperty;
 
begin
  for LProp in MotionSensor1.Sensor.AvailableProperties do
  begin
    { get the data from the sensor }
    case LProp of
      TCustomMotionSensor.TProperty.AccelerationX:
      begin
        lbAccelerationX.Visible := True;
        lbAccelerationX.Text := Format('Acceleration X: %6.2f', [MotionSensor1.Sensor.AccelerationX]);
      end;
      TCustomMotionSensor.TProperty.AccelerationY:
      begin
        lbAccelerationY.Visible := True;
        lbAccelerationY.Text := Format('Acceleration Y: %6.2f', [MotionSensor1.Sensor.AccelerationY]);
      end;
      TCustomMotionSensor.TProperty.AccelerationZ:
      begin
        lbAccelerationZ.Visible := True;
        lbAccelerationZ.Text := Format('Acceleration Z: %6.2f', [MotionSensor1.Sensor.AccelerationZ]);
      end;
      TCustomMotionSensor.TProperty.AngleAccelX:
      begin
        lbAngleAccelX.Visible := True;
        lbAngleAccelX.Text := Format('Angle X: %6.2f', [MotionSensor1.Sensor.AngleAccelX]);
      end;
      TCustomMotionSensor.TProperty.AngleAccelY:
      begin
        lbAngleAccelY.Visible := True;
        lbAngleAccelY.Text := Format('Angle Y: %6.2f', [MotionSensor1.Sensor.AngleAccelY]);
      end;
      TCustomMotionSensor.TProperty.AngleAccelZ:
      begin
        lbAngleAccelZ.Visible := True;
        lbAngleAccelZ.Text := Format('Angle Z: %6.2f', [MotionSensor1.Sensor.AngleAccelZ]);
      end;
      TCustomMotionSensor.TProperty.Motion:
      begin
        lbMotion.Visible := True;
        lbMotion.Text := Format('Motion: %6.2f', [MotionSensor1.Sensor.Motion]);
      end;
      TCustomMotionSensor.TProperty.Speed:
      begin
        lbSpeed.Visible := True;
        lbSpeed.Text := Format('Speed: %6.2f', [MotionSensor1.Sensor.Speed]);
      end;
    end;
  end;
end;

Kalan bütün işlem timer’ın içerisinde gerçekleşiyor. İlk başta x, y ve z hareketlerini almışız label’ın içine daha sonra x ,y ve z konumundaki açıları almışız bunları ekranda labellara yazdırmışız.

Bu uygulamayı cihaza gönderip deneyelim, ilk demomuzla aynı işlemleri uyguladığımızda mobil cihazımızda verilerin geldiğini göreceğiz.

Uygulamamızı kapatıp open a sample> object pascal> multi device samples> device sensor and services burada birçok sensor için uygulama örneği mevcut buradan örnekleri inceleyebilirsiniz.

Uygulamada Tools> getit package manager bölümünden driver daha önceden yüklenmiş cihazları kolaylıkla kurabiliyoruz. Internet of things seçtiğimizde daha önceden delphi için driver yazılmış bir çok cihaza erişimi sağlayabiliyoruz.

 

Bu sürüm son mobil işletim sistemlerine destek ,yeni vcl bileşenleri ve çok sayıda performans iyileştirmesi içeriyor

 Yeni Rad versiyonu RX 10.4.1  yayınlandı.
Detaylı bilgiyi aşağıdaki linkten bulabilirsiniz.

RAD Studio 10.4.2

 

https://www.youtube.com/watch?v=LPFRUoq5NZg&t=1759s

Eğitim İçeriği

Bölüm #1

  • Action nedir?
  • Action ile neler yapılır?
  • Küçük bir demo

Bölüm #2

  • Share Sheet kullanımı
  • TabAction kullanımı
  • Örnek uygulamalar.

Action Nedir?

Yapılması gereken işlemleri paket haline getiren kısaltan olaylardır. Uygulamanın en küçük yapı taşı gibi düşünülebilir. Bu olayları bütünleştirdiğimizde ortaya fonksiyonlar çıkar. Fonksiyonların bir araya gelmeside uygulamamızı oluşturur.

Action ile Neler Yapılır?

  • Kod revizyonunu kolaylaştırır.
  • Kod verimliliğini arttırır.
  • Etkili ve hızlı arayüz geliştirme sağlar.
  • Standartlarınızı korumanızı sağlar.
  • Pratik kullanımı ile kolay prototip çıkartmanızı sağlar.
  • Tekrar eden işlemleri hızlandırır.
  • Aynı kodu birden fazla yöntemle çalıştırabilmeyi sağlar.

DEMO

Uygulamamızı açıyoruz. File > New > Multi device application > Blank Application. Palette bölümünden Action List ekliyoruz. Eklediğimiz Action Liste çift tıklayarak yada sağ tuş> Action List Editor’e tıklayarak Action listesine ulaşabiliyoruz.

Açılan listeye sağ tuş> New Action seçeneğiyle action oluşturabilirsiniz. Uygulamamızın içine yeni bir action oluşturuyoruz. Action > object inspector > name →HelloWorldAction - text →Hello World  şeklinde isimlendiriyoruz. Object inspector> category > kısmından action’ı kategorilendirebiliyoruz. Bu bize daha yönetilebilir bir sistem sağlıyor. Biz catgory kısmına main değerini vererek kategorilendiriyoruz.

Action’ın object inspector kısmında bulunan UnsupportedPlatforms ve UnSupportedArchitectures alanları actionların seçili platformlarda aktif olup olmayacağını anlayabileceğimiz alanlardır.

TActionların event kısmına geliyoruz burada 3 fonksiyonumuz var.

OnExecute : Doğrudan bir action’ın çalışması execute olmasıyla alakalıdır. Eğer componentin adıyla çağırırsak HelloWorldAction.Execute yaparsak otomatik olarak çağrılmış olur. Eğer doğrudan bir componente çağrılacağın yer gönderenin bu componenttir dersek otomatik olarak bu compomnent bunu tetiklemiş olur. Tetikleme esnasında koda müdahale etmek istersek OnExecute alanında herhangi bir değer girebiliriz. OnExecute kısmına çift tıklıyoruz bizim için procedure oluşturuluyor.


procedure  TForm1.HelloWorldActionExecute(Sender : TObject);
begin
ShowMessage(‘Hello World : OnExecute’ );
end;

Formumuza geçelim ve HelloWorld fonksiyonumuzu bir butona bağlıyalım. Button ekliyoruz. Button1>  object inspector> action ve istediğimiz action seçiyoruz. Bağlantı sağlandı butonumuzda fonksiyonumuzun text’indeki HelloWorld yazıyor. Buttonumuzun object inspector’ındaki action alanının solundaki > (büyüktür) sembolüne tıklayarak actiona gitmeden burada düzenlemeler yapabiliriz. Bu haliyle çalıştırıyoruz ve butona tıklayınca HelloWorld : OnExecute mesajını görüyoruz.

Standart Action : Sınıflardan türetilen componentlere bağlı olarak geliştirilmiş olan actionları kapsar.

TControlAction : Tamamen bir kontrole bağlı olarak ve o kontrolün yönetebileceği kontrollerle alakalı actionları oluştururken kullanılır.

BÖLÜM #2

Share Sheet : Mobil cihazlardaki paylaş butonu ve bu paylaş butonundan çıkan pop-up’un yönetimini sağlayan bir actiondır. Share sheet ile resim ve metin paylaşımı yapılabiliyor. ShowShareAction.BeforeExecute burada action execute edilmeden hemen öncesini algılayıp yapmak istediğiniz değişiklikleri üzerine atayarak işlemlerini hazır hale getirmiş oluyor. Bu sayede kullanıcı bir resmi ya da metni kolaylıkla paylaşabiliyor. Action componentinin üzerinde doğrudan bir bitmap ve textmessage alanlarını kullanarak bu işlemleri gerçekleştiriyoruz.

ShareSheet ile demo

Uygulamamız şu şekilde çalışıyor Take Photo ile fotoğrafımızı çekiyorve share ile paylaşım kutucuğu açılıyor ve gönderim gerçekleşiyor. ShareSheet Embarcadero’nun örnek kodları arasında yer alan bir proje. Share sheet’in action ile ilgili gerçek bir ortamdaki örnek kodlarını birlikte inceleyelim.

Action liste çift tıklıyoruz, 3 action eklenmiş olduğunu görüyoruz. Bunlar;

ShowShareSheetAction1 → Fotoğrafı paylaşmak için bir action

Action1

TakePhotoFromCameraAction1→Kameradan fotoğrafı çekmemizi sağlayan bir action

New standart action classes penceresinden bu actionu görebiliriz. Bu action çekme işlemini tamamladığında hangi işlemleri yapıyormuş inceleyelim.


procedure TShareSheetForm.TakePhotoFromCameraAction1DidFinishTaking(Image:TBipmap);
begin
{display the Picture taken from the camera to the Image control}
ImgCameraPicture.Bitmap.Assign(Image);
end;

ImgCameraPicture adında bir compenenti var. Bu componentin üzerine doğrudan kendisine gelen anlık çekilen resmin bitmap dosyasını assign ediyor.

ShowShareSheetAction’ ın event’ında OnBeforeExecute var. Buraya çalışmadan öncesinde yapmak istediğimiz işlemi atıyoruz. Bu action’ın kodlarını inceleyelim;


procedure TShareSheetFormçShowShareSheetAction1BeforeExecute(Sender : Object);
begin
{Show the share sheet}
ShowShareSheetActin1.Bitmap.Assign(ImgCameraPicture.Bitmap);
end;

ShareSheetAction’ı açmadan önce içerisine arayüzündeki ImgCameraPicture.Bitmap.Assign ediyoruz böylelikle paylaşma ekranını size sunmuş oluyor

TabAction Kullanımı

Standart Action;

NextTab(TNextTabAction)

PreviousTab(TPrevious TabAction)

Title(TControlAction)

3 Fonksiyon belirledik.

Title : Aktif ettiğimiz tab’ın hangi başlığa aitse onu yazması için.

Next Tab ve Previous Tab : Tablolar arasında bir öncekine bir sonrakine geç işlemini yaparlar.

Yeni bir uygulama oluşturuyoruz. File> New> Multi Device Application> Blank application. Uygulamamıza bir TabControl ekliyoruz. Palette> toolbar ekliyoruz ve içerisine 2 adet button ve 1 adet label ekliyoruz. TabControl’ün üstüne sağ tuş 4 adet item ekliyoruz. TabControl > align > center – Button1 >align > left – Button2 > align > right – label1>align > client – label1> horzalign >center seçtik bu sayede label’a yazdığımız text’in ortalanmasını sağlıyoruz. Componentlerimiz hazır.

Gesture Management ve Action list ekleyelim. Action liste çift tıklayarak açalım. Listeye sağ tuş > Standart Action List içerisinden Next TabAction, Previous TabAction, Control Action seçelim. Control Action >name → title action olarak değiştirdik. Standart Action classes da tab grubundan aldığımız için hepsini tab isminde otomatik bir kategorilendirilme yapıldığını görüyoruz.

Gesture Manager: Kullanıcının arayüzde yapacağı parmak hareketlerini algılayan bir component yönetici sınıfı. Bu sınıfın erişimi için tab üzerinde Touch> Gesture Manager alanında Gesture Manager seçerek bağlamasını yapıyoruz. Böylelikle tabControl içerisinde OnGesture olayına çift tıklayıp yazmak istediğimiz event’ı yazıyoruz. Parametre EventInfo’su geliyor.


procedure TForm1.TabControlGesture(Sender : Object const EventInfo: TGestureEventInfo :var Handled :Boolean) ;
begin
 case EventInfo.GestureID  of
  sgiLeft:
   begin
    TabControl.Next;
    Handled:= true;
   end;
  sgiRight:
   begin
    TabControl.Previous;
    Handled:= true;
   end;
 end;
end;

Left bir sonraki sayfaya geç yani tabcontroldeki bir sonraki sayfasına geç analamındadır. Right ise önceki sayfaya gider.

Arayüzümüzü tasarlayalım. Buttonların görüntüsü için object inspectorda > style lookup içerisinde uygun bulduklarınızı kullanabilirsiniz. Biz sol için <  sağ için > sembollerini kullandık. Label’ın action’ına titleActionu bağlıyoruz. TitleActionu execute edebilmek için olayını anlamamız gerek. Butonlara bastığımızda hangi tab aktifse o tab TitleActionda yazsın istiyoruz. TabItemlara isimlendirme yapalım. TabItem1 > name→ 1.adım – TabItem2>name →2.adım- TabItem3> name → 3.adım- TabItem4> name→ 4.adım. Daha iyi bir görüntü için TabPosition > none yaptık. Geçişleri net görebilmek için her bir sayfaya farklı componentler yerleştiriyoruz. Sırayla actionları bağlayalım. Button1> action> Previous TabAction – Button2> action > Next TabAction . Label1> text → lblTitleAction tab geçişlerine göre title’ın güncellenmesi için ActionList> object inspector >OnUpdate çift tıklıyoruz.


procedure TForm1.ActionListupdate(Action : TBasicAction var Handled : Boolean);
var
Ltab :TTabItem;
Begin
Ltab := TabControl.ActiveTab;
İf Action = TitleAction then
LblTitleAction.Text:= Ltab.Text;

Update olduktan sonra aktif tab’ı ele alarak o tab’ın içerisindeki title değerini kontrol ederek label’a atamış olduk. Action tablolarımızda doğrudan hangi actionu yöneteceğini bildirmemiz gerekiyor bunun içinde Next TabAction> object inspector >TabControl de tabcontrol seçtik. Bunu hepsi için uyguluyoruz. Çalıştırıyoruz çalıştığı anda TitleActionda 1.adım yazdığını görüyoruz ve geçişler sağlanıyor güncellemeler yapılıyor.

https://www.youtube.com/watch?v=YYAEDqlW8oo&t=1881s

DataSnap JsonReflect Nedir?

Veri alışverişini Json datasetler üzerinden yapmamızı sağlayan sistem. Bize veri alışverişinin başka uygulamalar tarafından da okunabilir olmasını karşı tarafa Json gönderdiğimiz için bunu başka bir uygulamada açma avantajını sağlar.

https://www.youtube.com/watch?v=WJxg3b_gb7c

JSON NEDİR?

Veri saklama formatıdır.

Veri Saklama ve Transfer Formatları;

  • .csv
  • .xml
  • .json
  • .bson

Json’ın diğerlerinden farkı;

Json(JavaScript Object Notation-JavaScript Nesne Notasyonu) insanlar için okunabilir olan bilgi saklama ve alışveriş formatıdır.

https://www.youtube.com/watch?v=ntQCqpak9dw

Mobil cihazda çektiğimiz bir resmi herhangi uzaktaki bir veritabanına kayıt işlemini öğreneceğiz. Datasnap kullanarak uzaktaki MSSQL veritabanına mobil cihazdan çektiğimiz görüntüyü yazacağız.

https://www.youtube.com/watch?v=aYhpfYFVpkU

File >New >Multi Device Application >Blank Application ilk önce arayüzümüzü tasarlıyoruz.Palette >Tabcontrol1 >align >client. Tabcontrol’e sağ tuş >Item editor > TabItem1 ve TabItem2 ekliyoruz. Palette >Toolbar1 - Grid1 - StringGrid1 - Listbox1 - Toolbar2 - Navigator1 - Navigator2. Toolbar1 >align >top. Grid1> align >top - name →GridDepo. StringGrid1 >align >client - name →gridStok. Listbox1 >align >client - name →LbDepo. Toolbar2 >align >top. Navigator1 >align >left - name →NavDepo. Navigator2 >align >left → NavStok. Formumuzu kaydedelim.

https://www.youtube.com/watch?v=nJKvTfep_Vw

Milli Eğitim Bakanlığı ve Embercadaro arasında imzalanan protokol kapsamında öğretmen ve öğrencilere verilecek olan lisansların kurulumu hakkında bilgi vereceğiz.

https://www.youtube.com/watch?v=kjcsHZeBHrQ&t=447s

ELC Server nedir?

Lisanslama işlemini kendi lokalinizde yapabilmenizi sağlayan lisans sunucusu.Genel olarak akademik kurumlar ve birden çok lisansa sahip şirketler kullanmaktadır. Kullanıcıları takip etme kolaylığı sağlar.Bir ana makine ve diğer client bilgisayarların ulaşabileceği bir network olması gerekiyor.

https://www.youtube.com/watch?v=sErH9dmZKfw&t=2s

Thread Nedir?

Bir proses altında birden fazla işlem yapabilen yapı.Her uygulama bir thread üzerinde çalışır bu main thread olarak adlandırılır.

Neden Thread Kullanılır?

  • İşlem süresi uzun süren işlerde süreyi kısaltmak için
  • Bekleme süresi uzun süren işlemlerde çökmeyi önlemek için
  • Parti yazılımlar ve Port paylaşımlarını düzenlemek için

https://www.youtube.com/watch?v=yoShLlChn-8&t=1355s

FireDAC Nedir?

  • AnyDAC’in Embarcadero “sürüm”ü
  • Universal Data Acces Components

           -Veritabanı geliştirmek için uygulama

           -Delphi ve C++ Builder

  • Yüksek - performans kullanım kolaylığı, kurumsal bağlantı.
  • Universal Data Acces

           -Ancak; birçok belirli veritabanı özelliği ile

https://www.youtube.com/watch?v=6qMDB_72ofo&t=2537s

Neden Multitier (Çok katmanlı)?

  • Ölçeklenebilir
  • Yüksek kullanılabilirlik
  • Güvenlik
  • Hata toleransı
  • İzleme
  • İleti
  • Ön hazırlık

https://www.youtube.com/watch?v=Hq0rBpIiDBk&list=PLtQEDTztkhBf3J7h5kH9odBj-HYZGxdAb&index=4

1-Datasnap Nedir?

  • Datasnap çoklu katman uygulama geliştirmenizi sağlayacak bir orta katman (iş katmanı)’dır.
  • İster masaüstü uygulama geliştirin, ister mobil uygulama geliştirin iş mantığının üzerinde çalıştığı, güvenliğinin sağlandığı, sunumunun sağlandığı katmandır.
  • Kısaca veriye nerede istersen, nasıl istersen öyle ulaşmanın yolu Datasnap teknolojisidir. (Datasnap: Your data where you wabt it, how you want it)

Firma Bilgileri


Camart Araştırma Geliştirme Yazılım Otomasyon San. Tic.Ltd. Şti.

Mersis no : 3356 7133 6775 9746

info@camartarge.com

Vergi Dairse / no : Pamukkale v.d. 196 074 62 30

Tel : +90 850 333 80 20

İban (TL): TR30 0020 5000 0085 3809 5000 03

Arge :

Pamukkale Üniversitesi teknoloji geliştirme bölgesi (Teknokent)

Kınıklı mah. Hüsseyin yılmaz cad. no 67

idari bina d blok no g05 Pamukkale / Denizli

İban (USD):TR03 0020 5000 0085 3809 5001 01


Barbaros Mah. Halk Cad. No 47 / 2 34746 Ataşehir İstanbul

İban (Euro):TR73 0020 5000 0085 3809 5001 02

 
Harita verileri ©2015 Google

İletişim

Facebook Pinterest Twitter Google+ Dribbble