Delphi ile ERP tavsiyeleri

20 yıldan fazla süredir sektörde bulunan tecrübelere göre Delphi ile yeni bir masa üstü veri tabanı uygulaması(ERP,MRP,CRM,Scada…..) geliştirecek yazılımcılar için bir yol haritası oluşturmak için bu makaleyi hazırladık.

 

 

Bu sürüm son mobil işletim sistemlerine destek ,  Dahili Skia desteği, vcl  ve C++ iyileştirmeleri ve çok sayıda performans iyileştirmesi içeriyor

 Yeni Rad versiyonu RX 11.2. yayınlandı.

 

 

Eğer sisde bu hatayı alıyorsanız

 

Unable to create process: Serving...
All files should be loaded. Notifying the device. Performing Incremental Install
Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLl: /data/app/vmdl1374842139.tmp/base.apk (at Binary XML file line #52): com.embarcadero.firemonkey.FMXNativeActivity: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are presePerforming Streamed Install
adb: failed to install C:\Users\ahmet\OneDrive - Pamukkale
University\Belgeler\Embarcadero\Studio\Projects\EBA\EBA6\Icasyon2\Android64\Debug\Project1\bin\Project1.apk: Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during install PackageLl: /data/app/vmd1230699013.tmp/base.apk (at Binary XML file line #52): com.embarcadero.firemonkey.FMXNativeActivity: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present]

 

AndroidManifest.template.xml dosyasında aşağıdaki değişikliği yapmanız yeterli

27. satıdaki    <activity tag ını  tümüyle bununla değiştirin

 

 

 

        <activity
               android:exported="true"
            android:name="com.embarcadero.firemonkey.FMXNativeActivity"
            android:label="%activityLabel%"
            android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
            android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

 

 

 

 

Günlük hayatta hepimiz çeşitli fotoğraflar çekiyoruz.

Beki bu fotoğraf ve resimleri daha eğlenceli bir içeriğe çevirmeyi düşündünüz mü?

evet çok sayıda kişi bunları düşündü ve çeştili yazılımlar üretti. Bu yazılımlar masaüstü web ve mobil uygulamalar olarak 3 gruba ayrıabiliriz.

 

Peki  En kolay yöntem ne?

Privacy Policy

Last updated: September 16, 2022

This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.

We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the help of the Free Privacy Policy Generator.

 

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 11.2. yayınlandı.
Detaylı bilgiyi aşağıdaki linkten bulabilirsiniz.

RAD Studio 11.2

 

The TWebBrowser Delphi component provides access to the Web browser functionality from your Delphi applications.

 

In most situations you use the TWebBrowser to display HTML documents to the user - thus creating your own version of the (Internet Explorer) Web browser. Note that the TWebBrowser can also display Word documents, for example.

 

A very nice feature of a Browser is to display link information, for example, in the status bar, when the mouse hovers over a link in a document.

 

The TWebBrowser does not expose an event like "OnMouseMove". Even if such an event would exist it would be fired for the TWebBrowser component - NOT for the document being displayed inside the TWebBrowser.

 

In order to provide such information (and much more, as you will see in a moment) in your Delphi application using the TWebBrowser component, a technique called "events sinking" must be implemeted.

 

 

Merhaba uzun süredir bir rest tabanlı sunucular üzerinde çalışıyorum.

Delphi tarafında kullanılabilecek sunucuları hızlıca bir test yaptım ve sonuçları buradan paylaşmak istiyorum.

Testleri aynı rest sunucuya 100.000 isteğin gönderimi ve cevabı dönmesini kapsamkatadır.  Gelen cevap tüm sunucularda aynı {"result":["Hello World"]} şekilinde bir cevap

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

Rad Server Tanıtım Webinarı

Rad Server : Kendi kurumumuza özel bulut sunucu oluşturmamıza yarayan bir platformdur.

Önceden bir tane veritabanı sunucumuz oluyordu bu veritabanı sunucumuzu bir network ortamında paylaşıyorduk. Daha sonra clientlar ile hazırladığımız arayüzle veritabanı sunucusuna bağlanıp veri okuyup veri yazma işlemini gerçekleştiriyorduk. Özellikle mobil sektörün gelişmesi ile beraber mobil platformlarda veri okuyup yazma işi tamamen web serverlara kalmış durumda yani veritabanını direkt bağlantı sağlamıyorsunuz araya bir web servis orta katmanı aracılığıyla kullanıcılarımız arasında iletişim sağlıyoruz sunucudan veri alıyoruz veri yazıyoruz diğer kullanıcılarla iletişime geçiyoruz vb. işlemleri gerçekleştirebiliyoruz.

Birkaç çeşit web servis var ;

soap web servis var xml olarak data alıp veriyorlar.

Json formatında veri alıp veren Restful web servisler var.

Şu anda web servis olarak kullanabileceğiniz en verimli web servisler Restful Json web servislerdir diyebiliriz. Datasnap kısmında çok sayıda Restful web servis uygulaması yapmıştık.  Delphi tarafında Rad Server ve Datasnap arasındaki farklardan biraz bahsedeyim. Rad Server’ın bir önceki ismi EMS’ti (Enterprise mobility services) yani kurumsal mobil servisler aslında yaptığı işleri daha net bir şekilde açıklıyor.

Buna bir örnek verelim. Diyelim ki siz bir mobil kurumsal uygulama hazırladınız ilk yapacağınız ekran kullanıcı giriş ekranıdır. Normal şartlarda bir web servis yazıp kullanıcı adı şifre kontrolü olabilir fakat bu iş burda kalmıyor ilerleyen süreçlerde çeşitli talepler geliyor örneğin apple ve google’ın size verdiği analitik bilgileri görmek isteyebilirsiniz, kullanıcıları bir web arayüzünden yönetmek isteyebilirsiniz kullanım performansları ile ilgili bazı bilgilere ulaşmak isteyebilirsiniz bu tip durumlarda yapı giderek büyüyor ve karmaşık hale geliyor. Mobil tarafta özellikle kullanıcılarınıza bildirim göndermek isteyebilirsiniz ki bildirim işlemi fazlasıyla kompleks bir yapı Rad Server bize bu tip servisleri hazır olarak sunuyor. Kullanıcılarınız her seferinde üye olmak yerine Google, Facebook şifreleriyle giriş yapmak gibi bir sürü şey isteyebilir. Bu varyasyonları arttırabiliriz. Rad Server bize hazır bir bulut sunucu alt yapısı sağlıyor. Bulut sunucudan anladığımız; diyelim biz bir mobil uygulama hazırladık şu anda 100 kişi kullanıyor normal standart bir sunucu işimizi görecekti. Uygulama tuttu 10.000 kişi indirdi uygulama kasmaya başlar, 100.000 kişi indirdi uygulama çöker normal şartlarda ama bulut altyapısı kullanan sunucular Load Balancing yapıyorlar ve iş yükünü çeşitli makinelere dağıtıyorlar ya da çeşitli algoritmalarla bekletme işlemleri yapıyorlar. Bu şekilde kişi sayısı artsa da uygulamanızı kullanmaya devam edebiliyorsunuz.

Rad Server Özellikleri

Ölçeklenebilirlik sağlar : Gelen kullanıcı sayısına göre trafiği yönetme imkanı sağlar.

Veritabanlarının internete açık olmayan bir platformda durmasını sağlayabiliyoruz : Veritabanı bağlantısını kesip sadece lokalden haberleşerek Rad Serverla clientlar arasındaki bağlantıyı sağlayabiliyoruz.

Bulut servisle haberleşme içinde direkt bulut servise bağlanmıyoruz. Rad Server’a bağlanabiliyoruz. Rad  Server gidip bizim yerimize bulut servislere bağlanabiliyor.

Rad Server için gerekli olan bileşenler;

Rad Studio, Delphi or C++ Builder Enterprise or Arthitect

Testing and Deployment Licenses

FireDAC Supported Databases

Deployment Platforms

Web Servers

 

Rad Server Teknik Mimarisi

 

Burda gördüğümüz gibi client’larımız mevcut Clientlarımızda HTTP ve HTTPS protokolleri vasıtasıyla Rest API’lerini Rad Server’a iletiyor Rad Server LAN üzerinden TCP ile interbase yada diğer veri tabanlarıyla haberleşiyor. Burada dikkat etmeniz gereken şey Rad Server kullanıcı bilgilerini interbase veri tabanında tutuyor yani dolayısıyla Rad Server’ın yanında Mssql, Oracle ve başka veri tabanları kullanabilirsiniz ama interbase kurulmalı. Daha sonra Rad Server Console vasıtasıyla analitik bilgileri ve diğer bilgilerini web arayüzünde  ya da konsol üzerinden işleme imkanı mevcut oluyor.

Rad Server kullanarak bir uygulama yaparken hangi aşamalardan geçiyoruz

  • Restful web service API oluşturuyoruz.
  • API’mizi diğer bulut servisleriyle haberleştirebiliyoruz.
  • Oluşturduğumuz servisleri çeşitli uygulamalara ekleyebiliyoruz.
  • Kullanıcı yönetiminde Rad Server üzerinden yapma imkanımız var.
  • Rad Serverla hazırladığımız uygulamayı amazon, azure gibi çok sayıda bulut sunucu üzerinde çalıştırma imkanımız var.
  • Kullanıcıların analitik bilgilerini yani Rad Serverda giriş çıkış yapan kullanıcıların analitik bilgilerini API kullanım bilgilerini gizleyebileceğimiz bir portal ekranımız var. Web tabanlı ekrandan girip web server performansını anlık değerlendirmelerini izleyebiliyoruz.
  • Bir tane client ekranı hazırlayabiliyoruz Delphi, C++’da ya da Json Restful API kullanabilen herhangi bir programlama ortamında kullanma imkanımız mevcut.

 

File > New > Others > Rad Server > Rad Server Package seçiniz. Açılan ekranda >Create package with resource seçiyoruz ve next tıklayarak sonraki ekrana geçiyoruz.

Dosya adını giriyoruz biz WebinarTest dedik >Next tıklayarak sonraki ekrana geçiyoruz.

Hangi işlemler kullanılsın kısmı için hepsini işaretliyoruz ve >next diyoruz.

Connection name için kendinize uygun olanı seçiniz. Bağlantılı tablolarınızı da seçip finish diyoruz ve Delphi bizim için hazır bir Rad Server uygulaması oluşturdu. Çalıştırıyoruz açılan form ekranında Open Browser’a tıklayarak sunucunun çalışıp çalışmadığını kontrol edebiliriz. Open console’a tıklayarak web konsolumuzu açabiliriz kullanıcı bilgilerini görebileceğimiz. Burada istenilen kullanılan bilgilerimizi standart modda Rad Server kurulma esnasında geliyor bize, gerekli alanları dolduruyoruz. Enter’a bastıktan sonra Rad Server ana ekranımız açılıyor.

Sol tarafta gördüğümüz menüde Rad Server ile ilgili yönetim bilgilerine ulaşabileceğimiz seçenekler bulunuyor.

Rad Server’a giriş yapmış kullanıcıları görebiliyoruz.

Kullanıcıları gruplandırabiliyoruz.

Analitik özelliği mobil uygulama ve clientlar ile ilgili detaylı bilgiler verir.

 

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.

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