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)

https://www.youtube.com/watch?v=P0WPlVoG0z8&t=1078s

Merhaba bu günkü blog yazımızda Abdullah ILGAZ ile yaptığımız webinar ın içerği hakkına  bilgiler paylaşacağız.

İÇERİK;

  • FMX ve VCL Farklılıkları
  • FMX Komponentleri
  • Yazılımcı için Tasarım Seti
  • Pratik Arayüz Analizi ve Tasarımı
  • Uygulamalı Arayüz Tasarımı

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

Örnek Uygulama

  • 1.Adım
  • Function ve Procedure

 

File > New > Multi Device Application > Blank Application açarak çalışmaya başlıyoruz.

→ Delphi tamamen nesneye yönelimlidir.

→ Siz nesneye yönelik çalışmasanız bile Delphi arka planda bütün nesneleri oluşturur.

Palette> TEdit ekliyoruz > Listbox ekliyoruz. Tekrar forma tıklıyoruz çünkü Listbox içine nesne alabiliyor. 4 Tane TMemo ekliyoruz.

Listbox > Object inspector > Properties > Align→Left.

 Edit  > Object inspector > Properties > Align → Top.

Edit’ e sağ tuş > Items Editor > add item > clear button ve edit button ekledik.

Listbox’  a sağ tıklıyoruz > Items Editor > ListboxGroupHeader > Add Item.

Listbox’ a sağ tıklıyoruz> Items Editor > Listbox Item (5 adet) ekliyoruz.

Listbox’ a eklediklerimizi seçiyoruz(Ctrl ile) > Object inspector > Properties > Text kısmını siliyoruz > Height kısmınıda 40 vererek boyutunu ayarlıyoruz. ListboxGroupHeader1’in Text kısmına Temel Komutlar yazıyoruz. Listbox Itemlara tıklayarak içlerine buton ekliyoruz. Buttonların içinin Align’ ını > client seçerek içinde bulunduğu nesnenin tamamını kaplıyor. Listboxların hepsine aynı işlemi uyguluyoruz. Memodan  Ctrl + C ile 4 tane kopyalıyoruz. Derleyerek Windows görünüşüne bakıyoruz. Button1’e çift tıkladığımızda buttonun OnClick eventında kendisi otomatik bir procedure açıyor ve bunun tanımlamasınıda yapıyor. Bize sadece begin-end arasına komut yazmak kalıyor. Button1 > Object inspector > Properties > Name → BtnTersCevir. Name ile birlikte Text de değişiyor. İstersek Textini değiştirebiliriz. Biz Ters Çevir yaptık(textde Türkçe karakter kullanabiliyoruz). Ters Çevir fonksiyonumuzu yazmak için Ters Çevir butonuna tıklıyoruz.

→Private kısmına yazdığımız functionları sadece bu formda kullanabiliriz.

→Public kısmına yazdığımız procedur ve functionları hem bu formda hemde bu formu çağıran diğer formlarda kullanabiliriz.

Fonksiyonumuzu tanımlamak için biz public’e yazıyoruz.

→Procedure ve Functioun farkı = procedure değer döndürüyor, function değer döndürmüyor.


public
   {Public declarations}
   procedure TersCevir(s: String);

Ctrl + Shift + C ile otomatik olarak headerlar yazılıyor.


procedure TForm1.TersCevir(s: String);
begin
//buraya komutumuzu yazıyoruz.
end;
end.

 

https://www.youtube.com/watch?v=zmO3R2vDfew&t=1527s

• IDE KULLANIMI- MENÜLER

File > Multi Device Application- Delphi > Blank Application(Boş uygulama) açarak çalışmaya başlıyoruz.

Windows VCL Application- Delphi: Sadece windowsta çalışan ve daha önceki delphi sürümlerini de destekleyen bir yapı. Windows’un bütün componentlerini kullanabiliyoruz.

Multi Device Application- Delphi: Firemonkey ara yüzünde uygulama geliştiriyoruz.

Workand> Default Layout> Save Desktop. Uygulama araçlarının gelme şekli, istediğimiz şekilde düzenleyerek kaydediyoruz bu düzeni kaydederek her açtığımızda aynı gelmesini sağlayabiliriz.

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