PDA

View Full Version : E Delphi ?....


Thoruno
24-02-2004, 18:32
Spero che qualcuno sia in forma per Delphi 4 -5 :help:
Allora:.. :O
Devo fare un programmino che mi modifichi la data e l'ora di uno o più File e che nel FileListBox o un altro Oggetto mi si visualizzi anche la data e l'ora dei vari File ( insomma come WinCommander ).
Spero di essere stato chiaro, anzi limpido.

Ciao a tutti e un grazie ai Bravoni che mi aiuteranno.

DanieleC88
24-02-2004, 20:05
Hmm... non mi ricordo quale chiamata Win32 API ti permette di farlo... devo fare una ricerca, se trovo qualcosa ti faccio sapere (credo Domenica).

Thoruno
24-02-2004, 20:44
Aspetto con fiducia Ciao

DanieleC88
28-02-2004, 14:04
Allora, ancora non ho trovato esattamente come fare, ma è già un inizio: (per questioni di tempo ho potuto fare solo una ricerca al volo, ora!)

IN C/C++:
BOOL SetFileToCurrentTime(HANDLE hFile)
{
FILETIME ft;
SYSTEMTIME st;
BOOL f;

GetSystemTime(&st); // gets current time
SystemTimeToFileTime(&st, &ft); // converts to file time format
f = SetFileTime(hf, // sets last-write time for file
(LPFILETIME) NULL, (LPFILETIME) NULL, &ft);

return f;
}

che IN DELPHI dovrebbe essere:
uses (...), Windows, (...);
(... altro ...)

function SetFileToCurrentTime(const hFile: Handle): Boolean;
var
ft: FILETIME; // o forse tagFILETIME
st: SYSTEMTIME; //o forse tagSYSTEMTIME
f: Boolean;
begin
//oopss... non ricordo più quale operatore restituisce un
//puntatore alla variabile... mi sembra sia "@"...
GetSystemTime(@st); // gets current time
SystemTimeToFileTime(@st, @ft); // converts to file time format
f := SetFileTime(hf, // sets last-write time for file
LPFILETIME(NULL), LPFILETIME(NULL), @ft);

Result := f;
end;


Se hai problemi, scrivi e proverò a risolverteli.

Thoruno
02-03-2004, 17:22
Ciao DanieleC88, scusami del ritardo:

ho provato a far funzionare il tuo esempio ma mi da qualche problema.

Anche perchè non ho ancora capito bene il significato di 'function'
e tutte le variabili interne.

Per visualizzare l'ora sulla Form io ho fatto cosi circa:

dichiaro la procedura:

type
...........
................
........
................
procedure AppIdle(Sender: TObject; var Done: Boolean);
procedure FormCreate(Sender: TObject);

implementation


Procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean); // Aggiorna
begin // l'ora e
Label1.Caption:=FormatDateTime('hh.nn.ss - dd/mm/yyyy',Now); // la Data
Done:=False; // Tiene aggiornato di continuo la data e l'ora
end;


{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:=AppIdle; // Informa l'applicazione che il nome
// dell'evento è in AppIdle

end;

procedure TForm1.AddItem(Name : String; Size : Integer; Time : Integer; Attr : Integer);
var
Item : TListItem;
ShFileInfo : TSHFILEINFO;

begin
Item:=ListView1.Items.Add;
Item.Caption:=Name; // --- Nome del File

// --- Visualizza la Data e l'ora ( dopo la colonna Nome File )
Item.SubItems.Add(DateTimeToStr(FileDateToDateTime(Time)));
end;
end.

Con qualche ritocco circa va; fatto + o - questo, devo modificare
la data o l'ora del File. :mc:

Ciao Mario

DanieleC88
10-03-2004, 20:15
Mi devo scusare anche io, ora, per il ritardo... cmq, credo che vada bene anche quel DateTimeToStr(FileDateToDateTime(Time)) che hai usato, ma, sai, nel Delphi sono un po' arrugginito... se hai ancora bisogno di consigli, "fai un fischio".

Thoruno
10-03-2004, 21:00
Adesso devo modificare la data o l'ora del File che seleziono e poi salvare le nuove modifiche.

Come devo Fare? :mad: :rolleyes:

Spero che qualcuno mi venga in AIUTOOO!!

Ciao Mario.

DanieleC88
12-03-2004, 18:11
Hmm... vedi che ti ho mandato io il codice, nella mia prima risposta. Devi usare l'API SetFileTime...

BOOL SetFileTime(
HANDLE hFile, // identifies the file
CONST FILETIME *lpCreationTime, // time the file was created
CONST FILETIME *lpLastAccessTime, // time the file was last accessed
CONST FILETIME *lpLastWriteTime // time the file was last written
);

e....

typedef struct _FILETIME { // ft
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

ma non hai bisogno di tutto questo: Windows (salva addirittura differenze di nanosecondi), userai solo la seconda.

Dove:
- hFile corrisponde all'handle del file aperto (meglio usare un TFileStream, in modo da ottenere facilmente l'handle);
- lpCreationTime corrisponde al tempo della creazione;
- lpLastAccessTime corrisponde all'ultimo accesso;
- lpLastWriteTime corrisponde all'ultima scrittura.

Quindi, in Delphi basterà usare:
uses (...qualcosa...), Windows, (...qualcos'altro...);

//In una funzione o in una procedura:
var
FileAperto: TFileStream;
TempoCreazione: tagFILETIME;
TempoAccesso: tagFILETIME;
TempoScrittura: tagFILETIME;
begin
TempoCreazione.dwHighDateTime = (la data che ti serve, valore numerico);
TempoAdesso.dwHighDateTime = (la data che ti serve, valore numerico);
TempoScrittura.dwHighDateTime = (la data che ti serve, valore numerico);
SetFileTime(FileAperto.Handle, @TempoCreazione, @TempoAdesso, @TempoScrittura);
end;

Così dovrebbe andare, ma non ne sono sicuro... non uso il Delphi da un po'.

Thoruno
12-03-2004, 19:20
Beh, intanto grazie per questo.
Provo e ti farò sapere se funziona.
Io ho fatto qualcosa anni fa, ma non mi sono mai addentrato nei meandri della API di windows; anche perchè non ne avevo bisogno.
Grazie ancora e a presto.

Ciao Mario

DanieleC88
14-03-2004, 14:38
Originariamente inviato da Thoruno
Beh, intanto grazie per questo.
Provo e ti farò sapere se funziona.
Io ho fatto qualcosa anni fa, ma non mi sono mai addentrato nei meandri della API di windows; anche perchè non ne avevo bisogno.
Grazie ancora e a presto.

Ciao Mario

A proposito di API (non dovresti avere problemi dato che hai il Delphi, ma...), se non hai la relativa guida dovresti scaricarla.

Thoruno
19-03-2004, 19:58
Ho provato ad usare il tuo consiglio ma mi da l'errore nell'ultima riga, dove c'è la @.
Le var sono state definite:

TempoCreazione.dwHighDateTime = (la data che ti serve, valore numerico);

TempoAdesso.dwHighDateTime = (la data che ti serve, valore numerico);

TempoScrittura.dwHighDateTime = (la data che ti serve, valore numerico);

SetFileTime(FileAperto.Handle, @TempoCreazione, @TempoAdesso, @TempoScrittura);

dove io dovrei inserire la data, come dovrebbe essere scritta?
E poi come faccio a vedere il risultato se è cambiato tramite una Label?

Ultima cosa (per il momento) dove posso scaricare la guida sulle API di win.

Ciao Mario

PS: E non ti illudere che sia finita qui !!!

DanieleC88
21-03-2004, 20:54
Originariamente inviato da Thoruno
PS: E non ti illudere che sia finita qui !!!

:D :D :D no problem.

Cmq, la guida alle API di Windows dovrebbe essere compresa col Delphi. Se la trovi nel CD (o comunque nel menu "?" del Delphi), non scaricarla, perchè è molto grande (~25 mega). Non so di preciso dove trovarla, ma cerca un po' in msdn.microsoft.com.

Per quanto riguarda la data: la data è un valore numerico che nel Delphi ha come sottotipo "TDateTime" (cercalo nella guida del Delphi per maggiori informazioni).

Provo a riscriverti la routine, dovrebbe andare così:
procedure ImpostaTempo(const Creazione, Scrittura: TDateTime);
var
FileAperto: TFileStream;
TempoCreazione: tagFILETIME;
TempoAccesso: tagFILETIME;
TempoScrittura: tagFILETIME;
begin
TempoCreazione.dwHighDateTime = Creazione;
TempoAdesso.dwHighDateTime = Now; //o qualcosa di simile
TempoScrittura.dwHighDateTime = Scrittura;
SetFileTime(FileAperto.Handle, @TempoCreazione, @TempoAdesso, @TempoScrittura);
end;

Per ultimo: mi spieghi che vuoi dire con "E poi come faccio a vedere il risultato se è cambiato tramite una Label" ?

Thoruno
22-03-2004, 18:43
Per ultimo: mi spieghi che vuoi dire con "E poi come faccio a vedere il risultato se è cambiato tramite una Label" ?


Quando io modifico la data o l'ora, oppure le due cose contemporaneamente (data e ora), come faccio a vedere le modifiche con una label?
Spero di essere stato chiaro.

Proverò al più presto quello che mi hai scritto.

Ciao e grazie ancora Mario

DanieleC88
22-03-2004, 23:23
Beh, nel tuo caso credo che la soluzione migliore sia creare una funzione apposita che aggiorna le data e l'ora. Se stai creando un programmino tipo Explorer, che ti faccia vedere data ed ora di ogni file (quando si usa la visualizzazione Elenco), allora questa è la migliore soluzione, in quanto la stessa funzione la potrai usare al caricamento di una cartella e per aggiornare le date in eltri eventi.
In questo caso, basta che tu chiami nuovamente questa funzione dopo aver cambiato data ed ora al file, e questa farà il resto.

cionci
23-03-2004, 09:33
Thoruno: hai la firma irregolare... Deve essere max 3 righe, la tua sono 4. Puoi correggere ? Grazie ;)

Thoruno
23-03-2004, 20:10
Chiedo Venia
--------------------