26. november 2003 - 10:10Der er
5 kommentarer og 1 løsning
Find forgående billede ved hjælp af FindFirst og FindNext
Jeg ønsker at Finde det forgående billede i en given mappe ved hjælp af FindFirst og FindNext, når vi antager at min SearchRecord er et sted midt i billederækken. Jeg har tidligere i programmet brugt denne stump kode til at sortere billeder fra andre filer.
While (ExtractFileExt(sr.Name)<>'.jpg') and (ExtractFileExt(sr.Name)<>'.bmp') do Begin if FindNext(sr)<>0 then begin FindFirstBillede; exit; end; FindNext(sr); end;
Hmmm.... Jeg havde en ide om at søge hele mappen igennem, mens man hele tiden gemmer fundne billedes sti inden man finder næste billede. Når så man kommer til det billede som var aktuelt før hele søgningen begyndte, kunne man så kalde det billedes man gemte før man kaldte FindNext og fandt nuværende billede. Altså forgående billede, hvis jeg forstår mig selv ret. Eller... Da jeg ikke er så dreven i faget er jeg kun kommet frem til et resultat der nogen gange giver mig det rigtige billede. Hvis det kan være en hjælp til at hjælpe mig selv, vil jeg hellere end gerne smide koden her. Jeg er selvfølgelig åben for andre metoder. Hvilken type liste ville jeg med fordel kunne anvende? Det er aldrig lykkedes mig at lave en array med variable grænser, hvilket er grunden til at jeg fravalgte denne mulighed.
procedure TFilesData.FillStrings(aStrings: TStrings); var i : integer; FileData : TFileData; begin aStrings.BeginUpdate; try aStrings.Clear; for i := 0 to fFiles.Count - 1 do begin FileData := TFileData(fFiles.Items[i]); aStrings.AddObject(FileData.FileName,FileData); end; // for finally aStrings.EndUpdate; end; // try end;
function TFilesData.GetFileData(aIndex: integer): TFileData; begin result := TFileData(fFiles.Items[aIndex]); end;
procedure TFilesData.GetList; var sr : TSearchRec; bOK : boolean; begin fFiles.Clear;
bOK := FindFirst(fSearchSpec, faAnyFile, sr) = 0; try while bOK do begin if (sr.Name[1] <> '.') then // skip the '.' and '..' fFiles.Add(TFileData.Create(sr.Name)); bOK := FindNext(sr) = 0; end; // while finally FindClose(sr); end; // try end;
procedure TFilesData.Refresh; begin GetList; end;
procedure TFilesData.SetSearchSpec(const Value: string); begin fSearchSpec := Value; GetList; // One could argue whether it should be there or not.. end;
Tak skal du have. I øvrigt vil jeg gøre opmærksom på en fejl i dit eksempel. Du glemmer at bruge FindClose(sr) når dit FindNext loop er færdigt.
Gik i øvrigt helt amok med ovenstående og programmerede automatisk opdatering af listen (u. at frigive de filer der allerede fandtes og kun fjerne de som ikke længere var til stede i kataloget - skal have et indlæg ud på Eksperten om hvordan man detekterer ændringer i et katalog).
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.