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);

Delphi android Kameradan ve galeriden resim çekme ve paylaşma

Merhabalar,

Birazdan bahsedeceğim olay embarcaderonun sitesinde mevcuttur ve bende ilk olarak oradan yararlanmıştım. 1-2 Arkadaşımın tekrar tekrar sorması üzerine türkçe bir yazıda elimizde bulunması açısından birşeyler yazmaya karar verdim.

Projeye başlayalım:

İlk olarak boş bir proje açıyoruz.

Projeye en temel olarak 1 adet TImage ve 1 adet TButton koymanız kafidir. Gerisi süslemeye girer ve maksat ekran güzel gözüksün hemen gerekli objeleri ekleyelim.

Eklenenler:
  ToolBar = ToolBar

  KameraBut = TButton
    Align = alRight
    StyleLookup= 'cameratoolbutton'

  KameraResim = TImage
    Align = alClient

  ActionList1 = TActionList




Objelerin yerleşimleri bitirdiğinizde sıradaki işlemimiz butonumuza bir action tanımlamak ve kısa yoldan nasıl yapılacağını resim ile göstereceğim.


Şuandaki işlemimiz resimleri projemize almak olduğuna göre:
1-) TTakePhotoFromLibraryAction = Galeriden foto alma
2-) TTakePhotoFromCameraAction = Kameradan foto alma

Hangi seçeneği uygulamak isterseniz tıklayınca o action tanımlansın.

Tanımlama işleminden sonra yine Event sekmesinden "Action" eventinin sol tarafındaki "+" artı işaretine tıklayarak genişletiniz.

OnDidFinishTaking eventi içerisine aşağıdaki kodu yazarak kameradan çekilen veya galeriden seçilen resimi TImage nesnemize alıyoruz.

procedure TKameraScreen.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
  KameraResim.Bitmap.Assign(Image);
end;


"Image" nesesi actiondan dönen TBitmap yani seçilen veya çekilen resimdir.

İlk Görünüm:


Resim çekme anı:


 Çekilen resimin TImage içerisine Assign olmuş hali:


Sosyal Paylaşım Butonu:


Tanımlama işleminden sonra yine Event sekmesinden "Action" eventinin sol tarafındaki "+" artı işaretine tıklayarak genişletiniz.

OnBeforeExecute eventi içerisine aşağıdaki kodu yazarak TImage nesnemiz içerisindeki resmi sosyal resim paylaşma eventi ile alıcı uygulamalara gönderiyoruz.


procedure TKameraScreen.ShowShareSheetAction1BeforeExecute(Sender: TObject);
begin
  ShowShareSheetAction1.Bitmap.Assign(KameraResim.Bitmap);
end;




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.