Delphi ile Dosya ve Kaynak Yönetimi

Cansiz

New member

Çeşitli türdeki kaynak dosyaların RESOURCE olarak derlenmesi. (Bu makalede swf uzantılı flash dosyaları)
Flash desteğinin (TShockwaveFlash) ActiveX bileşeni olarak delphi ortamına dahil edilmesi
Derlenmiş kaynak dosyalarının uygulamaya dahil edilmesi ve kullanılması
Uygulamanın dağıtımında kullanılabilecek basit bir güvenlik mekanizması
Uygulamanın dağıtılmasında kullanılacak yapı
Dosya işlemleriyle ilgili (dosya ve işletim sistemi ilişkileri, dosya oluşturma, kopyalama,öz nitelikleri vb.) tüm konularda ileri düzey, delphi ile uygulama geliştirme ve hazır bir bileşenin yüklenmesi konusunda da bir miktar tecrübeye sahip olduğunuzu kabul ediyorum.

A- Kaynak Dosyalarının Hazırlanması.

Eğer yazılımcıysanız Delphi gibi yazılım geliştirme araçlarıyla birlikte bir çok dosya veya veri tabanı kullanmış olmalısınız. Genel itibarıyla bu tür dosyalar bağımsız fiziksel yapılarda kullanılırlar. Örneğin geliştirdiğiniz uygulamada kullandığınız bir resim uygulamanın erişebildiği bir klasörde bir dosya olarak tutulur. Uygulamanızda bu resme dosyanın tam yol adresini ve dosya adını kullanarak erişirsiniz. Bu tip erişimlerde dikkat edilecek konu, erişeceğiniz dosyanın fiziksel olarak var olması gerektiğidir. Peki ya kullanmak istediğiniz dosyaları bilgisayarda fiziksel olarak göstermek istemezseniz ne olacak ? İşte bu durumda kullanacağımız dosyaları delphi ile birlikte gelen brcc32.exe komut satırı derleyicisiyle RESOURCE dosya olarak derlemeniz ve uygulamaya dahil etmeniz (gömmeniz) gerekir. Gömme işleminin nasıl yapılacağını anlatmadan önce ;

Kaynak dosyalarımızı kullanıcıdan gizlemek
Kullandığımız dosya formatını veya sürümünü sürekli güncelleyeceğimizden dağıtımı basitleştirmek
Kaynak yönetimini ele alıp kodlamada kolaylık sağlamak
amacıyla harici dosyaları uygulamaya gömmek isteyebileceğimizi belirtelim. Tabii bu işlemin uygulama çalıştırılabilir dosyasını (exe) boyunu artıracağı da bir gerçektir. Şimdi aşağıdaki basamakları takip ederek RESOURCE dosyasını oluşturalım. Burada birden fazla dosyayı uygulamaya dahil edeceğiz.Dahil edeceğimiz dosya isimlerinde Türkçe'ye özgü karakterlerin ve boşluğun olmaması olası 3 ncü parti programlarda karşılaşabileceğimiz hataları önleyecektir.

Elimizde C:\dersler\ klasörü altında sırasıyla aşağıdaki gibi flash dosyalarının olduğunu varsayalım.

ders1.swf
ders2.swf
ders3.swf
ders4.swf
B- Kaynak Dosyalarının Derlenmesi.

Favori metin editörünüzü açıp alt alta aşağıdaki ifadeleri aynen yazınız.
matematik01 RCDATA "ders1.swf"
matematik02 RCDATA "ders2.swf"
matematik03 RCDATA "ders3.swf"
matematik04 RCDATA "ders4.swf"

Bu belgeyi dersler.rc ismiyle c:\dersler\ klasörünün altına kaydedelim.
Dos komut satırında brcc32.exe dosyasının bulunduğu klasöre geçip aşağıdaki ifadeyi yazarak RESOURCE derlemesini tamamlayalım. brcc32.exe dosyası varsayılan olarak c:\program files\borland\delphi6\bin\ klasörüne yüklenmiştir.
brcc32 c:\dersler\dersler.rc

Brcc32.exe derleme işlemi başarılı olduysa Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. iletisini başarısız olduysa bir hata iletisini görüntüleyecektir.

Şekil-1 brcc32 .exe ile derleme ekranı

Derlemeye kadar olan söz dizimi üzerinde bilmemiz gereken ;

matematik01 uygulamamızın içinde bu kaynağa erişmek için kullandığımız isim olup Türkçe karakter ve boşluk kullanmadığımıza dikkat edin.
RCDATA derleyeceğimiz kaynak dosya tipi.
"ders1.swf" kaynak dosyamızın ismi.
Derleme işleminden sonra derlemenin yapıldığı klasörde dersler.res isminde yeni bir dosya oluşturulduğunu göreceksiniz. İşte delphi içinde uygulamaya gömeceğimiz kaynak dosya budur.

C- Flash Desteğinin ActiveX Bileşeni Olarak Delphi Ortamına Dahil Edilmesi.

Amacımız FLASH ile hazırladığımız animasyonlarımızı delphi ile geliştirdiğimiz uygulamanın içinde kullanmak olduğuna göre, ilk yapmamız gereken delphi ortamına TShockwaveFlash nesnesini dahil etmek olacaktır. Bunu yaptığımızda animasyonlarımızı oynatabileceğimiz bir sahne bileşenine sahip olacağız.Aşağıdaki işlem basamaklarını takip ederek yeni nesnemizi bileşen paletine dahil ederek devam edelim.

Delphi »» Component »» Import ActiveX Control menü seçeneği ile ActiveX import diyalog penceresini açalım.

Şekil-2 TShockwaveFlash bileşeninin import edilmesi.


Dahil edilebilecek ActiveX nesne listesinde Shockwave Flash ifadesini üzerine tıklayarak seçelim. Eğer listede bu bileşenin ismini göremiyorsanız sisteminizde flash yüklü değildir. Yükledikten sonra bu işlemi gerçekleştirebilirsiniz.

Şekil-2 TShockwaveFlash bileşeninin import edilmesi.

Birincisi direkt install seçeneği ile diğeri Create Unit ile olmak üzere bileşeni yüklemenin iki yolu var. Biz ileride de kaynak kodunu kullanabileceğimizi veya üzerinde çalışabileceğimizi düşünerek bir unit oluşturacağız. Bu amaçla Create Unit düğmesine tıklayarak yeni bir unit yaratıp bu dosyayı kütüphane olarak saklamak üzere istediğimiz bir klasöre kaydedeceğiz.
Yarattığımız unit ismi otomatik olarak ShockwaveFlashObjects_TLB olarak verilecektir. Bu isim bileşeni daha sonra uygulamamıza eklediğimizde uses bildirimiyle dahil edilecektir. Oluşturulan dosyayı ShockwaveFlashObjects_TLB.pas ismini vererek kaydedin.

3. Yarattığımız ve kaydettiğimiz unit üzerinde hiç bir değişiklik yapmadan Component menüsünden Install Component menü seçeneği ile bileşenimizi ActiveX sekmesinde görüntülenecek şekilde yüklüyoruz.


Şekil-3 TShockwaveFlash bileşeninin install edilmesi.








Yükleme işlemi başarılıysa Shockwave bileşenimiz AcvtiveX sekmesinde görüntülenecektir.

Alıntıdır!!
 

Cansiz

New member
D- Kaynak Dosyaların Uygulamaya Gömülmesi

Yukarıdaki işlemleri doğru bir biçimde yaptıysanız elimizde şimdi bir TShockwaveFlash bileşeni ve RESOURCE olarak derlediğimiz bir dosyamız (dersler.res) olacaktır. Delphi'ye import ettiğimiz TShockwaveFlash bileşenini veya TWebBrowser nesnesini kullanarak FLASH dosyalarını oynatabiliriz.Flash dosyalarını bir TWebbrowser nesnesi üzerinde oynatmak, hem işin içine html kodları katabilmek yönünden hem de diğer estetiksel işlemleri yapmak yönünden tercih edilir.

Delphi'de yeni bir uygulamaya başlatıp dersproje ismiyle kaydedin.Hazırladığınız uygulamanın da harici kaynak dosyalarını derlemeye dahil ettiğini aşağıdaki söz diziminden hatırlayacaksınız.

{$R *.dfm}
Delphi tarafından otomatik olarak hazırlanan bu kaynak dosyalarla bizim hazırladığımız kaynak dosyaların derleme esnasında çakışmasını engellemek için, uygulama ismiyle kaynak dosya isimlerinin farklı olmasına dikkat etmeliyiz. Yukarıdaki bildirimin altına kendi kaynak dosya adımızı aşağıdaki gibi yazarak projeye dahil edelim. Kaynak dosyamızla uygulamanın derleme çıktısının (exe) aynı klasörde olmasına, yada göreceli yol tanımını yapmaya dikkat edelim.

{$R dersler.res}

Yukarıdaki bildirimle uygulamamıza dahil ettiğimiz kaynak dosyayı aşağıdaki yöntemlerle kullanabiliriz.

//İstenen flash dosyasını kullanım için aç
Function TForm_Matematik.FlashYukle(Const RCBolum,Yol,Dosya : String):String;
var
rStream: TResourceStream;
fStream: TFileStream;
fname: string;
begin
fname:=ExtractFilePath(Paramstr(0))+Yol+Dosya;
rStream := TResourceStream.Create(hInstance, RCBolum, RT_RCDATA);
try
fStream := TFileStream.Create(fname, fmCreate);
try
fStream.CopyFrom(rStream, 0);
finally
fStream.Free;
end;
finally
rStream.Free;
end;
Result := FName;
end;

//istenen flash dosyasını TShockwaveFlash nesnesi üzerinde yürüt
procedure TForm_FlashCalistirClick(Sender: TObject);
Var
FlashDosya : String;
begin
FlashDosya := FlashYukle('matematik01','c:\windows\temp\','ders01.swf');
ShockwaveFlash1.Movie := FlashDosya;
ShockwaveFlash1.Play;
end;

//istenen flash dosyasını TWebbrowser nesnesi üzerinde yürüt
procedure TForm_FlashCalistirClick(Sender: TObject);
Var
FlashDosya : String;
begin
FlashDosya := FlashYukle('matematik01','c:\windows\temp\','ders01.swf');
WebBrowser1.Navigate(FlashDosya);
end;
 

Cansiz

New member
E- Örnek Uygulama

Yukarıda anlattığı konuları pekiştirmesi açısından örnek bir uygulamanın temel parçalarıyla devam edelim. Geçen yıl bir sitenin online ders hizmetlerini, internet bağlantısı olmadan off-line takip edip ders çalışabilmek için yazdığım bir uygulama ile örneklemi geliştirelim. Uygulamada kullanılan kaynak dosyalarının telif hakları nedeniyle uygulamayı ve kaynak dosyaları veremiyorum.Uygulama kodlarını buraya tıklayarak inceleyebilirsiniz.

Uygulama Ana Ekran Görüntüsü -

Uygulama Ana Ekranının Tasarımı :

Form üzerinde sol tarafta işlem seçimi için düğmeler ve menüler mevcut.Bu bölüm özel bir açılır-kapanır panel bileşenin üzerinde sola dayalı olarak sabitlenmiş halde. Ekranı kalan kısmını kaplayacak şekilde kaynak flash dosyalarını göstermek içinde bir TWebBrowser nesnesi yerleştirdim.

UYGULAMADA ÖNEMLİ KODLAR VE AÇIKLAMALAR

Formun OnCreate yönteminde kullanıcının seçimine bağlı açılan dosyaları takip edebilmek için swfAcilanDosyaList : TStringList nesnesini yaratıyoruz. Bu nesne uygulama boyunca açılan kaynak dosyalarını daha sonra bilgisayar üzerinden kaldırabilmek için Formun OnClose yönteminde kullanılıyor. Temel yapılandırma işlemlerimizide aşağıdaki yöntem içinde yazıyoruz.

procedure TForm_Matematik.FormCreate(Sender: TObject);
begin
swfAcilanDosyaList := TStringList.Create;
EskiSes :='';
swfDosyaAdi:='';
WindowState := wsMaximized;
end;

Kullanıcı tarafından tıklanan menü seçeneğine uygun yöntemi yazıyoruz. Aşağıda ki yöntem birbiriyle ilinti 4 ayrı kaynak dosyayı geçici olarak sabit disk üzerine açıyor. Burada kaynağı kullanabilmek için mutlaka derleme içinden çıkarmamız gerekiyor. Derleme içinden çıkarma işlemi için ;

Tıklanan menü seçeneğinin seçili olduğunu gösteren check işaretini yerleştiriyoruz.
FlashYukle yöntemini aşağıdaki parametrelerle çağırarak kaynağı sabit disk üzerinde açıyoruz
Kaynak dosyayı derlerken kullandığımız isim. (MATEMATIK010101ORNEK)
Action nesnesinin Hint özelliğinde statik olarak tuttuğumuz kaynağı açacağımız yol.
Kaynak dosya için bir isim
Açtığımız en son kaynak aktif olacağından FlashYukle fonksiyonundan dönen dosya yolu ve adı bilgisini webbrowser'a aktarmak için swfDosyaAdi private değişkenine atıyoruz.
Sabit disk üzerinde açtığımız kaynağı Webbrowser nesnesiyle görüntülüyoruz.
Panel başlığını değiştiriyoruz
procedure TForm_Matematik.Act_0101Execute(Sender: TObject);
begin
(Sender as TAction).Checked := True;
FlashYukle('MATEMATIK010101ORNEK',(Sender as TAction).Hint,'ornek.swf');
FlashYukle('MATEMATIK010101COZUM',(Sender as TAction).Hint,'cozum.swf');
FlashYukle('MATEMATIK010101TEST',(Sender as TAction).Hint,'test.swf');
FlashYukle('MATEMATIK010101KONU',(Sender as TAction).Hint,'konu.swf');
swfDosyaAdi := FlashYukle('MATEMATIK010101SORU',(Sender as TAction).Hint,'soru.swf');
WebBrowser1.Navigate(swfDosyaAdi);
suiSideChannel1.Caption := 'ÜNİTE 01:01';
end;


Kaynak dosyaları sabit disk üzerine açan yöntem. Yöntem derleme içindeki kaynağı belirtilen yola export ediyor.
Function TForm_Matematik.FlashYukle(Const RCBolum,Yol,Dosya : String):String;
var
rStream: TResourceStream;
fStream: TFileStream;
fname: string;
begin
fname := ExtractFilePath(Paramstr(0))+Yol+Dosya;
rStream := TResourceStream.Create(hInstance, RCBolum, RT_RCDATA);
try
fStream := TFileStream.Create(fname, fmCreate);
try
fStream.CopyFrom(rStream, 0);
finally
fStream.Free;
end;
finally
rStream.Free;
end;
if swfAcilanDosyaList.IndexOf(FName)=-1 Then swfAcilanDosyaList.Add(FName);
Result := FName;
end;


Son olarakta uygulamanın kapanışı esnasında sabit diske açılmış tüm kaynak dosyalar kaldırılıyor.
procedure TForm_Matematik.FormClose(Sender: TObject;
var Action: TCloseAction);
Var i: Integer;
begin
For i:=0 To swfAcilanDosyaList.Count-1 do
if FileExists(swfAcilanDosyaList.Strings) then DeleteFile(swfAcilanDosyaList.Strings);
SetGorevCubugu(True);
end;

:( TEKRAR SÖYLÜYORUM ALINTIDIR!:(
ÇOK GÜZEL ANLATMIŞ TEŞEKKÜR EDİYORUM ARKADAŞIM'A!​
 

HTML

Üst