Avatar billede assassin Juniormester
16. februar 2005 - 14:52 Der er 17 kommentarer og
2 løsninger

Dato problem

Jeg har hentet en dato function fra http://eksperten.dk/spm/407671, men når jeg bruger den får jeg en dato der hedder 30-12-1899, hvordan kan det være?
Avatar billede martinlind Nybegynder
16. februar 2005 - 15:04 #1
hvad er det du vil, hvis det er fildato'er, så brug findfirst og kig på den TSearchRec du får tilbage, den indeholder alle datoer, create lastwrite osv.

/Martin
Avatar billede assassin Juniormester
16. februar 2005 - 15:37 #2
Jeg bruger findfirst

Når jeg trykker F1 på TSearchRec får jeg følgende:
  TSearchRec = record
    Time: Integer;
    Size: Integer;
    Attr: Integer;
    Name: TFileName;
    ExcludeAttr: Integer;
    FindHandle: THandle;
    FindData: TWin32FindData;
end;

Jeg kan ikke se hvor jeg kan finde datoen.
Avatar billede martinlind Nybegynder
16. februar 2005 - 15:44 #3
Her FindData.xxxxxxx
Avatar billede assassin Juniormester
16. februar 2005 - 15:52 #4
Jeg skal have sammenlignet disse to:
IF (Sr.FindData.ftCreationTime = DateTimePicker1.Date) THEN

og jeg får en fejl: incompatible types.

Hvad type er Sr.FindData.ftCreationTime?
Avatar billede martinlind Nybegynder
16. februar 2005 - 15:59 #5
FileTimeToDatetime eller noget i den stil, det kan du se i hjælpen til TSearchRec
Avatar billede assassin Juniormester
18. februar 2005 - 09:59 #6
Det kan godt være at det kniber med mine øjne, men jeg kan absolut ikke finde noget om det i hjælpen
Avatar billede martinlind Nybegynder
18. februar 2005 - 10:22 #7
Du har ret, DU SKAL ha briller !!!!

Note:

The faReadOnly constant has the same name as the enumerated value that is defined by the TFieldAttribute type. If both the SysUtils and the Db units are used in your source files, you must disambiguate by specifying the unit to qualify the use of faReadOnly. That is, write SysUtils.faReadOnly (Delphi) or SysUtils::faReadOnly (C++).

To test for an attribute, combine the value of the Attr field with the attribute constant with the and operator. If the file has that attribute, the result will be greater than 0. For example, if the found file is a hidden file, the following expression will evaluate to true:

(SearchRec.Attr and faHidden) <> 0.
(SearchRec.Attr & faHidden) != 0.

----->>>>>  Time contains the time stamp of the file. It can be converted to a TDateTime value using FileDateToDateTime. <<<<<-------------------

Size contains the size of the file in bytes.

Name contains the base file name, including extension.

FindHandle is an internal handle used to track find state.

FindData (Windows only) contains additional information such as the file creation time, last access time, and both the long and short file names.

Mode (Linux only) is the file's permission mask.
Avatar billede assassin Juniormester
18. februar 2005 - 11:23 #8
Jeg har prøvet følgende:
Jeg har prøvet følgende:
if (FileDateToDateTime(sr.FindData.ftCreationTime) = DateTimePicker1.Date) then
Her får jeg nedenstående fejl, når jeg compilere programmet
[Error] Main.pas(60): Incompatible types: 'Integer' and '_FILETIME'

if (FileDateToDateTime(FileAge(Sr.Name)) =  DateTimePicker1.Date ) then
får jeg følgende fejl: Invalid argument to date encode når jeg kører programmet.
Avatar billede hrc Mester
19. februar 2005 - 18:43 #9
Prøv: if CompareValue(FileDateToDateTime(Sr.Time)),DateTimePicker1.Date,0.001) = 0 then

CompareValue findes i Math
Avatar billede hrc Mester
19. februar 2005 - 18:45 #10
I øvrigt er der en funktion GetFileTime der returnerer alt det du har brug for.
Avatar billede assassin Juniormester
21. februar 2005 - 08:34 #11
Her er hele koden:

procedure TForm1.Button1Click(Sender: TObject);
var
  sr          : TSearchRec;
  Save_Cursor : TCursor;
  PDF, TIF    : Integer;
  bibliotek, FileName  : String;

begin
PDF          := 0;
TIF          := 0;
Bibliotek    := 'c:\data\';
FileName    := '*.*';

if findfirst(bibliotek+FileName, faAnyFile, sr) = 0 then
begin
  repeat
  if (sr.name<>'.') and (sr.name<>'..') then
  begin
    if (CompareValue(FileDateToDateTime(Sr.Time),DateTimePicker1.Date,0.001) = 0) AND
      ((copy(sr.Name, Length(sr.Name)-3, 4) = '.TIF') or
        (copy(sr.Name, Length(sr.Name)-3, 4) = '.tif')) Then inc(TIF);
  end;
  until findNext(sr)<>0;
  FindClose(sr);
end;                                                                                end;

Jeg har 21 tif filer i biblioteket og når jeg sætter DateTimePicker1 dato til 11-02-2005 og trykker på knappen, finder den ingen tif filer, selvom der ligger 2 tif filer med den dato.

Hvis jeg undlader linien:
if (CompareValue(FileDateToDateTime(Sr.Time),DateTimePicker1.Date,0.001) = 0) AND finder den 21 tif filer.

Jeg er løbet tør for ideer.
Avatar billede hrc Mester
21. februar 2005 - 10:24 #12
Mit forslag var naturligvis ikke fri for fejl... CompareValue = 0 er når de er ens. Jeg har ikke testet nedenstående kode (så meget får man ikke for 15 points), så det kan du gøre.

procedure TForm1.GetFilesCount(var aPDFCount, aTIFCount : integer; aCreationDate : TDateTime);
var
  Found : boolean;
  sr : TSearchRec;
  Extension : string;
  Save_Cursor : TCursor;
  CreateDate : TDateTime;
  Directory, FileName : String;
begin
  aPDFCount := 0;
  aTIFCount := 0;
  Directory := 'c:\data\';
  FileName := '*.*';
 
  Found := FindFirst(Directory + FileName, faAnyFile, sr) = 0;
  try
    while Found do
    begin
      if sr.name[1] <>'.' then
      begin
        Extension := AnsiUpperCase(ExtractFileExt(sr.Name));
        CreateDate := FileDateToDateTime(Sr.Time);

        if (CreateDate >= aCreationDate) then
        begin
          if AnsiSameStr(Extension,'.TIF') then
            inc(aTIFCount);
          if AnsiSameStr(Extension,'.PDF') then
            inc(aPDFCount);
        end;
      end;
      Found := FindNext(sr) = 0;
    end;
  finally
    FindClose(sr);
  end;
end;
Avatar billede hrc Mester
21. februar 2005 - 10:27 #13
Resultatet sammenligner med den dato hvor filen sidst blev modificeret. Hvis du skal have fat i oprettelsesdatoen, så må du nok til at lege med GetFileDate()

I øvrigt kan du slette CreateDate : TDateTime i var-listen (og sikkert også SaveCursor).
Avatar billede assassin Juniormester
21. februar 2005 - 11:49 #14
Jeg har ikke fået løst problemet, men jeg tror at jeg skal have skilt tiden fra datoen i TDateTime.

Jeg udlovede 15 points, fordi jeg troede at det var en simpel løsning.

Martinlind - hrc, hvis i mener det er for lidt points, så siger i bare til.
Avatar billede assassin Juniormester
21. februar 2005 - 12:06 #15
Jeg har løst problemet på følgende måde:
if (FormatDateTime('dd-mm-yyyy',CreateDate) = FormatDateTime('dd-mm-yyyy',aCreationDate)) then

Tak for hjælpen
Avatar billede hrc Mester
21. februar 2005 - 12:36 #16
Havde misforstået opgaven. Troede at det var alle filer nyere end datoen. Du har løst det på en ret grim måde. Prøv denne her, der fjerner tid-delen fra datoen:

if trunc(CreateDate) = trunc(aCreationDate) then...

TDateTime er en double, hvor heltalsdelen er antallet af dage og decimaldelen er antallet af milisekunder siden dagens start. Med trunc skærer man decimaldelen væk og vupti, så har man antallet af dage siden Kong Volmer.
Avatar billede assassin Juniormester
21. februar 2005 - 13:37 #17
Ja, selvfølgelig. Nogle gange er løsningen så ligetil, uden man kan se den.

Tak.
Avatar billede hrc Mester
21. februar 2005 - 14:32 #18
Skal det være helt korrekt, så skal du inkludere unitten DateUtils og bruge DateOF funktionen i stedet for trunc, men det er flueknepperi.
Avatar billede martinlind Nybegynder
21. februar 2005 - 14:54 #19
hrc >> måde ja og nej, hvis delphi en dag ændre deres TDateTime format vil DateOF() sikkert være den måde der Stadig virker og Truc() den der er fucked
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