12. december 2004 - 12:43Der 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);
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.
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. ;)
"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);
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.