dosya sayısını sürekli arttırmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

dosya sayısını sürekli arttırmak

Mesaj gönderen carsoft »

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
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: dosya sayısını sürekli arttırmak

Mesaj gönderen ertank »

Merhaba,

Mevcut kodu paylaşabilir misiniz?
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: dosya sayısını sürekli arttırmak

Mesaj gönderen carsoft »

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;
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: dosya sayısını sürekli arttırmak

Mesaj gönderen ertank »

Ö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:

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.
Form1.dfm kodu:

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
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: dosya sayısını sürekli arttırmak

Mesaj gönderen carsoft »

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
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: dosya sayısını sürekli arttırmak

Mesaj gönderen ertank »

Şahsi görüşüm Application.ProcessMessages satırını silin.
Cevapla