Avatar billede the-unknown-soldier Nybegynder
26. november 2003 - 10:10 Der 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;
Avatar billede borrisholt Novice
26. november 2003 - 10:22 #1
Det kan du mig bekendt ikke. Du er nød til selv at lave en liste og så gå frem og tilbage i den.

Jens B
Avatar billede the-unknown-soldier Nybegynder
26. november 2003 - 21:54 #2
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.
Avatar billede hrc Mester
12. december 2003 - 10:44 #3
Prøv denne unit. Måske er det at skyde gråspurve med kanoner, men jeg hyggede mig ved at lave den...

unit UFileList;

interface

uses
  SysUtils, ContNrs, Classes;

type
  TFileData = class
  private
    fFileName : string;
  public
    constructor Create(const aFileName : string);
    property FileName : string read fFileName;
  end;

  // The list class starts here...

  TFilesData = class
  private
    fFiles : TObjectList; // Embedded inheritance
    fSearchSpec : string;
    function    GetFileData(aIndex: integer): TFileData;
    procedure  SetSearchSpec(const Value: string);
    procedure  GetList;
  public
    constructor Create(const aSearchSpec : string);
    destructor  Destroy; override;
    property    Items[aIndex : integer] : TFileData read GetFileData; default;
    property    SearchSpec : string read fSearchSpec write SetSearchSpec;
    function    Count : integer;
    procedure  Refresh;
    procedure  FillStrings(aStrings : TStrings);
  end;

implementation

{ TFile }

constructor TFileData.Create(const aFileName : string);
begin
  inherited Create;
  fFileName := aFileName;
end;

{ TFiles }

function TFilesData.Count: integer;
begin
  result := fFiles.Count;
end;

constructor TFilesData.Create(const aSearchSpec : string);
begin
  inherited Create;
  fFiles := TObjectList.Create;
  fSearchSpec := aSearchSpec;
  GetList;
end;

destructor TFilesData.Destroy;
begin
  try
    fFiles.Free;
  finally
    inherited;
  end; // try
end;

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;

end.
Avatar billede the-unknown-soldier Nybegynder
13. december 2003 - 12:53 #4
Den fortjener næsten mere end 30 point.
Jeg accepterer svaret!
Avatar billede hrc Mester
15. december 2003 - 11:16 #5
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).

God arbejdslyst
Avatar billede borrisholt Novice
15. december 2003 - 11:24 #6
hrc>> Brug FindFirstNotify

Jens B
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