6 Temmuz 2017 Perşembe

Lazarusta kaynak(resource) dosya kullanımı




Lazarusta da delphi de olduğu gibi kaynak dosya kullanımı vardır. Sıkıntı çıkaran kısımlar windows kaynak dosyalarının linux tarafında ufak tefekte olsa uyumsuzluğunun olabilmesidir. Ancak lazarusun kendi kaynak dosya kullanım sistemini kullanırsanız hem windows hemde linux tarafında (osx tarafında da) çapraz platform uyumluluğu içinde rahatlıkla kullanabilirsiniz. Bu yazımızda lazarus-->tools dizini altındaki “lazres” uygulaması ile birden fazla raw dosyayı kaynağa gömüp kullanımını anlatmaya çalışacağız. Anlatacaklarımız hem windows hemde linux tarafında benzer şekilde uygulanabilir işlemlerdir.

İlk olarak iki tane örnek olması açısından gömeceğimiz dosyaları seçelim. Biz burada “kitap1.xlsx” çalışma kitabı ile “Dokuman1.odt” dosyasını seçtik. Bu dosyaların “lrs” uzantılı dosyasını oluşturalım. Biz bu dosyayı programımızın derlemesinde kaynak dosya olarak kullanacağız.

Linux için terminal penceresinde

/usr/share/lazarus/1.6.4/tools$ ./lazres /home/kaynakproje/resourcedosyam.lrs /home/kaynakproje/Kitap1.xlsx /home/kaynakproje/Dokuman1.odt

windows için komut satırında

c:\lazarus\tools\lazres.exe c:\kaynakproje\resourcedosyam.lrs c:\kaynakproje\kitap1.xlsx c:\kaynakproje\Dokuman1.odt

yazıp enterlıyoruz. Karşımıza aşağıdaki gibi bir pencere gelecek. (linux dosya sistemindeki görüntüsü aşağıdaki gibidir)

/home/ResourceProjesi/Kitap1.xlsx ResourceName='Kitap1' Type='XLSX'
/home/ResourceProjesi/Dokuman1.odt ResourceName='Dokuman1' Type='ODT'

windows kullanıyorsanız sonuç görüntüsü şu şekilde olur;

c:\ResourceProjesi\Kitap1.xlsx ResourceName='Kitap1' Type='XLSX'
c:\ResourceProjesi\Dokuman1.odt ResourceName='Dokuman1' Type='ODT'

Böylece nihayet iki dosyayı da içinde barındıran “resourcedosyam.lrs” kaynak dosyamızı oluşturmuş olduk.

Yukardaki işlemlerde iki dosyayı ayrı ayrı yazıp göstermek yerine dosyaların listesinin olduğu bir text dosyasını bunların yerine yazmış olsaydık yine aynı işi yapmış olurduk. Hatta bu liste gösterme şekli çok sayıda dosya olduğunda mantıklı bir işlem olacaktır.

Lazres resourcedosyam.lrs dosyalistesi.txt

Bundan sonraki aşamada programımız içinden bilgisayarımızda istediğimiz herhangi bir yere bu iki kitap1.xlsx ve Dokuman1.odt dosyalarımızı oluşturalım.

* Lazarusu açıyoruz
* Yeni bir boş proje oluşturuyoruz.
* unit1.pas dosyasının uses kısmına “Lresources” ifadesini ekliyoruz.
* unit1.pas dosyasının en altındaki “end.” ifadesinden önce

initialization
   {$I resourcedosyam.lrs}

ifadesini ekliyoruz.

* formun üzerine bir buton atalım ve onclick olayına aşağıdaki ifadeleri yazalım.

procedure TForm1.Button1Click(Sender: TObject);
var
  SList: TStringList;
  Res: TLResource;
  Veri: String;
begin
   Slist:= TStringList.Create;

   Res:= LazarusResources.Find('Kitap1');
   if Res= nil then Raise Exception.Create('Kitap1 kaynakta yok');

   Slist.Add(Res.Value);
   Slist.SaveToFile('Kitap1.xlsx');

   Slist.Clear;  //Bunu iki satırı yapmak çoğu durumda karışıklıkları önler.
   Res:= nil;    //iki jpeg dosyasında sıkıntı oluşturduğunu görmüştüm. o yüzden bu iki satır önemli.

   Res:= LazarusResources.Find('Dokuman1');
   if Res= nil then Raise Exception.Create('Dokuman1 kaynakta yok');

   Slist.Add(Res.Value);
   Slist.SaveToFile('Dokuman1.odt');

   Slist.Free;
end;

Bu kod çalıştırıldığında exenin içine gömülü durumdaki 2 adet kaynak dosyasını exenin bulunduğu yere müstakil olarak oluşturur. Bunun yanında resource deki image dosyalarına erişim ve işlem yapmak daha pratiktir. Aşağıdaki kaynakta bu işlem güzel bir şekilde anlatılmıştır.


Kaynak:
* http://wiki.freepascal.org/Lazarus_Resources

22 Mayıs 2017 Pazartesi

Free Pascal / Lazarus ile SDL Grafik OpenGL kullanımı



Simple DirectMedia Layer (SDL), 1998 yılında Sam Lantinga tarafından geliştirilmeye başlanmış açık kaynak bir grafik kütüphanesidir. Linux ve windows gibi birçok platform için kod geliştirebilme yeteneğine sahiptir. Üstelik bir değişiklikte yapmanız gerekmiyor. Bu kütüphane ilk olarak C dili için geliştirilmiş olup daha sonraları C++, Perl, Python ve Pascal için uyarlamaları yapılmıştır. Bizdeş şu anda Free Pascal da kullanımını dilimiz döndüğünce giriş niteliğinde anlatmaya çalışacağız.

Ben ubuntu-linux kullandığım için ubuntu üzerinde anlatımını yapacağım. Ancak windows üzerinde kullanımı hemen hemen aynıdır. Sonuçta indirdiğiniz başlık dosyalarını aynı şekilde fp ide yada lazarus ide ye referans gösteriyorsunuz. Ve kullanıyorsunuz.

1- Lazarus kurulumu:

https://www.lazarus-ide.org/ adresinden 3 adet deb uzantılı dosya indirilir. Sırayla “fpc_*”, “fpc-src-*” ve “lazarus-*” ile başlayan deb dosyaları terminal penceresinde kurulur.

sudo dpkg -i fpc_3.0.2-170225_amd64.deb
sudo dpkg -i fpc-src_3.0.2-170225_amd64.deb
sudo dpkg -i lazarus-project_1.6.4-0_amd64.deb

Bu yukardaki kurulumlarda eğer karşılanamayan bağımlılık hatası verirse hemen aşağıdaki kodu terminalden uygularız.

sudo apt-get -f install

Son komut ile kurum tamamlanmış olur.


2- SDL Yüklemesi:

2.1- SDL Başlık dosyalarının Yüklenmesi:

https://github.com/ev1313/Pascal-SDL-2-Headers adresinden free pascal içerisinde sdl2.dll fonksiyonlarının tanımlarının olduğu başlık dosyaları zip olarak indirilir. Bu zip dosyası örneğin /home/durali/Belgeler dizini içine açılır. Lazarus içinden kullanılmak için “proje->proje seçenekleri->Compiler Options->Paths->Other Unit Fileskısmında bu başlık dosylarının yolu eklenir. Artık sdl başvurularını kod içinde hatasız bir şekilde yapabiliriz.

2.2- SDL Kitaplığının işletim sistemine (Ubuntuya) yüklenmesi:

SDL kitaplığı dediğimiz windows sistemlerinde dll uzantılı dosyaların linuxteki karşılığı olan so uzantılı “dinamik bağlantı kitaplık” dosyalarıdır. Zaten başlık dosyalarımızda bu kitaplık dosyaları ile bir nevi köprü oluşturur. Yüklemesi için terminal penceresi açılarak aşağıdaki satırdaki kodlar uygulanır.

sudo apt-get install libsdl2*

SDL ile ilgili ne kadar geliştirme dosyaları varsa bu komut ile yüklenecektir.


3- SDL ile ilgili kodların lazarusta test edilmesi.

Bunun için aşağıdaki kodu boş bir proje yada pas dosyası içine yapıştırıp derlemeyi yapınız. Eğer düzgün derlendiği mesajını görüyorsanız kod doğru çalışıyor demektir.

program project1;

uses SDL2;

begin

//initilization of video subsystem
if SDL_Init( SDL_INIT_VIDEO ) < 0 then HALT;


//your SDL2 application/game


//shutting down video subsystem
SDL_Quit;

end.


Bu aşamalardan sonra hatasız bir şekilde SDL kitaplığı ile grafik yapmaya başlayabilirsiniz. Grafik programlama ne işimize yarar sorusuna en iyi cevap oyun programcılığı olacaktır. OpenGL in gücünü donanım aygıtlarınıza (grafik, ses, joystick vs.) doğrudan erişim sağlayarak hissetmenizi sağlayacaktır. Hatta diyebilirimki ufaktan oyun programcılığına merakınız varsa bunu SDL kitaplığı iyi bir şekilde sağlayacaktır. Şu da unutulmamalıdır ki bu bahsedilenler küçün oyun programcıkları için geçerlidir. Daha büyük oyunları da SDL ile yapabilirsiniz elbette. Ancak bu işler için oyun motoru dediğimiz devasa ide yapıları mevcuttur. Kısaca benim söyleyebileceklerim bunlardır. Zaten amacımda free pascal da bunun nasıl yapılabildiğiniz başlangıç düzeyinde anlatmaktı.

Size daha anlam ifade etmesi için aşağıdaki mini projeyide sunuyorum.

Bir dizin oluşturun. Misal oyun1 diye. İçine bir adet adı “fpsdl.bmp” olan bir bitmap dosyasını bir resim programıyla(pinta gibi) oluşturun. Lazarusta yeni bir konsol projesi yada boş bir dosya içine şu kodları yapıştırın.

program project1;

uses SDL2, SDL2_image;

var
sdlWindow1 : PSDL_Window;
sdlRenderer : PSDL_Renderer;
sdlTexture1 : PSDL_Texture;

begin

//initilization of video subsystem
if SDL_Init( SDL_INIT_VIDEO ) < 0 then HALT;

sdlWindow1 := SDL_CreateWindow( 'Window1', 50, 50, 500, 500, SDL_WINDOW_SHOWN );
if sdlWindow1 = nil then HALT;

sdlRenderer := SDL_CreateRenderer( sdlWindow1, -1, 0 );
if sdlRenderer = nil then HALT;

sdlTexture1 := IMG_LoadTexture( sdlRenderer, 'fpsdl.bmp' );
if sdlTexture1 = nil then HALT;
SDL_RenderCopy( sdlRenderer, sdlTexture1, nil, nil );
SDL_RenderPresent (sdlRenderer);
SDL_Delay( 2000 );

SDL_DestroyTexture( sdlTexture1 );
SDL_DestroyRenderer( sdlRenderer );
SDL_DestroyWindow ( sdlWindow1 );

//shutting down video subsystem
SDL_Quit;

end.


Bu kod ile oluşturulan bir pencere içersinde resim dosyamızın doğrudan grafik donanımına erişerek gösterilmesi hedeflenmiştir. Oluşturulan bu pencere 2 sn kadar gösterildikten sonra kapatılmaktadır. Bmp uzantılı dosyanız ile kod dosyasının aynı dizin içinde olmasına dikkat edin. Eğer herşeyi doğru yaptıysanız resim dosyanızı 2 sn görebiliyor olmalısınız.

Son olarak bu konuda en baba çalışmayı yapmış youtube rumuzu “badsectoracula” olan kişi tarafından çekilmiş 5 saatlik hızlandırılmış bir video var. Bu video free pascal da bir oyun nasıl yazılır sdl kullanarak anlatmış.



Benden bu kadar. Aşağıdaki kaynaklara göz atmayı unutmayınız. Allah a emanet olunuz..


duralikiraz.blogspot.com
Muvaffakiyet Allahtandır.”


Kaynaklar: