Delphi XE5 - XE6 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Delphi XE5 - XE6 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

23 Ağustos 2014 Cumartesi

Delphi Android Foreground

Merhabalar,

Sizelere bu sefer biraz cihazda görsellik yaratacak ve projenizi daha profesyonel gösterecek bir şeyler hazırladım. Bunun tam olarak ne olduğunu anlamak için  "Android Foreground" kelimelerini Google üzerinden aratıp tam anlamlı açıklamalara erişebilirsiniz ben eksik bilgi verip kafanızı karıştırmak istemem.

Bu işleme yaptığım bir örneğin resmini koyarak tam anlamı ile göstermek istiyorum.

Resim 1

Resim 2

Kodların orjinalini Embarcaderonun formunda bir soruya verilen cevaptaki linten indirdim fakat çoğu zaman üşengeç bir millet olduğumuzdan bütün bu .pas dosyalarını projeye dahil edecez de ayarlamaları yapacas da bizim için büyük iş :)
Bende bunları düşünerek bütün pas dosyalarını 1 component üzerinde birleştirdim ve yapmamız gereken sadece componenti tutup formun üzerine bırakmak ve .StartService proceduresini çalıştırmak.

Eğer biraz meraklıysanız ve android arka plan servisleri ile ilgili uygulamalar geliştirmek isterseniz .pas dosyalarının içeriğini karıştırmanızı öneririm. Çünkü hazırlayan arkadaş android cihazın yaptığı yayınları yakalama gibi olayları güzelce anlatmış orada.



Ek olarak yapılması gereken 2 ayar vardır bunlar:



2-) AndroidManifest.template.xml ayarı

Bu "AndroidManifest.template.xml" ayarı için yapılması gereken

1-) Manifest dosyasını açınız.

2-)
<receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm"/>
satırını bulunuz ve hemen altına boş bır satır açarak vereceğim metini yapıştırınız.

3-) <service android:name="com.barisatalay.foreground.ForegroundServis"
                 android:persistent="true"
                 android:enabled="true">
        </service>

4-) Eğer doğru olarak eklediyseniz kodlar bu resimdeki gibi gözükmeli.



5- ) Resimdeki şekilde projemizi önce Clean sonra Compile yapıyoruz


Tüm bu işlemleri tamamladığınızda Foreground olayının başarı ile çalıştığını göreceksiniz.

Bütün bunlarda da hata yapma olasılığınızı düşünerek component klasörlerinin içerisine "Demo" adında klasörde sizler için örnek bir proje hazırladım.

İyi çalışmalar.

Delphi Classes.dex Deploy

Merhabalar,

Bu  yazı "Delphi Android Foreground" başlığı için bir ara yazıdır ve burada android cihaz için classes.dex dosyasını nasıl deploy edildiğini öğreneceğiz.

İşlemlerimize resimleri takip ederek devam ediyoruz.

1-) sırasıyla adımları izleyerek projemizi daha önce compile etmediysek bu işlemler ile gerekli dosyaların yaratılmasını sağlıyoruz.


2-) Project>>Deployment seçerek gerekli menü açılır





 3-) 
1- numarada gördüğünüz satır orjinal delphinin hazırlamış olduğu classes.dex dosyasıdır ve onun seçimini iptal ediyoruz.

2- 2 numarası ile gösterilen  yere tıklayıp component dosyalarının içerisindeki "dex" klasörünün içerisindeki "classes.dex" dosyasını seçiyoruz.

3- Mavi ile seçili satır yüklediğimiz classes.dex dosyasıdır ve sizdeki ayalarında aynı bu resimde gördüğünüz gibi olması için gerekli düzenlemeleri yapın.

4-) Deploy butonuna basarak işleminizi tamamlayın.

19 Ağustos 2014 Salı

Delphi Formdaki nesnelerde gezinti

Merhabalar,

Zaman zaman lazım olan ve çabuk unutulan bir işlemi unutmamak için paylaşmak istiyorum.

Amacımız formdaki nesneler arasında taborder'larına göre yön tuşlarıyla veya tab tuşuyla gezinti.

1-) Formun KeyPreview özelliğini True yapınız

2-) Formun Object Inpector'den "ActiveControl" seçeneğinde ilk olarak hangi nesnede olmasını istiyorsanız onu seçin.

3-) Formun "OnKeyDown" eventine aşağıdaki kodu yazınız.

if (Key = VK_RETURN) or (Key = VK_DOWN) then SelectNext(ActiveControl,True,True);
if Key = VK_UP then SelectNext(ActiveControl,False,True);

13 Ağustos 2014 Çarşamba

XE6 PushEvents ve KinveyProvider Kullanımı

Merhabalar,

Aslında pek ilgi olmadığı için blogda paylaşım yapmayı bıracaktım, fakat Tahsin abi sağolsun arayıp paylaşımlardan dolayı teşekkür etti ve bende takip eden olduğunu anca o zaman farkına varmış oldum. Tahsin abiye selamlar buradan.

Gelelim asıl konumuza;

Bir çok arkadaşımız veritabanı entegreli uygulamalar yapmakta bunların çeşitli türleri mevcut google play üzerinde. Uygulamalarımız kullanıcı karşısına çıktıkça yenilenmeden duramayacağı için kullanıcılara bildirimler yapılması şarttır.
Bu bildirimleri Mail, Sms vs. birçok yöntemle yapabilirsiniz.
Ama bunların daha iyisi olarak android dünyasının bizlere sunmuş olduğu "Notification" olayı mevcuttur. Delphi XE5 ile bu işlemi Embarcadero bizlere component tadında sunmuş ve işlerimizi kolaylaştırmıştır. Fakat bence unuttular veya yetiştiremediler şöyle birşey var ki uygulama kapalı olduğu zamanda bu componentin çalışmaması başta bizleri hayal kırıklığına uğratmıştı.

"Brian Long" adlı geliştiricinin bloğunu inceleyenler bu kişinin bir takım java kodlarını delphi proje ile beraber derleyip background servisi yazdığını görmüştür fakat ben bir türlü tam anlamı ile anlayamamış ve o background servisi ile uygulamamdaki Notification componentini tetikleyememiştim.

Embarcadero XE6 sürümü ile bize birtakım componentler daha sunmuştur "BAAS Client" grubu altındaki bu componentler bizlere biraz önce bahsettiğim notification olayını Kinvey.com(Android) veya Parse.com(IOS) aracılığı ile hiç uğraşmadan kolay bir şekilde tetikliyebilmemizi sağlamaktadır.
Bu işlemide Google android mesaj servisi sayesinde yapmaktadır.

İşin kısası: Masaüstündeki exeden mesajınızı ve başlığını yazıyorsunuz Mobil cihazınıza bildirim olarak düşüyor :)

Neden bu kadar şeyi açıklama gereği duydum bende bilmiyorum fakat parmaklar yazdı derler ya o oldu işte.

Projemize ilk önce "Kinvey.com" da üyelik aldığınızı varsayarak başlıyorum. Daha bunu yapmayanlar için biraz önce yazdığım makaleden yararlanabilirler
Linki: http://brsatalay.blogspot.com.tr/2014/08/kinveycom-uyelik-alma-ve-kullanc.html


Gerekli Componentleri aşağıdaki resimde görebilirsiniz.



Öncekle 1 şey yaptırmak istiyorum tabi tercihe kalmıs KinveyProviderin aktif olayını istediğiniz gibide yapabilirsiniz ben checkboxun click olayı ile bağlamak istiyorum.

Toolbardan "View" sekmesine tıklayınız ve açılan menüden "LiveBindings Designer"i açınız aşağıda bir bölüm açıldıgını göreceksiniz.

Bu bölümde yapmanız gereken tek birşey var Chekbox'un altındaki "IsChecked" yazan yeri mouse ile tutup "PushEvents" ın Active yazan yerinin üstüne bırakmanız yani arada bir köprü(link) oluşturacas ki entegre calıssın.

Şimdi bu ekrani  kapatabilirsiniz.

"PushEvents" componentinin  "AutoActive" özelliğini false yapalım ki bu checkboxla aktifleştirelim



Ekranda gördüğünüz resimdeki KinveyProvider componentinin bazı ayarları vardır sıradaki işlemimiz önceki konularda oluşturdugumuz hesaplar ve kodları bu providere tanımlamak.

GCMAppOD = http://brsatalay.blogspot.com.tr/2014/08/google-messaging-service-ayarlamalar.html
Bu linkteki  2. resimdeki "Project Number"

AppKey, AppSecret, MasterSecret = Kinvey.com girişinde sağ alta mevcuttur

Örnek


Username, Password = http://brsatalay.blogspot.com.tr/2014/08/kinveycom-uyelik-alma-ve-kullanc.html adresindeki konuda oluşturduğumuz kullanıcıdır.


Resimdeki gibi Atamaları yapınız




Evet sıradaki atamaları bitirdiğimize göre sıradaki işlemimiz bu servisin yayınladığı mesajı yakalamaktır.

Java kodlarında olsa bir yığın kod yazmamız gerekecekti fakat işte delphiyi bu sebeble seviyorum bizim için zaman kaybetmememiz için standart kodları kendi hallediyor.

Evet olayı bölmeden devam..

"PushEvents" componentinin Event sekmesine gelerek sırayla eventlerimizi tanımlayalım.

procedure TMainScreen.PushEventsDeviceTokenRequestFailed(Sender: TObject; 
const AErrorMessage: string); 
begin //DeviceTokenRequestFailed Eventi hata anında tetiklenir.
  Memo1.Lines.Add('Hata Var!');
  BildirimMemo.Lines.Add(AErrorMessage);//Bu değişken sayesinde dönen hata mesajını yakalayabilirsiniz.
  BildirimMemo.Lines.Add('');
end;

procedure TMainScreen.PushEventsPushReceived(Sender: TObject; 
const AData: TPushData);
begin//Sorunsuz iletişim anında burası tetiklenir.
 BildirimGonder(AData.Message);//Bu değişkene Kinvey.com adresinden gönderdiğiniz mesaj gelecektir.
end;

procedure TMainScreen.BildirimGonder(T: String);
var
  Notification: TNotification;
begin
  if NotificationCenter.Supported then
  begin
    Notification := NotificationCenter.CreateNotification;
    try
      Notification.Name := 'Mesaj Başlığı';
      Notification.AlertBody := T;
      Notification.FireDate := Now;
      NotificationCenter.ScheduleNotification(Notification);
    finally
      Notification.DisposeOf;
    end;
  end
end;


Evet kod kısmımız  *.pas dosyası içerisinde bu kadar sorabilirsiniz "BildirimGonder" proceduresini neden tanımladın sebebi şu:

Uygulama kapalıyken bildirim sekmesine ileti düşer fakat uygulama açıkken herhangi bir "Notification" algısı çalışmadığı için bu işlemi manuel olarak yapmamız gerekmektedir.

Sıradaki işlemimizde "AndroidManifest.template.xml" içerisine uygulama izinleri ve servis ayarları gibi atamaları yapacağız.

"AndroidManifest.template.xml" dosyasını açıyoruz ve "<%uses-permisson%>" metini bulup altına biraz yer açıyoruz ki şu kodları yapıştırabilelim..


<!-- GCM connects to Google Services. -->

    <uses-permission android:name="android.permission.INTERNET" />



    <!-- GCM requires a Google account. -->

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />



    <!-- Keeps the processor from sleeping when a message is received. -->

    <uses-permission android:name="android.permission.WAKE_LOCK" />



    <!--

     Creates a custom permission so only this app can receive its messages.



     NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE,

     where PACKAGE is the application's package name.

    -->

    <permission android:name="%package%.permission.C2D_MESSAGE"

    android:protectionLevel="signature" />

    <uses-permission android:name="%package%.permission.C2D_MESSAGE" />



    <!-- This app has permission to register and receive data message. -->

    <uses-permission

    android:name="com.google.android.c2dm.permission.RECEIVE" />



Nedir bu kodlar derseniz permission yazısından anlayabileceğiniz gibi kullanacağımız işlemlerin izinleridir bu şekil manuel ayarlamak yerine Delphi içerisinden seçerekte atayabilirsiniz tercih size kalmış.


Şimdi biraz aşağılardaki

</intent-filter>

        </activity>


kodları bulun ve hemen altına şu kodları yapıştırın.

<receiver

      android:name="com.embarcadero.gcm.notifications.GCMNotification" android:exported="true"

      android:permission="com.google.android.c2dm.permission.SEND" >

        <intent-filter>

          <action android:name="com.google.android.c2dm.intent.RECEIVE" />

          <category android:name="%package%" />

        </intent-filter>

      </receiver>



Bu kodlar yanlış anlamadıysam google messaj servisinden gelen yayını dinliyor

Son olarak şu kodu ekleyiniz.

<service android:name="com.embarcadero.gcm.notifications.GCMIntentService" />


Sıradaki ve son işlemimiz Mesajımızı göndermektir :)

Bu işlem için Kinvey.com'a giriyoruz ve resimdeki adımları izleyerek Mesaj gönderme ekranına geliyoruz.



Aşağıda gördüğünüz yerdeki yazı alanına istediğinizi  yazarak uygulamanızın kapalı oldugu cihaza notification bildirimi gönderebilirsiniz.



Makalelerimi takip ettiğiniz için teşekkürler. Pek takip eden olduğunu var saymıyorum ama ilgi gösterilirse bu notification gönderme işlemini masaüstü bilgisayardan nasıl gönderildiği ile ilgili yazı yazabilirim isteğe bağlı..

Bu resimde gönderdiğimiz metni görebilirsiniz :)

Kinvey ile Google Cloud Message entegrasyonu

Merhabalar,

Bu yazımda BAAS Client componentleri için ara yazıdır. Bu yazıda Kinvey ile Google Cloud Message entegrasyonu ara konusuna değineceğiz.

Peki bu entegrasyon ne için gerekli ben makalelerimde sadece Push Notification olayı için anlatacağım fakat googlenin sağladığı bütün servisler için geçerli oldugunu bilmeniz yeterlidir örneğin konum servisleri.

Adım 1: Kinvey.com giriş yapılır. Resimdeki adımlar izlenir.



Adım 2: Soldaki Configuration bölümü seçilir ve Sağda açılan "Google Cloud Messaging Configuration" Formu doldurulur.



Buradaki verileri http://brsatalay.blogspot.com.tr/2014/08/google-messaging-service-ayarlamalar.html linkindeki makaleden alıcas.

1. Edit = Linkteki 2. resimi incelediğinizde nereden alıcağımızı görebilirsiniz doğru yeri kopyalayıp yapıştırınız.

2. Edit = Linkteki son resimdeki "API Key" dir ve oradan kopyalayıp yapıştırınız.

Bilgileri girince aşağıya buton geldiğini göreceksiniz tıklayarak kayıt ediniz.

Entegrasyon işlemimiz bu kadar.


Google Messaging Service Ayarlamaları

Merhabalar,

Bu yazımda BAAS Client componentleri için ara yazıdır. Bu yazıda "Google Cloud Message API" için key oluşturacağız.

https://console.developers.google.com/project

Adresine giriş yapılır ve sol üsteki "Create Project" butonuna basarak ekranın ortasında açılan form doldurulur.



1. Edit yöneteceğiniz proje adıdır.
2. Edit uniq bir degerdir begenmesseniz yanındaki yenileme butonuna basmanız yeterlidir. "Create" butonuna basılarak devam edilir.

projeyi oluşturduğu zaman aşağıdaki resimdeki ekran karşınıza gelir bu ekranda size lazım olacak 2 değer vardır bunu bir yere not ediniz veya tekrar buraya gelip bakabilirsiniz

bunlar kırmızı kutu içerisine aldığım "Project ID" ve "Project Number" dir.



Aşağıdaki resimde göreceğiniz gibi soldaki menüden "APIS & AUTH >> APIS" tıklayarak açılan Listede "Google Cloud Messaging for Android" seçeneğini "ON" yani aktif duruma getiriniz.



Ardından yine soldaki menüden "Credentials" seçeneğine tıklayarak "CREATE NEW KEY" butonuna basınız. Açılan Ekranda "Server Key" tıklayarak gelen ekrandaki metin kutusuna "0.0.0.0/0" değerini girmeniz kafidir.



Bu sayede aşağıdaki resimde gördüğünüz gibi "API KEY" elde etmiş olduk.

Kinvey.com Üyelik alma ve Kullanıcı oluşturma

Merhabalar,

Bu yazımda BAAS Client componentleri için ara yazıdır. Bu yazıda "Kinvey.com" üzerinde kullanıcı developer olarak hesap açarak servisleri kullanması için kullanıcı oluşturacas.

Adım 1:
http://console.kinvey.com/ adresine girilir ve aşağıdaki form ile giriş bilgileri oluşturulur.


Adım 2:

"Sing Up" butonuna bastıkdan sonra aşağıdaki ekran karşınıza gelir ve "What's your app called?" bölümüne panelde yöneteceğiniz uygulama adı yazılır  ve aşağıdan "Other >> REST API" seçenekleri seçilir ve butona basılır


Adım 3:
 Dashboard ekranında aşağıdaki resimde gördüğünüz gibi sol üsteki "Addons" yazısına tıklanır ve açılan ekrandan "Core >>> Users" seçilir.


Adım 4:
Sıradaki karşımıza gelen ekranda sol menüden "Add User" tıklanarak bilgilerin girileceği ekran sağ tarafta mevcut hala gelir

Resimde göreceğiniz gibi ekrandaki yerleri kırmızı renkle yazdım ve bir sonraki makalemizde bu bilgileri kullanarak örnekler yapacağız


Bu işlem bu kadar basit.
Artık Kinvey.com üzerindeki REST API leri kullanmak için bir Kullanıcınız var

6 Ağustos 2014 Çarşamba

Delphi Mobile ve FireMonkey Flat Button Componenti

Merhabalar,

Embarcaderonun bizlere sunmuş olduğu TButton componenti malesef benim ihtiyaçlarımı tam olarak karşılayamamaktadır.

Öncelikli sebebi TButtonun şeffaf olmasıdır.

Bu sebebden dolayı "TFlatRectButton" adını vermiş olduğum componenti yazma ihtiyacı duydum. Bu component "TRectangle" nesnesinden türetilmiştir.

Bu "TFlatRectButton" componenti biraz acemi işi oldu fakat bana buton üzerinde istediğimi yapma özelliği sundu.

Güncel Proje Linki : https://code.google.com/p/delphi-mobile-flat-button/

İndirme Linki [06/08/2014] : http://s3.dosya.tc/server26/IzVFLm/FlatButtonSet.rar.html

FmxExpress: http://www.fmxexpress.com/free-flat-rectangle-icon-button-component-for-delphi-xe6-firemonkey-on-android-and-ios/




Bunlar nelerdir?
Resimde kullanacağımız 2 özelliği çizerek gösterdim.




1- ) "Text"

Bu özellik adından da anlaşıldığı gibi butonumuzun üzerinde gözükecek olan metindir.

2-) "Settings"

Kullanacağımız özellikleri "Settings" başlığı altında topladım.
Bunlar:

"ButtonSettings": 
  Bu bölümde butonun renk ayarlarını yapabilirsiniz.
  Eğer butonun üzerine geldiğinizde renginin sizin belirlediğiniz bi renk olmasını istiyorsanız "IsHoverColor" rengini değiştirin.
 Eğer butona tıkladığınızda butonun rengi sizin belirlediğiniz bi renk olmasını istiyorsanız "IsPressedColor" rengini değiştirin.

"IconSettings":
Bu bölümde button içerisinde kullanacağınız resim ayarlarını yapabilirsiniz.
  Icon : Butonda gözükecek olan resim.
  Align: Butona eklenmiş olan resimin butonda hangi pozisyonda duracağını seçmelisiniz.

"TextSettings":
Bu bölümde butonda gözükecek olan metinin ayarlarını yapabilirsiniz.
  Font: Gözükecek olan metinin standart font ayarlarını yaptığınız bölümdür.
  TextColor: Gözükecek olan metinin rengini buradan ayarlayabilirsiniz.
  TextHorizontal: Gözükecek olan metinin yatay olarak hizalamasını buradan ayarlayabilirsiniz.
  TextVertical: Gözükecek olan metinin dikey olarak hizalamasını buradan ayarlayabilirsiniz.

Örnek Butonlar





31 Temmuz 2014 Perşembe

Formun handle ile eventini yakalama

Merhabalar,

Kolay bi olay fakat her zaman ki gibi unutup tekrar aramamak için bloğumda yayınlıyorum :)

Olayımız delphinin bize sunduğu eventler haricinde eventleri yakalamaktır.

XE5 ile test ettim sorunsuz çalışmakta. Eğer ekli değilse "Winapi.Windows, Winapi.Messages" Kütüphanelerini eklemenizi rica edicem.


  
//Tanımlanması gereken procedure 
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;


procedure TMainForm.WMSysCommand(var Msg: TWMSysCommand);
begin
  if (Msg.CmdType = SC_MINIMIZE) then
  begin
//Burası eğer küçültme işlemi yapılırsa ne yapmak istediğiniz.
  end;

   DefaultHandler(Msg) ;
end;



Sizlere "SC_MINIMIZE" haricinde kontrol edebileceğiniz eventleri aşağıda yazmış bulunmaktayım artık gerisi amaca hizmet edecek olan kodlardır.


SC_SIZE = 61440;
SC_MOVE = 61456;
SC_MINIMIZE = 61472;
SC_MAXIMIZE = 61488;
SC_NEXTWINDOW = 61504;
SC_PREVWINDOW = 61520;
SC_CLOSE = 61536;
SC_VSCROLL = 61552;
SC_HSCROLL = 61568;
SC_MOUSEMENU = 61584;
SC_KEYMENU = 61696;
SC_ARRANGE = 61712;
SC_RESTORE = 61728;
SC_TASKLIST = 61744;
SC_SCREENSAVE = 61760;
SC_HOTKEY = 61776;
SC_DEFAULT = 61792;
SC_MONITORPOWER = 61808;
SC_CONTEXTHELP = 61824;
SC_SEPARATOR = 61455;

19 Temmuz 2014 Cumartesi

Delphi Ekrandaki bütün pencereleri listeleme

Merhabalar,

Zaman zaman lazım olup kaybettiğim bir kod parçasıdır kaybolmaması için buraya yazıyorum.

Amacı o an ekranda açılan olan uygulamaların Başlık bilgilerini "TStrings" içerisine aktarmasıdır.


procedure GetDesktopWindows(List: TStrings);
var
  hDesktop,
  hWindow: Hwnd;
  Buffer: array[0..255] of char;
begin
  hDesktop := GetDeskTopWindow;
  hWindow := GetWindow(hDesktop, GW_CHILD);
  while hWindow <> 0 do begin
    GetWindowText(hWindow, Buffer, 255);
    if (Buffer <> '') and (IsWindowVisible(hWindow) > False) then
      List.Add(Buffer);
    hWindow := GetWindow(hWindow, GW_HWNDNEXT);
  end;
end;


//Kullanımı

var
  tmp: TStringList;
begin
  try
    tmp := TStringList.Create;
    GetDesktopWindows(tmp);// tmp Stringlisti içerisine ekranı açık olan uygulamaların başlıklarını aldık
  finally
    FreeAndNil(tmp);
  end;

Delphi Bat dosyası işlemi için bekletme

Merhabalar,

Elbet birgün karşınıza çıkacaktır .bat dosyası ile haşır neşir olma olayı.
Bir dosya kopyalama işlemide olabilir fark edeceksiniz ki .bat dosyası çalıştırıldığı andan sonra delphi kodları devam etmektedir ve .bat dosyasının işleminin bitmesini beklemez.

Yine her zamanki gibi nette gezinirken bir kod parçası buldum ve tam olarak bu işe yaramaktadır .bat dosyasının işlemi biter ve delphi kodları öyle devam eder.


uses ShellAPI;

function TForm1.ShellExecute_AndWait(FileName: string; Params: string): bool;
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin

  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    exInfo.lpVerb := 'open';
    exInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.hProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Result := true;
    exit;
  end;
  while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);

  Result := true;

end;


Kullanımı:
ShellExecute_AndWait('BatYolu','');

Delphi Dosya Kopyalama (Yüzdeli)

Merhabalar,

Dosya kopyalama yaparken nedenini hala anlayamadım ama birçok yöntemi çalıştıramadım.
Her zaman ki gibi gezinirken Muharrem hocamızın paylaştığı örneklerden bir tanesini daha ele geçirmiş bulunmaktayım :)

Uygulama görüntüsü:

Lafı fazla uzatmadan kodlara ve kullanımına geçmek istiyorum.


Uses DateUtils;

Var
  xboolDurdur : Boolean = False;

function DosyaKopyala( strKaynak, strHedef: String; boolUzerineYaz:Boolean; Gauge:TGauge; aLabel:TLabel): Boolean;
Var
  fsKaynak, fsHedef : TFileStream;
  Miktar : DWord;
  Buffer : Array [0..(1024*64)-1] of Byte; // 64 KByte'lık paketler halinde kopyalanacak...
  tBas   : TDateTime;
begin
  tBas   := Now;
  Result := False;
  // Kaynak Dosya Var mıdır ? Kontrolü...
  if NOT FileExists( strKaynak ) then
  begin
      MessageDlg( 'Kaynak dosya mevcut olmadığı için kopyalama işlemi yapılamadı...', mtError, [mbOk], 0);
      Exit;
  end;

  // Üzerine yazma izni yoksa Hedef Dosya Var mıdır ? Kontrolü...
  if NOT boolUzerineyaz then
  begin
    if FileExists( strHedef ) then
    begin
      MessageDlg( 'Hedef dosya mevcut ve üzerine yazma izni vermediğiniz için kopyalama işlemi yapılamadı...', mtError, [mbOk], 0);
      Exit;
    end;
  end;

  fsKaynak := TFileStream.Create( strKaynak, fmOpenRead or fmShareDenyNone );
  Try
    if Gauge <> Nil then
    begin
      Gauge.MinValue := 0;
      Gauge.MaxValue := fsKaynak.Size;
    end;

    Try
      fsHedef  := TFileStream.Create( strHedef, fmCreate  );
    Except
      MessageDlg( 'Hedef dosya oluşturulurken bir sorun olduğu için kopyalama işlemi yapılamadı...', mtError, [mbOk], 0);
      fsKaynak.Free;
      Exit;
    End;
    fsKaynak.Seek( 0, soFromBeginning );

    Miktar := SizeOf(Buffer);
    while (fsKaynak.Size - fsKaynak.Position > Miktar) AND (NOT xboolDurdur) do
    begin
      fsKaynak.Read( Buffer, Miktar );
      fsHedef.Write( Buffer, Miktar );
      if Gauge <> Nil then Gauge.Progress  := fsKaynak.Position;
      if aLabel <> Nil then aLabel.Caption := Format('Miktar: %d / %d Kb'
                                                    + #13'GeçenSüre: %d saniye'
                                                    + #13'Tahmini Sure: %d saniye'
                                                    + #13'Tahmini KalanSüre: %d saniye', [
               fsKaynak.Position div (1024)
            ,  fsKaynak.Size     div (1024)
            ,  SecondsBetween(Now, tBas)
            , (SecondsBetween(Now, tBas) * fsKaynak.Size) div (fsKaynak.Position)
            , (SecondsBetween(Now, tBas) * fsKaynak.Size) div (fsKaynak.Position) - SecondsBetween(Now, tBas) ]);
      Application.ProcessMessages;
    end;
    if NOT xboolDurdur then
    begin
      Miktar := fsKaynak.Size - fsKaynak.Position + 1;
      if Miktar > 0 then
      begin
        fsKaynak.Read( Buffer, Miktar );
        fsHedef.Write( Buffer, Miktar );
      end;
      if Gauge <> Nil then Gauge.Progress := fsKaynak.Position;
    end else
    begin
      MessageDlg( 'İsteğiniz üzerine kopyalama işlemi durdururldu...', mtWarning, [mbOk], 0);
    end;
    fsKaynak.Free;
    fsHedef.Free;
  Finally
    Result := True;
  End;
end;

Kullanımı
procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  KaynakDosya,
  HedefDosya   : String;
begin
  if TBitBtn(Sender).Caption = 'Başlat' then
  begin
    xboolDurdur := False;
    TBitBtn(Sender).Caption := 'Durdur';
    KaynakDosya := 'd:\ARMAN-Genel\Movies\Avengers\Avengers,The.(Yenilmezler).TR.BRRip.XviD.avi';
    HedefDosya  := 'd:\test.avi';
    if DosyaKopyala( KaynakDosya, HedefDosya, True, Gauge1, Label1 ) AND ( NOT xboolDurdur )
      then MessageDlg('Kopyalama işlemi başarıyla tamamlandı...', mtInformation, [mbOk], 0)
      else if ( NOT xboolDurdur ) then MessageDlg('Kopyalama işlemi yapılamadı...', mtError, [mbOk], 0);
  end else
  begin
    xboolDurdur := True;
    TBitBtn(Sender).Caption := 'Başlat';
  end;
end;


EK Bilgi : - Kopyalamak için herhangi bir TGauge veya TLabel kullanmak istemezseniz

DosyaKopyala( KaynakDosya, HedefDosya, True, Nil, Nil )

şeklinde parametre olarak Nil yazarak kullanabilirsiniz.

17 Temmuz 2014 Perşembe

Delphi mobile TListview item click sorunu

Merhabalar,

Kullananlar fark etmiştir ki,

Örneğin TListview'imizde 3 tane item var ve TListview de item olmayan bir kısma tıkladığımız zaman delphi bunu son iteme tıklanmış olarak kabul eder.

Yeri geldiğinde güzel bir özellik olabilir fakat SearchBox ile arama yaptıktan sonra boş bir alana tıklayarak SearchBox kapatılmak istendiğinde otomatik olarak son iteme tıklama işlemi gerçekleşmesi çoğu zaman bir yazılımcıyı deli etmektedir.

Bu olayı aşmak için "FMX.ListView.pas" uniti içerisinde FindItemAbsoluteAt proceduresini bulun 4060 satır olabilir tam emin değilim. Tabiki bu işlemi yapmadan önce .pas dosyanızın yedeğini alın ne olur ne olmas.

Bu 2 satırı :
if ViewAt >= HeightSums[HeightSums.Count - 1] then
 Exit(HeightSums.Count - 1);

Bu aşağıdaki şekilde değiştirin:
if ViewAt >= HeightSums[HeightSums.Count - 1]+GetItemHeight(HeightSums.Count-1) then
 Exit(-1);

15 Temmuz 2014 Salı

Firemonkey Çizim ve Efekt Kullanımı

Merhabalar,

Bu yazımda sizler için hazırladığım projede firemonkey üzerinde:
1-) Resime üzerine yazı yazma,
2-) Resime üzerine çizim yapma,
3-) Resim üzerine efekt uygulama.

İşlemlerini ayrıntılı bir şekilde öğrenebileceksiniz. Proje Delphi XE5 ile hazırlanmıştır.
Tekrar belirtmek isterimki kodlarımı olabildiğince basit tutmaya çalışmaktayım tecrübeye bakmaksızın herkesin anlaması için.

Örnek Görüntüler:



12 Temmuz 2014 Cumartesi

Mobile Şifre Takip Uygulaması - Kaynak Dosyaları

Merhabalar,

Daha önce bahsetmiş olduğum projeyi en aşağıda vermiş olduğum linkten indirebilirsiniz.
Proje kimilerine göre basit olabilir yapabildiğim en basit düzeyde yapıp herkesin anlayabileceği bir kaynak hazırlamaya çalıştım.

Proje içerisinden bazı konu başlıkları:
~Mobile Sqlite bağlantı
~Sanal klavye kullanımı
~Kullanıcı giriş ekranı
~Dashboard
~Tab kontrol kullanımı
~Android Native Mesaj Dialog yapımı
~TListView nesne Ekleme/Tasarım/Obje kullanımı (Runtime)
~TListview SearchBox kullanımı
~Md5 Şifreleme
~Base64 Decode/Encode
~Veritabanı Kayıt/Güncelleme/Silme/Sorgulama işlemleri
~Farklı cihazlar için ekran desteği(Objelerin hizalanması)
~TBannerAd(Google Admob)

Ekran Görüntüleri:

Giriş Ekranı - Admob:


Şifre Değiştirme ekranı:

Dashboard:


Kayıt Ekran - Bilgi Giriş Anıı:


Liste Ekranı:


Kayıt Ekranı - Kayıt görüntüleme:


Şifre Görüntüleme Güvenliği:




19.11.2014 tarihinde güncellendi.
Indirme Linki: https://www.mediafire.com/?7m42sp7to1u7gcv

5 Temmuz 2014 Cumartesi

Mobile Şifre Takip Uygulaması - Tanıtım

Merhabalar,

Bir sonraki yazımda bir örnek proje paylaşacağım ve bu projede bloğumda bahsettiğim birçok konuya değineceğim.
Tabiki bu projeyi ev taşıma işlerimi bitirdikten sonra başlayacağım.

Proje içerisinden bazı konu başlıkları:
~Mobile Sqlite bağlantı
~Kullanıcı giriş ekranı
~Dashboard
~Tab kontrol kullanımı
~Android Native Mesaj Dialog yapımı
~TListView nesne Ekleme/Tasarım(Runtime)
~TListview SearchBox kullanımı
~Md5 Şifreleme
~Base64 Decode/Encode
~Veritabanı Kayıt/Güncelleme/Silme/Sorgulama işlemleri
~Farklı cihazlar için ekran desteği(Objelerin hizalanması)
~TBannerAd(Google Admob)

Hepinize teşekkürler sayın takipçiler...Tabi eğer böyle bir şey mümkünse...



:::Projenin ekran görüntüleri:::

4 Temmuz 2014 Cuma

Delphi Base64 şifreleme ve şifre çözme

Merhabalar,

Sizlere bu yazımda Delphide(Mobile dahil) 64bit veri şifreleme hakında biraz bilgi vereceğim.

Öncelikle nedir bu "Base64" onuna bakalım:
Base64 ikili verilerin (İngilizce: binary data) sadece ASCII karakterlerini kullanan ortamlarda iletilmesine ve saklanmasına olanak tanıyan bir kodlama şemasıdır.

Çalışma Şekli:
Kodlama sırasında 3 baytlık veriler 6 bitlik dörtlü gruplara dağıtılırlar. Her bir 6 bitlik grup 0 ile 63 arasında bir sayı oluşturur (26=64). Aşağıdaki eşleşmeye göre her sayı bir ASCII yazdırma karakterine dönüştürülür. Bir base64 kodlamasının uzunluğu daimi olarak 4' ün katları şeklindedir, uzunluğu 4' ün katı olmayan hiçbir metin geçerli bir base64 metin değildir. base64 kodlaması bitmiş bir verinin uzunluğu 4'ün katı değilse, gerektiği kadar '=' karakteri çıktının sonuna eklenir, örneğin uzunluğu 10 olan bir çıktının sonuna '==' eklenmelidir.


Bana göre genelde kullanım amacı lamerlerin veri iletişimizideki kodları takip etmesini zorlaştırmaktır. Zaten bir acemiye göre işinde profesyonel bir yazılımcı sizin stringinizi görür görmes bunun base64 ile şifrelendiğini bir bakışta anlar ve decode etmesi 5 dakikasını alacaktır.

İşin özü ve kısacası gereksiz insanların sizin textlerinize erişi mi zorlaştırmaktır.
Eğer kimse stringimi göremesin derseniz size MD5 şifrelemeyi öneririm tek taraflıdır :)

MD5 konu linki için tıklayınız!

Kodumuza dönersek:

Uses idGlobal, IdCoderMIME;
 function Sifrele(const T:String): String;
var
  b64: TIdEncoderMIME;
begin
  b64 := TIdEncoderMIME.Create;
  try
    Result := b64.EncodeString(T, IndyTextEncoding_UTF8 )
  finally
    FreeAndNil(b64);
  end;
end;


function SifreCoz(const T:String): String;
var
  b64: TIdDecoderMIME;
begin
  b64 := TIdDecoderMIME.Create;
  try
    Result := b64.DecodeString(T, IndyTextEncoding_UTF8)
  finally
    FreeAndNil(b64);
  end;
 end;

2 Temmuz 2014 Çarşamba

Delphi Android Screen Timeout

Merhabalar,

Bu yazımızda android cihazın ekran kararma süresi ile ilgili özelliğine değineceğiz.
Bildiğiniz gibi delphi ile android cihazın bütün özelliklerine erişim sağlanabilmektedir ve sadece "WRITE_SETTINGS" izinlerini açmalısınız.

Androidapi.JNI.Provider, // JSettings_SystemClass
FMX.Helpers.Android; // SharedActivityContext

function GetScreenOffTimeout: Integer;
begin
  Result := TJSettings_System.JavaClass.getInt(
    SharedActivityContext.getContentResolver,
    TJSettings_System.JavaClass.SCREEN_OFF_TIMEOUT,
    15000);  // 15 seconds is default is not found
end;
 
function SetScreenOffTimeout(ATimeOut: Integer): Boolean;
begin
  Result := TJSettings_System.JavaClass.putInt(
    SharedActivityContext.getContentResolver,
    TJSettings_System.JavaClass.SCREEN_OFF_TIMEOUT,
    ATimeOut);
end;


Orjinal Konu www.delphi.org sitesinde yer almaktadır kodları şahsen denemedim.

30 Haziran 2014 Pazartesi

Delphi Mobile Duyuru Componenti

Merhabalar,

Sizlere bu yazımda kendi çapımda hazırladığım bir procedure'den bahsedeceğim. Bu procedure sayesinde Google Analytics'in kullandığı şekil objeleriniz olacak ve böyle şeyler kullanıcıya duyuru vs. gösteriminde görünüş olarak size artı puan sağlayacağına inanmaktayım.

Google Analytics Görünümü:

Şimdi örnek projemiz için forumumuza yerleştireceğimiz objeler:
-Editbox 1 adet
-Button 1 adet
-VertScrollBox 1 adet ve Align = Client yapın ki bütün ekranı kaplasın.

Uses FMX.Layouts,FMX.Effects,FMX.Objects;// Eklenmesi gerekenler

procedure DuyuruEkle(Yazi, YBaslik: String; Scroll: TVertScrollBox);
var
  Pano,BPano: TRectangle;
  Metin,Baslik: TText;
  Golge: TShadowEffect;
begin
  TThread.CreateAnonymousThread(procedure
  begin
    Pano := TRectangle.Create(Scroll);
    with Pano do
    begin
      Parent := Scroll;
      Align := TAlignLayout.alTop;
      with Margins do
      begin
        Left := 5;
        Right := 5;
        Top := 5;
        Bottom := 5;
      end;
      Padding.Left := 5;
      Fill.Color := $FFECF0F1;
      Sides := [];

      Golge := TShadowEffect.Create(Scroll);
      with Golge do
      begin
        Parent := Pano;
        Direction := 90;
        Distance := 2;
        Opacity := 0.6;
        ShadowColor := TAlphaColorRec.Black;
        Softness := 0.1;
      end;

      BPano := TRectangle.Create(Scroll);//Baslik Arkafon
      with BPano do
      begin
        Parent := Pano;
        Position.X := 15;
        Position.Y := 0;
        Fill.Color := $FFCF3F30;
        Sides := [];

        Baslik := TText.Create(Scroll);//Baslik yazı
        with Baslik do
        begin
          Parent := BPano;
          Text := UpperCase(YBaslik);
          Align := TAlignLayout.alContents;
          WordWrap := False;
          Font.Family := 'Calibri';
          Color := TAlphaColorRec.White;
          Font.Size := 15;
        end;
         BPano.Width := Baslik.Width + 30 + 30;
         BPano.Height := 30;
      end;

      Metin := TText.Create(Scroll);
      with Metin do
      begin
        Parent := Pano;
        Margins.Top := 40;
        Text := Yazi;
        Font.Family := 'Arial';
        Align := TAlignLayout.alClient;
      end;

      Pano.Height := ((Length(Metin.Text) / (Scroll.Width / 15)) * 15) ;
      if Pano.Height < 80 then
        Pano.Height := 90;
    end;
  end).Start;
end;

Gerekli procedure tanımını yaptıktan sonra Buton içerisine gelerek:

DuyuruEkle(DuyuruEdit.Text,'ÖNEMLİ',VertScrollBox);


1-) Gördüğünüz gibi. "DuyuruEdit.text" editboxdan gönderdiğimiz yani elimizle yazdığımız yazıdır.
2-) "ÖNEMLİ" yazan yeri örnekte manuel olarak ayarladım ben, siz isterseniz başka bir edit ile orayıda değiştirebilirsiniz.
3-) Son parametremizde işlem görecek olan VertScrollBox'dır.

Bu çalışmada renkleri istediğiniz gibi değiştirebilirsiniz. Ben burada form rengini "#FFCF3F30" yaptım.

Projenin son hali:

28 Haziran 2014 Cumartesi

Delphi Android Uygulamayı arka planda devam ettirme

Merhabalar bu işlem sayesinde programdan çıkmak yerine uygulamayı arka planda sürdürmeye devam etmektedir. Kodu şahsen denemedim deneyen Ali Yıldırım arkadaşımıza teşekkürler.


Uses FMX.VirtualKeyboard,FMX.Platform, FMX.Helpers.Android;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
Var
  keyboard: IFMXVirtualKeyboardService;
begin
  if (Key = vkHardwareBack) then
  Begin
 
    keyboard := TPlatformServices.Current.GetPlatformService(IFMXVirtualKeyboardService) as IFMXVirtualKeyboardService;
 
    if  TVirtualKeyboardState.Visible in keyboard.VirtualKeyBoardState then   Exit;
 
    SharedActivity.moveTaskToBack(True);
 
    Key := 0;
 
  End;
end;