 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14676 Aktiv.: 61.80 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Okt 29, 2007 12:26 pm Naslov sporočila: |
|
|
Help sem "obrnil" a nisem našel. A mogoče obstaja kaka funkcija slična FileAge, ki bi namesto nastanka datoteke vrnila nastanek direktorija? _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Pon Okt 29, 2007 1:24 pm Naslov sporočila: |
|
|
Silvo je napisal/a: |
Help sem "obrnil" a nisem našel. A mogoče obstaja kaka funkcija slična FileAge, ki bi namesto nastanka datoteke vrnila nastanek direktorija? |
Tudi direktorij je datoteka, le file atribute moraš pravilno nastaviti!
Lp GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14676 Aktiv.: 61.80 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Okt 29, 2007 4:06 pm Naslov sporočila: |
|
|
GJ je napisal/a: |
Silvo je napisal/a: |
Help sem "obrnil" a nisem našel. A mogoče obstaja kaka funkcija slična FileAge, ki bi namesto nastanka datoteke vrnila nastanek direktorija? |
Tudi direktorij je datoteka, le file atribute moraš pravilno nastaviti!
Lp GJ |
FileAge nisem znal pripravilt, da bi vrnila datum nastanka direktorija.
FileAge('C:\Windows') trmasto vrača -1 (datoteka ne obstaja);
Uspel pa sem malo drugače:
Koda: |
procedure TForm1.Button2Click(Sender: TObject);
var spisek:TSearchRec;
begin
FindFirst('c:\windows',faAnyFile,spisek);
Edit1.Text:=DateToStr(FileDateToDateTime(spisek.Time));
FindClose(spisek);
end; |
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Pon Okt 29, 2007 4:52 pm Naslov sporočila: |
|
|
Silvo je napisal/a: |
FileAge nisem znal pripravilt, da bi vrnila datum nastanka direktorija. |
Saj tega se niti ne da!
Ampak tale tvoja koda vseeno ne deluje tako kot bi morala!
Verjetno te zanima ftCreationTime in ne ftLastAccessTime???
Pravilno bi bilo nekako takole..
Koda: |
procedure TForm1.Button6Click(Sender: TObject);
var
spisek:TSearchRec;
LocalFileTime: TFileTime;
Time: Integer;
begin
FindFirst('c:\windows',faDirectory, spisek);
FileTimeToLocalFileTime(spisek.FindData.ftCreationTime, LocalFileTime);
FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi, LongRec(Time).Lo);
Edit1.Text:= DateToStr(FileDateToDateTime(Time));
FindClose(spisek);
end; |
Pa atribut moraš nastaviti na 'faDirectory' sicer lahko FindFirst najde file s tem imenom pa bo štala..
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14676 Aktiv.: 61.80 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Okt 29, 2007 5:04 pm Naslov sporočila: |
|
|
GJ hvala.
Tole tvojo proceduro moram preštudirat, atribut sem sicer že postavil na faDirectory (očitno kasneje kot sem kodo pripel na forum) Zanima me seveda čas kreiranja direktorija. V mojem primeru sicer vrača pravilno vrednost. Vrjetno zato, ker se ob "rabi" vrednost ne spreminja? _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Pon Okt 29, 2007 5:37 pm Naslov sporočila: |
|
|
Time, ki ga bereš ti je ftLastWriteTime (in ne ftLastAccessTime kot sem napisal) določi se znotraj FindFirst procedure, ki klice FindMatchingFile.
He, he... morda še ne veš..
Drži tipko 'Ctrl' in pojdi z miško nad ukaz 'FindFirst' v tvoji kodi programa, ko se ta obarva modro klikni (leva tipka na miški) in skočil boš v proceduro 'FindFirst'.
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14676 Aktiv.: 61.80 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Okt 29, 2007 6:04 pm Naslov sporočila: |
|
|
GJ je napisal/a: |
Time, ki ga bereš ti je ftLastWriteTime (in ne ftLastAccessTime kot sem napisal) določi se znotraj FindFirst procedure, ki klice FindMatchingFile.
He, he... morda še ne veš..
Drži tipko 'Ctrl' in pojdi z miško nad ukaz 'FindFirst' v tvoji kodi programa, ko se ta obarva modro klikni (leva tipka na miški) in skočil boš v proceduro 'FindFirst'.
LP GJ |
Zakon!! Seveda tega nisem vedel  _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Pon Okt 29, 2007 7:02 pm Naslov sporočila: |
|
|
Silvo je napisal/a: |
Zakon!! Seveda tega nisem vedel  |
Morda le še tole..
Delphi omogoča debugiranje tudi znotraj Delphi-jevih 'unit-ov', to je pri raziskovanju zelo uporabno.
Odkljukaš v project/Options/Compiler/Use Debug DCUs nakar v tvoji kodi nastaviš break point v tisti vrstici kjer imaš napisano recimo 'FindFirst'.
Break point nastaviš tako, da klikneš na vmesno sivo polje 'guter' na levem robu okna in vrstica se ti obarva rdeče.
Ko program pride do 'break point-a' se le ta ustavi in sedaj lahko debugiraš.
S pritiskom na F8 se izvede ena cela vrstica.
Če pa pritisneš F7 bo debuger skočil v procedure 'FindFirst', seveda le če Delphijevo okolje najde ustrezen unit.
Tipka F9 nadaljuje program.
Tipka pa Ctrl-F2 prekine program.
Posamezne variable lahko gledaš v 'Watch' oknu (predhodno jo seveda vneseš), ali pa da postaviš miškin kurzor na željeno variablo in malo počakaš.
LP GJ |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.61 Kraj: Kranj - struževo
|
Objavljeno: Tor Okt 30, 2007 1:59 pm Naslov sporočila: |
|
|
Pomoč prosim!
V Delphiju packam eno binarno datoteko, v kateri bodo podatki tipa Array of Single in Array of Integer.
Na začetku pa bi rad dodal eno besedilo, da se tudi v Notepadu vidi opis vsebine.
Koda je tole:
Koda: |
var
BinFileSave: File;
zacetni_txt : string;
---------------
AssignFile(BinFileSave, FileName);
Rewrite(BinFileSave, 1); // record size = 1
// točno 100 znakov besedila + 3 kontrolni znaki (ESC ta prekinitev izpisa ob TYPE ukazu)
zacetni_txt :=
'v10 Shranjen buffer meritev '
+ #13 + #10 + #27;
BlockWrite(BinFileSave, zacetni_txt, Length (zacetni_txt));
// tukaj bo vpis binarnih podatkov
CloseFile(BinFileSave);
|
Length vrne pravilno število znakov (=103). Tudi kreirana datoteka je dolga 103 byte.
Vsebina datoteke pa je:
Koda: |
¤ŤJ ˆŕ @¶© üö Š·D `˘ /NC X÷ -OC `˘ ‚˛D X÷ `ů `˘ Üö ˆbB~Zńwď(X‹x ď(˛„A~ | |
Help! _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14676 Aktiv.: 61.80 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Okt 30, 2007 3:51 pm Naslov sporočila: |
|
|
Mogoče takole? meni dela.
Koda: |
var
BinFileSave: File;
zacetni_txt :array[1..103] of char;
tekst:string;
x:integer;
begin
AssignFile(BinFileSave,'nov.txt');
Rewrite(BinFileSave, 1); // record size = 1
// točno 100 znakov besedila + 3 kontrolni znaki (ESC ta prekinitev izpisa ob TYPE ukazu)
tekst:='v10 Shranjen buffer meritev '
+ #13 + #10 + #27;
for x:=1 to length(zacetni_txt) do zacetni_txt[x]:=tekst[x];
BlockWrite(BinFileSave, zacetni_txt, Length (zacetni_txt));
// tukaj bo vpis binarnih podatkov
CloseFile(BinFileSave); |
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.61 Kraj: Kranj - struževo
|
Objavljeno: Tor Okt 30, 2007 4:38 pm Naslov sporočila: |
|
|
Silvo hvala za idejo, tale BlockRead očitno ne zna delati s String-i. Z Arrayi pa lepo dela. Sem uredil na tvoj način.
Pa še en problem je
Length () dololoča število elementov v arrayu
SizeOf () pa določi dejansko velikost enega elementa spremenljivke v RAMu. Če je spremenljivka tipa Array of Single, potem SizeOf vrne vrednost 4, ker Single zasede 4 byte
Deluje tudi "SizeOf (Integer)".
Za BlockWrite je uporaben samo Length(), ker ne šteje dejansko zasedenih bytov ampak elemente v arrayu. Tako piše v Help-u. Ampak, če naredim BlockWrite z Length, mi naredi prekratko datoteko (premalo podatkov, sodeč po dolžini fajla).
Če pa naredim BlockWrite z Length * SizeOf, je dolžina datoteke pravilna, ampak so notri smeti iz RAM-a. Nič jasno. _________________ I'm going to stand outside, so if anyone asks, I'm outstanding 
Nazadnje urejal/a aly Tor Okt 30, 2007 5:23 pm; skupaj popravljeno 2 krat |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.51
|
Objavljeno: Tor Okt 30, 2007 5:11 pm Naslov sporočila: |
|
|
Za stringe imas strlen(). _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.61 Kraj: Kranj - struževo
|
Objavljeno: Tor Okt 30, 2007 5:32 pm Naslov sporočila: |
|
|
Evo, če hočem zapisati cel buffer v datoteko, je treba kos za kosom. Celega array-a naenkrat žal ne zna.
Tole pa deluje:
Koda: |
dolzina_zapisa := Length (MeritevREF);
for i := 0 to dolzina_zapisa-1 do
BlockWrite(BinFileSave, MeritevREF[i], SizeOf(MeritevREF));
|
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Tor Okt 30, 2007 6:48 pm Naslov sporočila: |
|
|
Ojoj... pa saj vi živite še vedno v času DOSa???
Pozabite na stare čase že enkrat no...
Probajte nakeko takole:
Prva procedura shrani vrednost variable 's' druga pa jo ponovno naloži!
Nadzor teksta pa imamo v Edit1.
Koda: |
var
s: ShortString;
FileName : string = 'c:\test.txt';
procedure TForm1.Button6Click(Sender: TObject);
//Shrani variablo v 's' iz Edit1.text nato pa v datoteko FileName
var
FileHandle: Integer;
begin
if FileExists(FileName) then
begin
if MessageDlg('File '+ FileName+ ' Exist, REWRITE ?',
mtConfirmation, [mbYes, mbNo], 0) = mrNo then
exit;
end;
s := Edit1.Text;
FileHandle := FileCreate(FileName);
FileWrite(FileHandle, s[0], Length(s) + 1); //shranimo celoten string !!!
FileClose(FileHandle);
end;
procedure TForm1.Button7Click(Sender: TObject);
//Naloži variablo v 's' iz datoteke FileName in ga vrže v Edit1.text
var
Size,
FileHandle: Integer;
begin
FileHandle := FileOpen(FileName, fmOpenRead);
if FileHandle < 0 then
begin
//naredi nekaj ali nič ker je prišlo do napake
exit;
end else
begin
Size := GetFileSize(FileHandle, nil);
FileRead(FileHandle, s, Size); //preberemo celoten string
FileClose(FileHandle);
Edit1.Text := s;
end;
end; |
Za skakanje po 'File-ju' pa rabiš še FileSeek funkcijo...
Pri Array-ih je podobno. SizeOf(MojArray) vrne dolžino Array-a.
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14676 Aktiv.: 61.80 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Okt 30, 2007 8:39 pm Naslov sporočila: |
|
|
Citiram: |
Ojoj... pa saj vi živite še vedno v času DOSa??? |
He, he...
Recimo tale tvoja procedura mi osebno deluje čisto domače. FOpen,FWrite,Fseek,Fclose je za binarni dostop do datoteke poznal Clipper že pred 20-timi leti. Procedura v Dosovih časih bi bila napisana skoraj popolnoma enako. Proceduro "BlockWrite" katero je uporabil Aly pa ne poznam. Sem mislil, da je to novejše .... _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|