Avatar billede dl Nybegynder
12. december 2004 - 12:43 Der er 9 kommentarer og
1 løsning

Callback procedure, med en count

Jeg har en callback procedure, som skal find alle filer i en mappe samt undermapper... Det virker .... jeg kan bare ikke få en count til at virker, sådan at den fortæller hvor mange den har.

Jeg har prøvet at sætte en integer uden for, men der bliver ikke skrivet noget i den.

kode:
  .....
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    MaxCountedFiles: Integer;
  public
    { Public declarations }
  end;

var
  SelectDirectoryForm: TSelectDirectoryForm;

implementation

{$R *.dfm}

Procedure FindMaxfiles(aDirectory, aFileSpec: string; const aIncludeSubDir: boolean; aResultCount : Integer);
var
  Found : boolean;
  SearchRec: TSearchRec;
begin
  aDirectory := IncludeTrailingPathDelimiter(aDirectory);
  Found := FindFirst(aDirectory + '*',faAnyFile,SearchRec) = 0;
  try
    while Found do begin
      with SearchRec do
        if (Attr and faDirectory) = faDirectory then begin
          if (Name[1] <> '.') and aIncludeSubDir then
            FindMaxFiles(aDirectory + Name, aFileSpec, aIncludeSubDir, aResultCount);
        end
        else
          if MatchesMask(Name,aFileSpec) then
            Inc(aResultCount,1);

      Found := FindNext(SearchRec) = 0;
    end; // while
  finally
    FindClose(SearchRec);
  end; // try
end;


.....

procedure TSelectDirectoryForm.Button3Click(Sender: TObject);
begin
  selectDirectoryForm.MaxCountedFiles := 0;
  FindMaxfiles(SelectDirectoryForm.DirectoryListBox1.Directory,'*',true,SelectDirectoryForm.MaxCountedFiles);

  button3.Caption := inttostr( selectDirectoryForm.MaxCountedFiles );
end;


kode slut

Hvorfor vil den ikke tælle de filer, som den finder ?
Avatar billede arne_v Ekspert
12. december 2004 - 12:48 #1
Procedure FindMaxfiles(aDirectory, aFileSpec: string; const aIncludeSubDir: boolean; var aResultCount : Integer);

måske
Avatar billede arne_v Ekspert
12. december 2004 - 12:48 #2
(jeg har sat var ind  foran aResultCount)
Avatar billede dl Nybegynder
12. december 2004 - 12:51 #3
Fedt, det viker ... kom lige med et svar ... Også  hvorfor virker det, bare fordi jeg sætter en var foran ???
Avatar billede arne_v Ekspert
12. december 2004 - 12:55 #4
svar
Avatar billede arne_v Ekspert
12. december 2004 - 12:56 #5
var = ændringer lavet til variablen bevares ved retur til kalder

ikke var = ændringer lavet til variablen bevares ikke ved retur til kalder (i praksis:
man arbejder på en kopi)
Avatar billede dl Nybegynder
12. december 2004 - 12:57 #6
k, tak.
Avatar billede delphi Nybegynder
12. december 2004 - 18:16 #7
Jeg ved godt spørgsmålet er lukket, men konceptet der ligger bag er vigtigt at forstå, så jeg kommer lige med en lille mere teknisk forklaring:

Var
  A : Integer;

Procedure Test1(LocalA : Integer);
Begin
  LocalA := 1;
End;

Procedure Test2(Var LocalA : Integer);
Begin
  LocalA := 2;
End;

Begin
  A := 0;
  Test1(A);
  // Nu har A (stadig) værdien 0
  Test2(A);
  // Nu har A værdien 2
End.

Hvorfor? 
Når Test1 kaldes, så sendes værdien af A 'by Value'.  Dette betyder i prakisis, at værdien indeholdt i A, altså 0, kopieres til CPU-stakken og procedures kaldes.  Inde i Test1 vil variablen LocalA fysisk pege på det sted på stakken hvor 0'et blev placeret.  Denne værdi ændres til 1, men indholdet på stakken frigives når procedure kaldet afsluttes og da adressen der indeholder A ikke har været berørt, så vil den derfor stadig indehold den oprindelige værdi 0.

Når Test2 kaldes, så sendes adressen på variablen A 'by Reference'.  Der sker i praksis det, at der overføres en pointer til proceduren, som "overtages" af variablen LocalA.  Derfor vil både A og LocalA nu pege på precis den samme memory adresse.  Når du derfor ændrer den ene, så ændrer man altså også den anden - og derfor indeholder A værdien 2 efter kaldet af Test2.

Håber det hjalp.
Avatar billede dl Nybegynder
12. december 2004 - 18:48 #8
delphi >> ikke rigtig ... du sætter mig jo næsten af ingen du kommer igen.
Årøve lige igen, kort >>  Hvorfor bliver en string med var foran, overført og ikke slettet.

men ellers tak fordi du prøver... men har sku aldrig kunne finde ud af med de pointer. ;)
Avatar billede nop Nybegynder
17. december 2004 - 11:52 #9
"Peger til" i modsætning til "er en kopi af" er det svært at forstå?
Man kan opfatte en vaiabel som et stykke papir man kan skrive på, hvis man således laver en kopi så vil orginalen aldrig kunne ændres, hvis man derimod giver en peger til papiret så kan proceduren skrive på papiret.

Det er det sidste man vil bruge i fx inc(var); som er indbygget i Delphi og lægger en til variablen.
Hvis inc() lavede en kopi før den lagde én til, så ville man jo aldrig få variablen incrementeret. inc er altså defineret som proc inc(var x: integer);
Avatar billede dl Nybegynder
17. december 2004 - 19:37 #10
k, tak.... det var forståligt.. hehe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester