w winxp w 'dodaj/usun programy' znajduje sie informacja o tym kiedy aplikacja byla ostatni raz uzyta - jak mozna to sprawdzic? gdzie takie informacje sa zapisane?
U mnie to zwykło kłamać przynajmniej w połowie przypadków - ale sądzę, że Windows próbuje sprawdzać atrybut Last Access głównego pliku programu.
W takim wypadku jak z tego kozystac? Tzn wiem ze jest to sr.FindData.ftLastAccessTime ale nie wiem jak to w stringa przezucic! Typ to _FILENAME i nie wiem co zrobic zebym mogl to odczytac jako date lub jako stringa!! :-(
nie _FILENAME tylko _FILEDATA :)
kurw... :-[ tam jest naturalnie _FILETIME - wielkie sorki! jezeli jest tam moze przypadkiem ktos kto moze poprawic to to niech zmieni tam juz w pierszej czesci te bledne informacje a te dwa posty niech wykasuje - bede wdzieczny :p
Poczytaj o Windowsowej funkcji FileTimeToDosDateTime - dajesz jej parametr _FILETIME, a otrzymujesz dwa słowa (16-bitowe), których znaczenie jest dokładnie podane:
lpFatDate
Points to a variable to receive the MS-DOS date. The date is a packed 16-bit value with the following format:
Bits Contents
0-4 Day of the month (1-31)
5-8 Month (1 = January, 2 = February, etc.)
9-15 Year offset from 1980 (add 1980 to get actual year)
lpFatTime
Points to a variable to receive the MS-DOS time. The time is a packed 16-bit value with the following format:
Bits Contents
0-4 Second divided by 2
5-10 Minute (0-59)
11-15 Hour (0-23 on a 24-hour clock)
Poszperalem i przypadkiem znalazlem cos takiego:
procedure TForm1.Button1Click(Sender: TObject);
var
Data_Old: TFileTime;
Data_New: TSystemTime;
begin
{...}
Data_Old := sr.FindData.ftLastAccessTime;
FileTimeToSystemTime(Data_Old, Data_New);
Label1.Caption:='Ostatni dostęp: '+
IntToStr(Data_New.wDay)+
'.'+
IntToStr(Data_New.wMonth)+
'.'+
IntToStr(Data_New.wYear);
end;
end;
To poprawnie konwertuje date ALE niestety wynik jest nastepujacy: np. 2.8.2003. Jak sie do tego doda jeszcze godzine to w ogole jest cos takiego 2.8.2003 8:12:1 zamiast np. 02.08.2003 08:12:01. Jak to zmienic? Wiem ze najprosciej byloby sprawdzac to w taki sposob:
if Data_New.wDay<10 then
Label1.Caption:=Label1.Caption+'0'+inttostr(Data_New.wDay)
else
Label1.Caption:=Label1.Caption+inttostr(Data_New.wDay);
Ale to poroniony pomysl bo na kazdy plik trzeba sprawdzic ok 5 elementow a jezeli chce sie przeanalizowac setki plikow to takie cos potwornie obciaza system. Czy to jedyny sposob na przekonwertowanie tej daty? A moze jakis inny pomysl? Tam niestety nie ma konkretnej daty - jedynie da sie odczytac rok, miesiac, dzien, dzien tygodnia, godzine, minute, sekunde, milisekunde. Kojarzy mi sie ze jest jakas procedura ktora by sobie z tym poradzila ale nie pamietam jaka...
Jak mnie to denerwuje! :-[ Zawsze uswiadamiam sobie (lub przypominam sobie - tak jak w tym wypadku) jak rozwiazac problem kiedy juz zadam pytanie na forum!! :-[ Odpowiedz jak to zrobic:
EncodeDate(M.wYear, M.wMonth, M.wDay))+
' '+
TimeToStr(EncodeTime(M.wHour, M.wMinute, M.wSecond, M.wSecond))
Owszem - wiem ze jest funkcja EncodeDateTime() ale ona u mnie nie chce dzialac :( Nie wiem czemu!
Mysle ze to koniec problemow zwiazanych z tym watkiem! :-)
[cya]
PS. IKARI - OGROMNE dzieki za pomoc :)