|
[ mr.zhile @ 22.09.2008. 10:21 ] @
| Opet ja sa mojim temama:Imam programcic koji je prosta verzija bibklioteke,i sad trabalo bi da se omoguci pokretanje vise instanci jednog programa istovremeno.Program u sebi sadrzi i logFile koji to malo-vise koci...
Kada se pokrene program ucita bazu za pristup i pita korisnika za ime,sifru..
Pokrenute 2 instance programa prave gresku jer nemogu istovremeno da vrse upis u logFile...
kod kojim se pravi logfile je
Code:
unit ULogIn;
interface
procedure UpisULog (LogText: string);
implementation
uses Forms, SysUtils, Classes, Global;
var LogFile : TextFile;
function IseciVrati(InStr: string): string;
var
i : integer;
begin
Result := '';
i := 1;
While i <= Length(InStr) do
begin
if InStr[i] >= ' ' then
Result := Result + InStr[i];
Inc(i)
end
end;
function PronadjiLogFile: string;
var
FName : string;
begin
FName := ExtractFilePath(Application.ExeName) + '..\log\' +
FormatDateTime ('yyyymmdd', Now) + '.log';
Result := FName;
end;
procedure UpisULog (LogText: string);
var
FName : string;
begin
if PLogOn then
begin
FName := PronadjiLogFile;
if FileExists(FName) then
Append (LogFile)
else
begin
try
CloseFile (LogFile);
except;
end;
FName := PronadjiLogFile;
AssignFile(LogFile, FName);
Rewrite(LogFile);
end;
WriteLn (LogFile, DateTimeToStr(Now) + ':' + PUsername + ':' + Isecivrati (LogText));
Flush (LogFile);
end;
end;
initialization
AssignFile(LogFile,PronadjiLogFile);
finalization
try
CloseFile(LogFile);
except
end;
end.
Gde gresim?Kako mogu gresku da ispravim?
unapred HVALA na pomoci i odvojenom dragocenom vremenu!! |
[ savkic @ 22.09.2008. 13:36 ] @
Nemoj držati otvoren log fajl tokom rada programa, otvoriš ga, dodaš poruku i zatvoriš.
[ mr.zhile @ 22.09.2008. 13:59 ] @
Jeste to ok,ail u logfile se upisuju aktivnosti korisnika!!
Npr.otvoranje tabelu,unes u tabelu...razumes vec!
Sto mi pravi problem,koji ne znam kako da resim?
[ mr.zhile @ 22.09.2008. 14:13 ] @
Razmisljajuci o svom problemu..dosao sam do ideje da se prilikom svakog startovanja programa,izmeni ime logfile..ali ne znam kako bi to mogao da izvedem?
[ savkic @ 22.09.2008. 14:24 ] @
> Jeste to ok,ail u logfile se upisuju aktivnosti korisnika!!
> Npr.otvoranje tabelu,unes u tabelu...razumes vec!
> Sto mi pravi problem,koji ne znam kako da resim?
Što je to problem, otvaranje, zatvaranje fajla je prilično brza operacija. Osim toga log fajl možeš otvoriti u shared write režimu (to sam zaboravio prošli put) tako da više programa može imati write pravo, jedino ne znam Assign, Append, Rewrite nude izbor režima otvaranja, ako ne onda možeš raditi direktno sa Windows handlovima, preko CreateFile ili TFileStream.
[ mr.zhile @ 22.09.2008. 21:31 ] @
@savkic
misliim sta reci coverkl mi ladno pomoze sa jednom;porukom...HVALA TI DRUZE PUNOOO!!!
Evo koda koji moze da radi sa vise otvaaranja
Code:
unit ULogIn;
interface
procedure UpisULog (LogText: string);
implementation
uses Forms, SysUtils, Classes, Global;
var LogFile : TextFile;
function IseciVrati(InStr: string): string;
var
i : integer;
begin
Result := '';
i := 1;
While i <= Length(InStr) do
begin
if InStr[i] >= ' ' then
Result := Result + InStr[i];
Inc(i)
end
end;
function PronadjiLogFile: string;
var
FName : string;
begin
FName := ExtractFilePath(Application.ExeName) + '..\log\' +
FormatDateTime ('yyyymmdd', Now)+ '.log';
Result := FName;
end;
procedure UpisULog (LogText: string);
var
FName : string;
begin
if PLogOn then
begin
FName := PronadjiLogFile;
if FileExists(FName) then
Append (LogFile)
else
begin
try
CloseFile (LogFile);
except;
end;
FName := PronadjiLogFile;
AssignFile(LogFile, FName);
Rewrite(LogFile);
end;
WriteLn (LogFile, DateTimeToStr(Now) + ':' + PUsername + ':' + Isecivrati (LogText));
Flush (LogFile);
[b]CloseFile(LogFile);[/b]//ovo je razlika od izvornog koji sam postavio u 1.poruci
end;
end;
initialization
AssignFile(LogFile,PronadjiLogFile);
finalization
try
CloseFile(LogFile);
except
end;
end.
HVALA PUNOOOOOOOOO!!!
ipak ko zna zna,al savkic bas zna 
[ mr.zhile @ 23.09.2008. 13:37 ] @
Kod koji sam u prethodnoj poruci posla je korektan..haval @igore!!
ALli sada mi se drugii problem javlja..zeleo bi posto bazu koristi vise korisnika da za svakog postoji po jedan dnevni logfile u kom bi bile upisane njegove aktivnosti...?
Npr sledeci kod ne obavlja svoj posao,u stvari obavlja prilikom 1. pokretanja,a ne znam kako bi mogao resiti problem da se uvek upis vrsi u logfile korisnik,a ne u opsti logfile koji postoji?
Code:
function PronadjiLogFile: string;
var
FName: string;
begin
if PUsername <> '' then
FName := ExtractFilePath(Application.ExeName) + '..\log\' +
FormatDateTime ('yyyymmdd', Now) + PUsername + '.log'
else
FName := ExtractFilePath(Application.ExeName) + '..\log\' +
FormatDateTime ('yyyymmdd', Now) + '.log';
Result := FName;
end;
Da napomenem PUsername je promenljiva tipa String i po difoltu joj je zadata vrednost '',
Hvala unapred na pomoci,svaki savet i konkretna pomoc su mi dobro dosli!!!
[ savkic @ 23.09.2008. 15:14 ] @
> Npr sledeci kod ne obavlja svoj posao,u stvari obavlja prilikom 1. pokretanja,a ne znam kako bi mogao resiti problem da se uvek upis
> vrsi u logfile korisnik,a ne u opsti logfile koji postoji?
Želiš dva log fajla (opšti i za korisnika) ili samo jedan?
> function PronadjiLogFile: string;
> var
> FName: string;
Po konvenciji prefiks F se daje za privatna polja (promenljive) klase, običnim promenljivama ne.
> if PUsername <> '' then
> FName := ExtractFilePath(Application.ExeName) + '..\log\' +
> FormatDateTime ('yyyymmdd', Now) + PUsername + '.log'
> Result := FName;
Ne treba ti pomoćna promenljiva, možeš direktno koristiti Result.
Ovako je čitljivije:
Result := Format('%slog\%s%s.log', [ExtractFilePath(Application.ExeName), FormatDateTime ('yyyymmdd', Now), FUserName]);
Ako ti često treba dir gde je exe onda je dobro da u jednom sharedunitu deklarišeš npr:
AppExeDir: string; // Dir u kome se nalazi .exe
initialization
AppExeDir := ExtractFilePath(ParamStr(0));
I da onda dalje koristiš tu promenljivu svuda.
> Da napomenem PUsername je promenljiva tipa String i po difoltu joj je zadata vrednost '',
Prefiksom P se uglavnom označava pointer na neki tip, ako ti je ovo običan string onda je P višak, a ako je deklarisan u private delu klase onda treba da bude FUserName. Ako je vrednost te promenljiva '' onda će naziv log fajla biti onaj generički, ako želiš poseban za korisnika onda moraš navesti ime tog korisnika i dalje koristiti taj naziv fajla.
[ mr.zhile @ 23.09.2008. 16:36 ] @
Hvala na savetima,korisni su..
Pomocnu promenljivu koristim da bi lakse mogao da pratim tok programa.
Zelim jedan fajl,koji ce se razlikovati po korisnicima?
[ Miloš Baić @ 23.09.2008. 19:54 ] @
Citat: mr.zhile:
Ali sada mi se drugi problem javlja..zeleo bi posto bazu koristi vise korisnika da za svakog postoji po jedan dnevni logfile u kom bi bile upisane njegove aktivnosti...?
Preleto sam preko diskusije, samo komentar odokativno, ne znam zbog čega pratiš korisnike, ali možda bi upis aktivnosti korisnika u bazu bio adekvatniji. Naravno, implementirati taj modul u program je malo složenije od upisa u txt fajl, ali izveštaji na osnovu njega mogu biti raznoliki za svakog korisnika ponaosob, ili po nekom drugom kriterijumu.
[ Deep|Blue @ 24.09.2008. 13:04 ] @
Mnogo komplikujes sa tim log fajlovima, uostalom sasvim ovim dodacima ostaje ti problem, ako slucajno 2 i vise mashina krenu da upisuju log.
Kao sto rece @milos, mnogo bolje resenje jeste baza, gde mozes da upisujes sirok dijapazon akcija, a istovremeno imas centralizovan log sa akcijama.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|