CopyFile ve ProgressBar
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
CopyFile ve ProgressBar
Delphi 'de CopyFile(kaynak_dosya, kopyalanacak_dosya_adi, Boolean ) API fonksiyonunu kullanarak dosyayi kocuren zaman, bu dosyayi kocurme surecini ProgressBar ile gostermek olurmu? Yani dosyanin boyutu buyuk oldugunda ProgressBar usun sure harekety edicek, kucuk oldugunda az.
Onceden tesekkurler.
Onceden tesekkurler.
Selam...
- Kopyalama işlemini FileStream ile kendin yaparsan her adımda bir progressbar'ı tetikleyebilirsin...
- Diğer türlü CallBack operation sözkonusu olur ki oldukça detaylı bir işlem... Bu işlemn nasıl olduğu hakkında, SQL için @naile'nin verdiği linkte de araştırmış ama doyurucu bir cevaba rastlamamıştım.
- Önerim yulkarda bildirdiğim şekilde FileStream ile kopyalama işlemini yapman...
- Kopyalama işlemini FileStream ile kendin yaparsan her adımda bir progressbar'ı tetikleyebilirsin...
- Diğer türlü CallBack operation sözkonusu olur ki oldukça detaylı bir işlem... Bu işlemn nasıl olduğu hakkında, SQL için @naile'nin verdiği linkte de araştırmış ama doyurucu bir cevaba rastlamamıştım.
- Önerim yulkarda bildirdiğim şekilde FileStream ile kopyalama işlemini yapman...
Max ve Min
ProgressBar bileseninin Max ozelliyini koplalama surecine baglamak oluyormu?
Ben şöyle yapıyorum
Öncelikle kopyalanacak dosyaların bulunduğu klasörü filelistboxa aktarıyorum.
filelistbox1.Items.Count ile klasör içinde bulunan dosya sayısını progressbarın max ına eşitliyorum.
Daha sonra her dosya aktarıldığında prograssbarı 1 artırıyorum.
Tabi eğer aktaracağınız dosya sayısı fazla ise bu işe yarıyor. Ama büyük bir dosyayı aktaracaksanız klasörü windows apileri ile kopyalamanızı tavsiye ederim. (Windowsun klasik kopyalaması)
Öncelikle kopyalanacak dosyaların bulunduğu klasörü filelistboxa aktarıyorum.
filelistbox1.Items.Count ile klasör içinde bulunan dosya sayısını progressbarın max ına eşitliyorum.
Daha sonra her dosya aktarıldığında prograssbarı 1 artırıyorum.
Tabi eğer aktaracağınız dosya sayısı fazla ise bu işe yarıyor. Ama büyük bir dosyayı aktaracaksanız klasörü windows apileri ile kopyalamanızı tavsiye ederim. (Windowsun klasik kopyalaması)
Bilgi paylaşıldıkça güzeldir.
Selam...
- Biraz vaktim vardı CallBack Function dediğim olayı biraz daha araştırınca şunu buldum.. CopyFile() yerine CopyFileEx() API'sini kullanırsan CallBack şansın oluyormuş...
- Denedim oluyor... Aşağıdaki kod tam istediğin işlemi gerçekleştiriyor...
- Formuna bir tane ProgressBar koy, adı otomatik olarak ProgressBar1 olacaktır... Button1 örneğindeki ProgressBar1, form üzerindekini simgeliyor...
- Başarılar... Sayende yeni bişi öğrenmiş olduk...
- Biraz vaktim vardı CallBack Function dediğim olayı biraz daha araştırınca şunu buldum.. CopyFile() yerine CopyFileEx() API'sini kullanırsan CallBack şansın oluyormuş...
- Denedim oluyor... Aşağıdaki kod tam istediğin işlemi gerçekleştiriyor...
- Formuna bir tane ProgressBar koy, adı otomatik olarak ProgressBar1 olacaktır... Button1 örneğindeki ProgressBar1, form üzerindekini simgeliyor...
Kod: Tümünü seç
Var
FCancelled : Boolean;
function CopyFileWithProgressBar2(TotalFileSize,
TotalBytesTransferred,
StreamSize,
StreamBytesTransferred: LARGE_INTEGER;
dwStreamNumber,
dwCallbackReason: DWORD;
hSourceFile,
hDestinationFile: THandle;
lpData: Pointer): DWORD; stdcall;
begin
// just set size at the beginning
if dwCallbackReason = CALLBACK_STREAM_SWITCH then
TProgressBar(lpData).Max := TotalFileSize.QuadPart;
TProgressBar(lpData).Position := TotalBytesTransferred.QuadPart;
Application.ProcessMessages;
Result := PROGRESS_CONTINUE;
end;
function CopyWithProgress(sSource, sDest: string; ProgressBar : TProgressBar): Boolean;
begin
// set this FCancelled to true, if you want to cancel the copy operation
FCancelled := False;
Result := CopyFileEx(PChar(sSource), PChar(sDest), @CopyFileWithProgressBar2,
ProgressBar, @FCancelled, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CopyWithProgress('D:\My Shared Folder\Britney Spears - Toxic (DVD Rip).mpeg', 'E:\deneme.mpg', ProgressBar1);
end;
Bu mesaj ilk atıldığında copyfile ile yapılamayacagını soylemeye niyetlenmiştim ki sonra dur biraz bekliyim dedim... Bakın neler cıktı.... Gerci gene copyfile ile olmamış oldu ama... 
Neticede ufkumuz genişledi... Sağolun arkadaşlar....

Neticede ufkumuz genişledi... Sağolun arkadaşlar....

* http://www.fahrettin.org Manzara Fotoğraflarım... 
* http://delphiturkiye.gunduz.info Seminerler...
* http://www.hakmar.com.tr Kalite bir haktır...

* http://delphiturkiye.gunduz.info Seminerler...

* http://www.hakmar.com.tr Kalite bir haktır...

Soruya yeni başlık açmak istemedim, sorudur yani :)
merhaba.
kopyalama işlemi esnasında bir progress ile durumu göstermemiz istendi.muharrem abinin kodlarını yazdım stabil çalıştı.ta ki bu sabaha kadar..kodlamaya devam ederken bu işlem aksamaya başladı.kopyalama yapmıyor genel olarak.fonksiyonu yeni bi projede denedim yine stabil çalışıyor.ancak üzerinde çalıştığımız projede kopyaladığı dosyayı (hedef) ortadan kaldırıyor ve yenisini yüklemiyor.aynı satırda copyfile apisi ile deniyorum yine stabil çalışıyor..bu ne yaman çelişkidir
saygılar..
kopyalama işlemi esnasında bir progress ile durumu göstermemiz istendi.muharrem abinin kodlarını yazdım stabil çalıştı.ta ki bu sabaha kadar..kodlamaya devam ederken bu işlem aksamaya başladı.kopyalama yapmıyor genel olarak.fonksiyonu yeni bi projede denedim yine stabil çalışıyor.ancak üzerinde çalıştığımız projede kopyaladığı dosyayı (hedef) ortadan kaldırıyor ve yenisini yüklemiyor.aynı satırda copyfile apisi ile deniyorum yine stabil çalışıyor..bu ne yaman çelişkidir

saygılar..
Merhabalar dediğiniz olayı copy procedur ile şu şekilde yapabilirsiniz:
kopyalanacak dosyaların olduğu klasörü filelistboxa aktarın.Ya da kopyalanacak dosyaların isimlerini bir memo nesnesine aktarın.Ben örnekte memoyu kullandım.Kodlar tam bu şekil değil.Mantığı göstermek açısından bir örnek:
daha pratik bi şekilde "Gauge1.Progress:=Gauge1.Progress+z;" komutunu bir while do döngüsü ile de halledebilirsiniz iş sizin hayal gücünüze kalmış.Benim göstermek istediğim nokta klasördeki dosya sayısını alır ve 100'e bölersiniz böylece eğer klasörde 100 dosyanız varsa 100/100=1 den progressbar 1'er 1'er artar eğer 10 dosyanız varsa 100/10=10 dan 10'ar 10'ar artar.Umarım yardımcı olabilmişimdir.Galiba CopyFile ile oldu Fahrettin abi 
Saygılar...
kopyalanacak dosyaların olduğu klasörü filelistboxa aktarın.Ya da kopyalanacak dosyaların isimlerini bir memo nesnesine aktarın.Ben örnekte memoyu kullandım.Kodlar tam bu şekil değil.Mantığı göstermek açısından bir örnek:
Kod: Tümünü seç
procedure TForm1.Button3Click(Sender: TObject);
var
b:Real;
z,y: Integer;
begin
Gauge1.MinValue:=0;
y:=Memo2.Lines.Count;
b:=100/y;
z:=Floor(b);
FileCopy ('c:\progra~1\dvd\data\1.08\Bnclient.dll', 'c:\oyun\Bnclient.dll');
Gauge1.Progress:=Gauge1.Progress+z;
FileCopy ('c:\progra~1\dvd\data\1.08\BNUpdate.exe','c:\oyun\BNUpdate.exe');
Gauge1.Progress:=Gauge1.Progress+z;

Saygılar...
En son burakk tarafından 05 Oca 2005 12:46 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Daha iyi bir yaşam ancak daha iyi bir senle mümkün olabilir. O'Sensei Morihei Ueshiba