Anfidya'nın arka bahçesi..

There is dark web in the deep web..

Archive for the ‘Delphi’ Category

[Delphi] Metnin başındaki sıfırı(0000) silme – remove zero char from beginning of string

leave a comment

Selam kardeşler,

Off geçen postta, her gün bir içerik gireceğim deyip 2 yıl uğramamışım buralara….

Neyse efendim, yine über projelerde gezerken ufak bir kod lazım oldu. Çünkü müşteriler sayısal veri girerken -sebebini sadece ve sadece yaratıcı bilir- girdinin başına sıfır -0- yazıyorlarmış.

Bize de bu sıfırları çaktırmadan silmek düşer (:

Function SifirSil(tmpStr:String):String;
begin
  if LeftStr(tmpStr,1) = '0' then
  begin
    while LeftStr(tmpStr,1) = '0' do
    begin
      Delete(tmpStr, 1,1);
    end;
  end;
  Result := tmpStr;
end;

 

Kalın selametle :*

Written by anfidya

Eylül 4th, 2019 at 3:42 pm

Posted in Delphi

[Delphi] ProcessID ile Görüntü Yolu Bulma (GetModuleFileNameEx)

leave a comment

Selamlar canişkolarım,

Yıl olmuş 2017 ve ben hâla gönderi atmamışım buraya..

Yine über gereksiz araştırmalar yaparken GetModuleFileNameEx diye bir zımbırtı buldum. Nasıl kullanılır sorusunu hazreti google emmiden edinirken, yine bir yerlerden kod arakladım ve hemen sizleri de bu günaha ortak ediyorum (kötü_adam_gülüşü)! Çok ufak bir kaç değişiklik yaparak amacımıza uygun hale getirdim tabi ki!!

function GetProcessPathFromPID(classx,title:PChar): String;
var
  pid     : DWORD;       hwd : HWND;
  hProcess: THandle;
  path    : array[0..4095] of Char;
begin
  hwd := FindWindow(classx,title);
  GetWindowThreadProcessId(hwd, pid);

  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pid);
  if hProcess <> 0 then
    try
      if GetModuleFileNameEx(hProcess, 0, @path[0], Length(path)) = 0 then
        RaiseLastOSError;

      result := path;
    finally
      CloseHandle(hProcess);
    end
  else
    RaiseLastOSError;
end;

Kaynak: http://stackoverflow.com/questions/4178443/get-the-full-path-from-a-pid-using-delphi

Written by anfidya

Mayıs 14th, 2017 at 1:54 am

[Delphi] Sayısal Değer Mi? | Is it integer?

leave a comment

Selam köylüler,

Uzun zamandır yoktum değil mi 😀 Tabi ki unutmadım buraları ^^

Yine übergereksiz bir program yazarken ihtiyaç duyduğum ve üstüne düşünmek yerine bir yerlerden arakladığım bir kodu sizinle paylaşmak istiyorum.

Kodumuz verilen string değerin integer(sayısal değer) olup olmadığını kontrol edip bizlere boolean bir değer veriyor (:

Function IsNumber(const S: string): Boolean;
Begin
  Result := True;
  try
    StrToInt(S);
  except
    Result := False;
  end;
End;

Written by anfidya

Ekim 16th, 2016 at 1:15 am

[Delphi] Çarpışmayı Yakalama | Collision

leave a comment

Selam olsun size Ötüken’in onurlu gençleri,

Blogu kuralı tamı tamına iki sene olmuş fakat içerisinde dişe dokunur bir sayıda gönderi maalesef yok. Fakat artık günlük bir post atma kararı aldım.

Eveeetttt… Bugün amatör olarak yapmaya çalıştığım oyun motorumdan(game engine) ufak bir pascal dosyasını sizinle paylaşacağım dostlar. Büyük ihtimal içerisinde ki kodları bir yerlerden direk veya dolaylı olarak aldım çünkü hatırlamıyorum nereden geldi. Sahibi hakkını helal etsin lütfen.

unit Engine.Core.Collision;

interface

uses
  System.Classes, System.Types, FMX.Graphics, FMX.Objects;

function CheckBoundryCollision( R1, R2 : TRect; pR : PRect = nil; OffSetY : LongInt = 0; OffSetX : LongInt = 0): boolean; {overload;}
function CheckImageCollision( R1, R2 : TImage; pR : PRect = nil; OffSetY : LongInt = 0; OffSetX : LongInt = 0): boolean; {overload;}

implementation

uses
  IdHttp, IdTCPClient;
  
function CheckBoundryCollision( R1, R2 : TRect; pR : PRect = nil; OffSetY : LongInt = 0; OffSetX : LongInt = 0): boolean; {overload;}
begin
  if( pR <> nil ) then
   begin
    with( R1 ) do
     R1:=Rect( Left+OffSetX, Top+OffSetY, Right-(OffSetX * 2), Bottom-(OffSetY * 2));
    with( R2 ) do
     R2:=Rect( Left+OffSetX, Top+OffSetY, Right-(OffSetX * 2), Bottom-(OffSetY * 2));

    Result:=IntersectRect( pR^, R1, R2 );
   end
  else begin
        Result:=( NOT ((R1.Bottom - (OffSetY * 2) < R2.Top + OffSetY)
          or(R1.Top + OffSetY > R2.Bottom - (OffSetY * 2))
           or( R1.Right - (OffSetX * 2) < R2.Left + OffSetX)
            or( R1.Left + OffSetX > R2.Right - (OffSetX * 2))));
       end;
end;

function CheckImageCollision( R1, R2 : TImage; pR : PRect = nil; OffSetY : LongInt = 0; OffSetX : LongInt = 0): boolean; {overload;}
Var
 B1,B2 : TRect;
begin
 B1 :=  R1.BoundsRect.Round;
 B2 :=  R2.BoundsRect.Round;
  if( pR <> nil ) then
   begin
    with( B1 ) do
     B1:=Rect( Left+OffSetX, Top+OffSetY, Right-(OffSetX * 2), Bottom-(OffSetY * 2));
    with( B2 ) do
     B2:=Rect( Left+OffSetX, Top+OffSetY, Right-(OffSetX * 2), Bottom-(OffSetY * 2));

    Result:=IntersectRect( pR^, B1, B2 );
   end
  else begin
        Result:=( NOT ((B1.Bottom - (OffSetY * 2) < B2.Top + OffSetY)
          or(B1.Top + OffSetY > B2.Bottom - (OffSetY * 2))
           or( B1.Right - (OffSetX * 2) < B2.Left + OffSetX)
            or( B1.Left + OffSetX > B2.Right - (OffSetX * 2))));
       end;
end;



end.

Kullanımını;

If CheckImageCollision(ImageOyuncu,ImageDusman) Then
 ShowMessage('Çarpıştık loo');

Şeklinde kullanabilirsiniz.

Temel mantığı objelerin üst üste çıkıp çıkmadıklarını kontrol ediyor. Bu yüzden gerekli kontrolleri sağlamazsanız obje üst üste gelince uyarıyı verecektir. Peki o kontrolleri nasıl sağlarız;
Diyelim ki bir ana karakterimiz(ImageAnaKarakter) bir de duvarımız(ImageDuvar) ve son olarak bir adet butonumuz(Button1). Butonun onclick olayına;

 

procedure TForm1.Button1Click(Sender: TObject);
var
  eskiX,eskiY : Integer;
begin
  eskiX := ImageAnaKarakter.Position.X;  //Ana karakterimizin hareket etmeden önceki x pozisyonu
  eskiY := ImageAnaKarakter.Position.Y;  //Ana karakterimizin hareket etmeden önceki y pozisyonu
  ImageAnaKarakter.Position.X := ImageAnaKarakter.Position.X + 10;  //Ana karakterimizi sağa(+x) doğru 10 koordinat ilerletiyoruz
  If CheckImageCollision(ImageAnaKarakter,ImageDuvar) Then  // Çarpışma var mı? Eğer varsa;
  Begin
    ImageAnaKarakter.Position.X := eskiX;  //Ana karakterimizi geri x pozisyonuna çektik
    ImageAnaKarakter.Position.Y := eskiY;  //Ana karakterimizi geri x pozisyonuna çektik
  End;
end;

 

Şimdiiiii….

Bu işlemi yaptığımızda ImageAnaKarakter nesnemiz duvarın üzerine gelir gelmez; geri eski pozisyonuna dönecektir. Belki iyi bir işlemcide bu görünmeyecektir bile şip şak ekran geçişi sağlanacaktır fakat çok çirkin ve amatör bir görüntü ortaya çıkabilir. Bunu gidermek ve bir adım ileriye gitmemiz için tabi ki kod değil mantık vereceğim (KötüAdamGülüşü.png);

Dinamik olarak bir image objesi oluşturup ImageAnaKarakter’in değerlerini ona aktarıyoruz. Sonra dinamik image objesine +x düzleminde 10 koordinat ekliyoruz. Ve çarpışma kontrolünü yapan fonksiyonumuza dinamik image objemizin adını vererek kontrol ettiriyoruz. Örneğin;

 If not CheckImageCollision(ImageDinamikGoruntu,ImageDuvar) Then

Daha sonra bu if şart döngümüze ImageAnaKarakter.Position.X := ImageAnaKarakter.Position.X + 10; şeklinde ekleme yapıyoruz.

Peki bunu yaptık ne oldu? Bunun sonucunda karakter görüntümüz duvarın üzerine çıkmadan sanki +10 değer sağ taraftaymış gibi çarpışmayı kontrol etti ve, eğer çarpışma varsa olduğu yerde kaldı, eğer yoksa da 10 birim sağa gitti.

Her şey çok güzel; Peki bir sonra ki adam?

Eğer ImageAnaKarakter, ImageDuvar objesine 7 birim uzaklıktaysa ne olacak? Görüntü 7 birim geriden donup kalacak yani ilerleyemeyecek. İşte bunun için arada ki mesafe farkını hesaplayıp ImageAnaKarakter objemizi o kadar ilerletmemiz lazım. Peki bunun mantığını verecek miyim? Tabi ki HAYIR 😀

Çünkü ben de daha üzerinde durmadım şimdi yazarken aklıma geldi. Saat geç olduğu için ileri ki yazılarımızın birinde ara not olarak geçerim. Yazım hataları için özür dilerim normalde baştan sona okur düzeltirdim fakat saat geç oldu.

Allah’a emanet olsun mucx

Written by anfidya

Mayıs 1st, 2016 at 2:43 am

[Delphi] İnternet Üzerinden XML Veri Alma / Get XML Data From Internet

leave a comment

Selam köylüler/ Hello Canolar,

Yıl olmuş 2016 hatta üzerinden üç ay geçmiş ve ben hala bir şeyler yazmamışım. Varooo (: Neyse bugün bloga yeni yazı eklemem için planda olmayan bir durum oldu.
Evladım bu blogu bir şekilde birileri bulup bir şeyler okuyormuş layyynn! Neyse aga ben yazarım gerisi size kalmış. Bunların ingiliççesini aşağıya yazmayacam değerimi bilin.

Bugün, internetten bir xml verisini idhttp ile programımıza çekerek içeriğini ayrıştıracağız.
Today, we will get xml data with idhttp from internet.

Öncelikle, form üzerine “Indy Client” bölümünden bir adet “IDHTTP” ve “Internet” kısmından bir adet “XMLDocument” koyuyoruz.
Firstly, I have to add “IDHTTP” component from “Indy Client” tab and “XMLDocument” component from “Internet” tab.

Daha sonra aşağıda ki kodları her hangi bir kod bloğuna veya komponente dahil edebilirsiniz.(söylemeyi unuttum bir tanede “Memo”)
After that, you can include this codes in any function(or procedure) or any component.(I forgot to say, please add a “Memo”)

var
 a : IXMLNode;
 i  : IntegeR;
begin
 XMLDocument1.XML.Clear;
 XMLDocument1.XML.Text := IdHTTP1.Get('http://anfidya.com/anan.xml');
 XMLDocument1.Active := True;
  for i:=0 to XMLDocument1.DocumentElement.ChildNodes.Count -1 do
  begin
   a := XMLDocument1.DocumentElement.ChildNodes[i];
   Memo1.Lines.Add(a.ChildNodes['description'].Text);
  End;
 XMLDocument1.Active := False;
end;

http://anfidya.com/anan.xml adresine giderek yapıyı inceleyebilirsiniz. Uzun uzun açıklamaya gerek yok bence siz bir bakışta nokta atışı yaparsınız. He eğer olurda yorgun vs olursanız lütfen yorum olarak yazın size uygun bir yol buluruz smile.

You can exemine http://anfidya.com/anan.xml address. It is so clear but if you have a problem, please fell to free make comment 😛

Allah hepinizi sevsin gençler.

Written by anfidya

Mart 12th, 2016 at 12:50 am

Delphi XE Serisi ve Nimetleri

leave a comment

Merhaba köylüler,

Biliyorsunuz ki yazılım bugünün ve yarının tüm teknolojisinin teminatı durumunda. Eskiden kolu çekiyordunuz ve hobaaaa makineler çalışıyordu fakat uzun süredir işler böyle yürümüyor. Artık butonlara basıyoruz ve triggerlarımız karıncalar gibi çalışıyor.

Düşünebiliyor musunuz??? Kullanıcı butona basıyor ve arka planda kullanıcının zekasını beşe ona katlayan binlerce kod çalışmaya başlıyor (: Ve ardından kullanıcıdan “bu ne salak program” yorumunu alıyorsunuz..

Her neyse, hemen asıl konumuz olan Delphi XE ve RAD özelliklerine gelelim. RAD açılım olarak reypid eplikeyşın divolopmınt olarak karşımıza geliyor, eee yani? Yanisi güzel kardeşim senin ve benim beynim zorlanmasın diye adamlar bize her şeyi klik klik olarak sunmuş. Haydin şöylece bir bakalım neler yapabiliyoruz Delphi ile?

Yapabildiklerimiz;

– Tüm kütüphaneler native konumdadır, yani her platform için aynı kodları derleyebiliriz ve o platformun ana dilini tam manasıyla kullanabiliriz. Bu şu demek oluyor; İngiltereye gidip Türkçe konuşuyorsunuz fakat karşınızda ki sizi anlıyor (:

– RAD özelliği ile kolay, anlaşılır ve hızlı bir şekilde herhangi bir programı dakikalar içerisinde kodlayabilirsiniz.

– Yukarıdakilere bakarsak hemen hemen her şeyi yapabiliyoruz.

Yapamadıklarımız;

– Kapasitemizin yetmediği her şey.

Uzun uzun özellik beklediniz değil mi (: Yok kardeşim uzun uzun saçma sapan şeyler.

Ver kodu al apk yı, ver kodu al ipa yı, ver kodu al parayı 😉

Written by anfidya

Eylül 7th, 2015 at 1:21 am

[Delphi] FireMonkey Mobil Belgelerim Yolu / Documents Folder Path On Mobile In FireMonkey

leave a comment

Selam baboşlar,

Uzun süredir yazmıyordum, zaten sizde pek takip etmiyorsunuz :/

Delphi XE8 de kullandığım, mobil uygulamalarımda ini dosyalarımı depoladığım ufak bir fonksiyonu sizinle tanıştırmak istiyorum (:

Hi mates,

I havent wrotten a long time, anyway you dont follow me.

I want to share a function for specific documents folder for mobile. Generally I use it for placed my ini files.

Uses
  System.IOUtils;
Function IniYolu:String;
begin
 Result := GetHomePath + PathDelim + 'Documents' + PathDelim + 'CozBabamCoz.ini';
 {$IFDEF ANDROID}
  Result := TPath.GetDocumentsPath + PathDelim + 'CozBabamCoz.ini';
 {$ENDIF}
end;

Written by anfidya

Ağustos 22nd, 2015 at 1:18 am

[Delphi][ASM] Mesaj ile program çıkışı

leave a comment

Merahaba,

Programınızı uyarı verdirerek performanslı bir şekilde kapatabilirsiniz.

 

procedure ExitWithMessage; assembler;
asm
  // Bazı adresleri temizleyerek yol açıyoruz
  mov ecx, 5
  @clear_loop:
  dec ecx
  mov dword ptr [ecx * 4 + esp], 0
  cmp ecx, 0
  jnz @clear_loop
  // ExitProcess 'ın parametresini belirliyoruz
  push 0
  // MessageBoxA 'nın parametresini belirliyoruz
  push MB_ICONERROR
  push Title
  push Text
  push 0
  //  MessageBox 'ın devam eden adresinden ExitProcess 'ı çağarıyoruz
  lea eax, ExitProcess
  push eax
  jmp MessageBoxA
end;

Written by anfidya

Aralık 13th, 2014 at 12:56 pm

Posted in Delphi

Tagged with ,

[Delphi] Dll İçerisindeki Export İsimlerini Görme&Listeleme

2 comments

Merhaba arkadaşlar,
Bu başlık altında daha önce her hangi bir derleyiciyle(dil fark etmez) derlenmiş dll içerisinden, dışarıya export ettiği fonksiyon ve prosedür isimlerini göreceğiz.
Uses kısmı:

uses
  ImageHlp;

Dışarı aktarmayı yapacak babayiğit;

procedure ListDLLExports(const FileName: string; List: TStrings);
type
  TDWordArray = array [0..$FFFFF] of DWORD;
var
  imageinfo: LoadedImage;
  pExportDirectory: PImageExportDirectory;
  dirsize: Cardinal;
  pDummy: PImageSectionHeader;
  i: Cardinal;
  pNameRVAs: ^TDWordArray;
  Name: string;
begin
  List.Clear;
  if MapAndLoad(PChar(FileName), nil, @imageinfo, True, True) then
  begin
    try
      pExportDirectory := ImageDirectoryEntryToData(imageinfo.MappedAddress,
        False, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize);
      if (pExportDirectory <> nil) then
      begin
        pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
          DWORD(pExportDirectory^.AddressOfNames), pDummy);
        for i := 0 to pExportDirectory^.NumberOfNames - 1 do
        begin
          Name := PChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
            pNameRVAs^[i], pDummy));
          List.Add(Name);
        end;
      end;
    finally
      UnMapAndLoad(@imageinfo);
    end;
  end;
end;

Kullanımı:


procedure TForm1.Button1Click(Sender: TObject);
var
  List: TStrings;
  i: Integer;
  s: string;
begin
  List := TStringList.Create;
  try
    ListDLLExports('C:\WINDOWS\SYSTEM32\browseui.dll', List);
    ShowMessage(IntToStr(list.Count) + ' functions in dll');
    s := 'List of functions:';
    for i := 0 to List.Count - 1 do
      s := s + #13#10 + List[i];
    ShowMessage(S);
  finally
    List.Free
  end;
end;

Tepe tepe kullanın (:

Written by anfidya

Kasım 23rd, 2014 at 7:13 pm

[Delphi] StringReplace Kullanımı

leave a comment

Merhaba,

Bir metin içerisindeki veriyi, belirlediğimiz başka bir veriyle değiştirebiliriz. Bunun için StringReplace fonksiyonunu kullanacağız.

StringReplace fonksiyonu SysUtils.pas içerisinde bulunur. Uses kısmına SysUtils ekleyerek rahatça ulaşabiliriz.

function StringReplace ( const SourceString, OldPattern, NewPattern : string; Flags : TReplaceFlags ) : string;

şeklinde tanımlanmıştır. Hadi bunu biraz açalım..

SourceString -> ana metnimizi tanımlayacağımız yer.
OldPattern -> metin içerisinde aranacak dizi
NewPattern -> ana metnimizde OldPattern yerine yazılacak dizi
Flags -> yazma izinleri

Örnek vererek devam edelim;

var
 metin,sonra : String;
begin
 metin := 'anfidya''ya el salla';
 sonra := StringReplace(metin,'el','kol',[rfReplaceAll, rfIgnoreCase]);
end;

Yukarıda “anfidya’ya el salla’ yazısındaki “el” metnini “kol” olarak değiştirdik. Eğer “metin” ve “sonra” değişkenlerini ShowMessage ile ekrana bastırırsak karşımıza şöyle bir sonuç çıkacaktır;

anfidya'ya el salla
anfidya'ya kol salla

Flags kısmına gelen yerde iki tane tanım kullandık. Bunlar rfReplaceAll ve rfIgnoreCase.
rfReplaceAll -> metin içerisinde bulunan tüm eşleşmeleri değiştirir.
rfIgnoreCase -> metin içerisinde eşleşme yaparken küçük,büyük harf uyumuna dikkat etmez.

Written by anfidya

Ekim 4th, 2014 at 4:26 am

Posted in Delphi

Tagged with ,