Ben bir klasördeki dosya sayısını alıyorum mesala 10 dosya var
ikinci bir dosyanında 5 dosya var tabi bu sayılar degişebilir
tüm dosya sayılarının sürekli toplamını almak istiyorum artarak
her dosyanın sayısını aldığımda sayı sıfırdan başlıyor ben üstüne ekleyerek devam etsin istiyorum ama olmuyor
dosya sayısını sürekli arttırmak
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: dosya sayısını sürekli arttırmak
Merhaba,
Mevcut kodu paylaşabilir misiniz?
Mevcut kodu paylaşabilir misiniz?
Re: dosya sayısını sürekli arttırmak
Arama kodu dosya sayısını buluyorum ama her aramada sıfırdan başlıyor
Kod: Tümünü seç
public
sayi: Integer;
Kod: Tümünü seç
private
{ Private declarations }
FNewLine: string;
Kod: Tümünü seç
procedure KlasorListele(const PathName: string);
const
FileMask = '*.*';
var
Rec: TSearchRec;
Path: string;
i : integer;
begin
Path := IncludeTrailingPathDelimiter(PathName);
if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
begin
try
repeat
Application.ProcessMessages;
if FileExists(Path + Rec.Name) then
begin
inc(sayi);
FNewLine := Path;
form1.Label3.Caption := IntToStr(sayi); // sayiyi buluyorum ama her dosya aramamda sıfırdan sayıyor, kalan sayıdan devam etmek istiyorum
end;
until FindNext(Rec) <> 0;
finally
SysUtils.FindClose(Rec);
end;
end;
end;
Re: dosya sayısını sürekli arttırmak
Öncelikle bazı konulara dikkat etmeniz gerekli.
1- Form sınıfı altında tanımladığınız değişkenlere forma ait olmayan bölümler üzerinden erişmeniz mümkün olmaz. Dolayısı ile private kısmındaki FNewLine değişkenini gönderdiğiniz KlasorListele() prosedürü içinde kullanamazsınız. Bu prosedürü yine Form sınıfı altında tanımlamanız gerekir.
2- FindFirst() fonksiyonu olmayan bir dosyayı listelemez. Dolayısı ile FileExists() fonksiyonunu kullanmanıza gerek yok.
3- KlasorListele() prosedürü içinde Application.ProcessMessages() prosedürünü çalıştırma sebebinizi anlamadım. Bana göre buna gerek yok. Yapılan işlemi yavaşlatır.
4- 1 numaralı madde ile ilişkili olarak Form sınıfının içine dahil edilmedikçe Form1.Label3.Caption özelliğinde değişiklik yapamazsınız.
Bu bilgiler ışığında gönderdiğiniz kod;
A- Projenin bize göndermediğiniz kısımlarındaki başka bir "sayi" değişkenini kullanıyor olabilir.
B- Proje içinden kopyalanmamış olabilir. Çünkü 1 ve 4 numaralı maddeler projenin derlenmesine engel teşkil eder.
Aşağıdaki şekilde denediğimde sorun yaşamadan her çalıştırmada rakamın arttığını gördüm.
Unit1.pas kodu:
Form1.dfm kodu:
1- Form sınıfı altında tanımladığınız değişkenlere forma ait olmayan bölümler üzerinden erişmeniz mümkün olmaz. Dolayısı ile private kısmındaki FNewLine değişkenini gönderdiğiniz KlasorListele() prosedürü içinde kullanamazsınız. Bu prosedürü yine Form sınıfı altında tanımlamanız gerekir.
2- FindFirst() fonksiyonu olmayan bir dosyayı listelemez. Dolayısı ile FileExists() fonksiyonunu kullanmanıza gerek yok.
3- KlasorListele() prosedürü içinde Application.ProcessMessages() prosedürünü çalıştırma sebebinizi anlamadım. Bana göre buna gerek yok. Yapılan işlemi yavaşlatır.
4- 1 numaralı madde ile ilişkili olarak Form sınıfının içine dahil edilmedikçe Form1.Label3.Caption özelliğinde değişiklik yapamazsınız.
Bu bilgiler ışığında gönderdiğiniz kod;
A- Projenin bize göndermediğiniz kısımlarındaki başka bir "sayi" değişkenini kullanıyor olabilir.
B- Proje içinden kopyalanmamış olabilir. Çünkü 1 ve 4 numaralı maddeler projenin derlenmesine engel teşkil eder.
Aşağıdaki şekilde denediğimde sorun yaşamadan her çalıştırmada rakamın arttığını gördüm.
Unit1.pas kodu:
Kod: Tümünü seç
unit Unit1;
interface
uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FNewLine: string;
procedure KlasorListele(const PathName: string);
public
{ Public declarations }
Sayi: Integer;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.KlasorListele(const PathName: string);
const
FileMask = '*.*';
var
Rec: TSearchRec;
Path: string;
begin
Path := IncludeTrailingPathDelimiter(PathName);
if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
begin
try
repeat
inc(sayi);
FNewLine := Path;
Label1.Caption := IntToStr(sayi); // sayiyi buluyorum ama her dosya aramamda sıfırdan sayıyor, kalan sayıdan devam etmek istiyorum
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
KlasorListele(Caption);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := ExtractFilePath(Application.ExeName);
end;
end.
Kod: Tümünü seç
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 289
ClientWidth = 554
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 24
Top = 55
Width = 31
Height = 13
Caption = 'Label1'
end
object Button1: TButton
Left = 24
Top = 24
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
Re: dosya sayısını sürekli arttırmak
Teşşekürler abi evet degişken içinde başka bir yerde kullanılıyormuş sayi degeri ondan teşşekürler
Application.ProcessMessages 'i çok dosya olursa diye kullandım ama cpu % 10 normalmi
Application.ProcessMessages 'i çok dosya olursa diye kullandım ama cpu % 10 normalmi
Re: dosya sayısını sürekli arttırmak
Şahsi görüşüm Application.ProcessMessages satırını silin.