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.
File >New > Others > DataSnap Server >ok açılan pencerede windows işaretli >next -Forms Application >next - VCL Application >next - Sonraki ekranda; TCP/IP - Server Methods Class - Sample Methods seçtik >next. Test port’a tıklayarak kontrol ediyoruz >next - TDSServerModule >Finish. Delphi DataSnap Server’ı bizim için oluşturdu. Uygulamamızı kaydediyoruz, project1.dproj→DsServerPhoto. DsServerPhoto.exe >sağ tuş >add new >Database > Datamodule oluşturuyoruz. Datamodule’ümüzü kaydedelim. unit2.pas→uDmod - Datamodule >name →dMod. Datamodule’e koyduğumuz nesneleri ServerMethods’ a koyarakta kullanabiliriz fakat karışık olmaması için datamodule ekliyoruz.uDmod >Palette >FDConnection1 - FDQuery1. FDConnection’a çift tıklıyoruz açılan pencerede Driver ID: MSSQL , Database, server kısmınıda dolduruyoruz. OSAuthent > yes, test’e tıklıyoruz kontrol ediyoruz >ok pencereyi kapatıp kaydediyoruz.FDConnection1 >name →con - FDQuery1 >name →qKayıt. Veritabanımızın içinde ad soyad string tablomuz var birde BlobField’imiz var. BlobField ile mobil cihazdan çektiğimiz resmi DataSnap Server aracılığı ile veritabanımıza yazacağız. FDQuery’ çift tıklıyoruz açılan pencereye → select*from TBL_KAYIT >execute, alanlarımız geliyor >ok. Alanları çekmek için qKayıt >FieldEditor > açılan pencerede sağ tuş > add all fields, alanların geldiğini görüyoruz.DataSnap Clientler DataSnap Server ile ServerMethodsUnit aracılığı ile haberleşirler ServerMethodsUnit’e yazdığımız functionlar ve procedureler clientler tarafından çağrılırlar.Datamodule’e yazdığımızı çağıramıyoruz bunun için ServerMethodsUnit’e DataSetProvider ekliyoruz.Use unitden server methods’umuzu data module’e tanıtıyoruz. DataSetProvider >name →dspKayit. dspKayit >object inspector > DataSet >dMod.qKayit artık clientlerimiz Datamodule’de ki querylerimize erişebilir. Sunucu kısmımız tamamlandı çalıştırıyotuz. Sunucumuz aktif, connection ve query’i elle açıyoruz. Önemli bir nokta; DataSnap Clienti yazarken sunucu sunucusu mutlaka açık ve client’i yazdığımız makine tarafından erişilebilir olmalı. Con ve query’e active →true işaretliyoruz. DataSnap server’ı çalıştırıp açık bırakarak clienti yazmaya başlıyoruz.
ProjectGroup1 > sağ tuş > add new project > multi device> blank application açıyoruz. Kaydediyoruz, unit2.pas→uMainClnt - Project1.droj →PhotoClint - ProjectGroup1.grouproj →DsPhoto . Clientin arayüz tasarımı; uMainClint >Palette >Toolbar1 > Toolbar’ın içerisine button ekledik. Button1 >align >left. Buttona isim yerine simge verelim bunun için button1> object inspector >Style Lookup >camerabuttonbordere simgesini seçiyoruz. Palette >Layout> align >center. Layout’un içerisine Image yerleştiriyoruz, kameradan çektiğimiz görüntüyü ekrana gösterebilmek için. Image >align >client. Palette >Listbox ekliyoruz veri gireceğimiz diğer alanları ve buttonu yerleştirmek için. Listbox>align >bottom. Listbox > sağ tuş >Items Editor >3 adet ıtem ekledik. 3 Item’ı seçip textlerini siliyoruz, Height >40 ayarlıyoruz. LisboxItem 1 >edit1 ekledik > label1 ekliyoruz- LisboxItem 2 >edit2 > label2 ekliyoruz - LisboxItem 3 >button2. Label1 >text → Adı - Label2 >text → Soyadı. Edit 1 ve 2 >align >client. Button2 > align > client. Btuuton2 >name btnKaydet. Kamera componenti ekliyoruz, mobil cihazdan aldığımız görüntüyü bize verecek. Palette >CameraComponent1 >name > Camera. Üzerine çift tıklayarak eventlarına ulaşıyoruz.
public
{Public declarations}
procedure ResimAl;
end;
procedure’e ResimAl tanımladık çünkü thread ile resim almak daha güvenli.
procedure TForm2.ResimAl;
begin
Camera.SampleBufferToBitmap(Image1.Bitmap True);
end;
end.
Design >Camera > Events >SampleBufferReady . Veri alma işlemini sycnhronize ve thread’in içinde yapacağız.
procedure TForm2.CameraSampleBufferReady(Sender :TObject ; const ATime : TMedia Time);
begin
TThread.Synchronize(TThread.CurrentThread, ResimAl);
end;
Thread’i tanımladık, Thread ile ilgili detaylı bilgi almak için Thread ile ilgili yazımıza bakabilirsiniz. Kamera simgesinin olduğu butonumuza tıklayarak kod satırımıza gidiyoruz kamera açama kodumuzu yazmak için.
procedure TForm2.Button1Click(Sender : TObject);
begin
if Camera.Active then
Camera. Active := False
else
Camera.Active :=True;
end;
Kamera açıksa kapa, kapalıysa aç şeklinde basit bir if-else kodu yazdık. Şimdiye kadar yazdığımız kodlar kameradan gelen görüntüyü kaç tane gönderdiysek image nesnesinin bitmap’ine o kadar basıyor. Çalıştırarak windows üzerinde çalışmasını görebiliyoruz. Buraya kadar olan kısımda client tarafında veritabanı bağlantısı yapmadan kısa kodlar ile görüntüleri bitmap’e aktardık.
Datasnap kısmını yazmaya başlıyoruz. Datasnap Server ile DataSnap Clientler arasındaki bağlantıyı TSQLConnection kullanarak yapacağız. TSQLConnection nesnesinin driver kısmını datasnap seçersek datasnap ile ilgili parametreler gelecektir. Palette >SQLConnection1 ekliyoruz -Driver > datasnap seçtik - HostName’e Ip’mizi yazıyoruz(mobil cihaza aktarınca sunucuyu bulabilmesi için Ip yazmamız gerekiyor. )Eğer internette açık bir sunucu hizmeti alıyorsanız internetteki Ip’nizi yazmalısınız. Datasnap server ve Datasnap Client arasındaki bağlantı sağlandı. Palette > DSProvider Connection. ClientDataSet ile Datasnap Server arası bağlantı için DsProvider Connection ekledik. DsProvider Connection >Server Class Name →TServerMethods1. Palette >ClientDataSet1 >name →cdsUye - Remote Server →DsProviderConnection - ProviderName →dsp_Kayit. cdsUye >sağ tuş >Fields Editor > Fieldleri çekiyoruz connectionların false olup olmadığını kontrol ettikten sonra kod yazmaya başlıyoruz. btnKaydet’e çift tıklıyoruz;
procedure TForm2.btnKaydetClick(Sender : TObject);
var
ms: TMemoryStreans //nesnemizi stream nesnesi içine alacağız.
begin
if not SQLConnection1.Connected then
SQLConnection1.Open;
if not cdsUye.Active then
cdsUye.Open;
cdsUye.Insert;
cdsUyeADI.Value := EditAd.Text;
cdsUyeSOYADI.Value := EditSoyad.Text;
try
ms:= TMemoryStream.Create;
ms.Position :=0;
if Camera.Active then
Camera.Active :=False;
Image1.Bitmap.SaveToStream(ms); //resmi stream’e yaz diyoruz.
ms.Position := 0;
cdsUyeFOTO.LoadFromStream(ms); // Stream içerisindeki bilgiyi datasnap’e aktarabilmek için loadfrom fonksiyonu kullanırız.
finally
end;
Stream’i kameradan resmi alıp bir stream’e kaydedip bunuda uzaktaki veritabanına kaydetme işlemini tamamlamış oluyoruz. Uzaktaki bir stream’i alıp ekranda bir yere yazarak tam tersinide yapacağız. Çalıştırıyoruz Ad Soyad girip kameradan kayıt alıyoruz.
Şimdi tam tersini yapacağız uzaktaki uzaktaki bir veritabanında bir stream içerisinde blobField de stream kayıtlı bu strem’ı alıp mobil uygulamamızdaki bir bitmapte , image nesnesinde gösterme kısmını yapabiliriz az önce yaptığımız işlemlerin tama tersini yaparak. İlk olarak bir button ekleyelim buttonu yerleştirmek için Listbox’ımıza bir adet daha ListboxItem4 ekliyoruz. Text’ini siliyoruz, Height >40. Palette > Button2 > align >client - name >btnDbDenOku. BtnDbDenOku’ya çift tıklıyoruz kod satırına gidiyoruz. Öncekiyle birkaç farkı olan çok benzer kodlar yazacağız. Datasnap server’ın blobFieldinde bulunan stream’i alıp bu stream nesnesini image’e okutuyoruz. Gelen bir resimse image düzgünce okuyacaktır resmi.
procedure TForm2.btnDbDenOkuClick (Sender : TObject);
var
ms: TMemoryStream;
begin
if not SQLConnection1.Connected then
SQLConnection1.Open;
if not cdsUye.Active then
cdsUye.Open;
if cdsUye.RecordCount >0 then
begin
cdsUye.Last;
EditAd.Text:= cdsUyeADI.Value;
EditSoyad.Text:= cdsUyeSOYADI.Value
try
ms: TMemoryStream.Create;
ms: Position:= 0; //Yanlış yerden okumaya başlamaması için position:= 0
cdsUyeFOTO.SaveToStream(ms);
ms.Position:= 0;
Image1.Bitmap.LoadFromStream(ms);
finally
end;
end;
end.
Uygulamamızı mobil cihaza gönderiyoruz. Target Platforms >Target >Cihazımızı seçiyoruz, uygulamamız yükleniyor. Uygulamamızı çalıştırıyoruz. Kamerayı açama butonundan açıyoruz verilerimizi girip kaydediyoruz.Uygulamamızı kapatıp açıyoruz verinin gidip geldiğini görüyoruz.