Câte ceva despre lucrul cu fisiere în DELPHI
Lucrul cu fisiere, directoare si drive-uri de periferice reprezinta exemple de probleme de programare invitabile. La fel ca Pascal, Object Pascal ofera suport pentru lucrul cu 3 tipuri de fisiere: fisiere text, fisiere cu tip si fisiere fara tip(sau binare). De semnalat faptul ca fisierele text contin text ASCII.
Declararea unui fisier text:
var VfText:TextFile;
Asignarea unei variabile la un fisier text:
AssignFile(VFText,'Fisier.txt');
Deschiderea unui fisier text:
Rewrite(VFText): Daca fisierul exista, va fi suprascris, daca nu exista, este creat;
Reset(VFText): Un fisier existent este deschis pentru operatii de citire.
Append(VFText): Un fisier existent este deschis pentru operatii de
adaugare.
Manipulare fisier text utilizând procedurile predefinite:writeln si readln.
Închiderea fisierului:
CloseFile(VFText).
Declararea tipului record:
.
.
type
.
.
TPersonRecord=packed record
Nume:string[20];
Initiala:string[3];
Prenume:string[20];
DataNasterii:TdateTime;
end;
.
.
Declararea tipului fisier:
Tfile=file of TpersonRecord;
Declararea variabilei fisier:
var
VFPers:TFile;
Utilizarea variabilei fisier ca în exemplele:
var
IPersRec:TPersonRecord;
VFTip:Tfile;
begin
AssignFile(VFTip,'Persoana.dat');
Reset(VFTip);
try
if not(Eof(VFTip))
then
read(VFTip, IPersRec);
finally
CloseFile(VFTip);
end;
end;
sau
var
IPersRec:TPersonRecord;
VFTip:Tfile;
begin
AssignFile(VFTip,'Persoana.dat');
Reset(VFTip);
Seek(VFTip, FileSize(VFTip));
try
write(VFTip, IPersRec);
finally
CloseFile(VFTip);
end;
end;
TFileStream este o clasa care poate fi folosita pentru a gestiona articole care nu sunt obiecte. Este o clasa ale carei metode pot fi folosite pentru a lucra ca înregistrari având orice structura.
Protocolul de utilizare a clasei TFileStream presupune:
Încapsularea tipului de înregistrare cu care se lucreaza si a descendentului clasei TFileStream într-un unit.
Utilizarea unit-ului definit la 1 pentru a rezolva problema asociata tipului de înregistrare.
Utilizând TFileStream se poate realiza foarte usor un browser
specializat pe un anumit tip de înregistrare.
De fapt TFileStream abstractizeaza notiunea de fisier cu tip în ideea de a simplifica efortul de programare depus pentru gestionarea datelor pastrate într-un fisier cu o structura oarecare.
O instanta a clasei TFileStream este creata cu ajutorul constructorului Create, care are sintaxa:
constructor Create(const Filename:string; Mode:Word);
Asadar, la crearea unei instante de tip TFile Stream trebuie sa specificam numele fisierului asociat si modul de operare asupra acestuia. Consultati help-ul Delphi pentru a vedea valorile posibile pentru parametrul Mode si semnificatia acestora. Tot cu ajutorul help-ului se poate învata sintaxa metodelor cu ajutorul carora se fac citiri, scrieri pozitionari în fisiere asociate cu o instanta TFile Stream. Protocolul de lucru cu instante TFileStream poate fi urmarit si în exemplul de mai jos.
unit persrec;
interface
uses Classes, dialogs, sysutils;
type
// Defineste inregistare care pastreaza date despre o
persoana.
TPersonRec = packed record
FirstName: String[20];
LastName: String[20];
MI: String[1];
BirthDay: TDateTime;
Age: Integer;
end;
// Creare descendent TFileStream capabil sa lucreze cu
instante TPersonRec
TRecordStream = class(TFileStream)
private
function GetNumRecs: Longint;
function GetCurRec: Longint;
procedure SetCurRec(RecNo: Longint);
protected
function GetRecSize: Longint; virtual;
public
function SeekRec(RecNo: Longint; Origin: Word): Longint;
function WriteRec(const Rec): Longint;
function AppendRec(const Rec): Longint;
function ReadRec(var Rec): Longint;
procedure First;
procedure Last;
procedure NextRec;
procedure PreviousRec;
// NumRecs arata numarul de inregistrari in stream
property NumRecs: Longint read GetNumRecs;
// CurRec arata inregistrarea curenta in stream
property CurRec: Longint read GetCurRec write SetCurRec;
end;
implementation
function TRecordStream.GetRecSize:Longint;
begin
Result := SizeOf(TPersonRec);
end;
function TRecordStream.GetNumRecs: Longint;
begin
// Returneaza numarul de inregistrari din stream
Result := Size div GetRecSize;
end;
function TRecordStream.GetCurRec: Longint;
begin
Result := (Position div GetRecSize) + 1;
end;
procedure TRecordStream.SetCurRec(RecNo: Longint);
begin
if RecNo > 0 then
Position := (RecNo - 1) * GetRecSize
else
Raise Exception.Create('Cannot go beyond beginning of file.');
end;
function TRecordStream.SeekRec(RecNo: Longint; Origin: Word):
Longint;
begin
Result := Seek(RecNo * GetRecSize, Origin);
end;
function TRecordStream.WriteRec(Const Rec): Longint;
begin
// Scrierea unei inregistrari in stream
Result := Write(Rec, GetRecSize);
end;
function TRecordStream.AppendRec(Const Rec): Longint;
begin
// Adaugarea unei inregistrari in stream
Seek(0, 2);
Result := Write(Rec, GetRecSize);
end;
function TRecordStream.ReadRec(var Rec): Longint;
begin
Result := Read(Rec, GetRecSize);
Seek(-GetRecSize, 1);
end;
procedure TRecordStream.First;
begin
//Pozitionarea la inceput in stream
Seek(0, 0);
end;
procedure TRecordStream.Last;
begin
// Pozitionarea pe ultima inregistrare din stream
Seek(0, 2);
Seek(-GetRecSize, 1);
end;
procedure TRecordStream.NextRec;
begin
if ((Position + GetRecSize) div GetRecSize) = GetNumRecs then
raise Exception.Create('Cannot read beyond end of file')
else
Seek(GetRecSize, 1);
end;
procedure TRecordStream.PreviousRec;
begin
if (Position - GetRecSize >= 0) then
Seek(-GetRecSize, 1)
else
Raise Exception.Create('Cannot read beyond beginning of
the file.');
end;
end.
Declararea unei variabile fisier fara tip:
.
.
var VFFaraTip:File;
Deschiderea unui fisier asociat cu o variabila fisier fara tip:
.
.
Reset(VFFaraTip,[<RecSize>]);
.
.
sau
Rewrite(VFFaraTip[,<RecSize.]);
.
.
Pentru citirea datelor din fisiere fara tip avem procedura:
procedure BlockRead(var F:File; var Buf;
const: Integer[; var Result:Integer]);
.
procedure BlockWrite(var F:File; var Buf;
const:Integer[; var Result:Integer]);
.
.
Dimensiunea implicita a blocului elementar de transfer: 128.
Consultati help-ul sau [6] pentru a vedea cum se lucreaza profesional cu fisierele, structurile de tip directoare si drive-urile în Object Pascal. Consultati, de asemenea, sectiunea 4 a acestui suport de curs pentru a afla mai multe despre capabilitatile Delphi relativ la lucru cu fisiere si directoare.
Alte precizari relativ la posibilitatile mediului Delphi
Evident, puterea mediului Delphi nu se reduce la topicile prezentate în acest suport de curs. Elementele prezentate fac parte din categoria cunostintelor de baza. Elementele de programare avansata în Delphi întregesc universul preocuparilor unui programator în Delphi. Topici care intra sub incidenta sintagmei "programare avansata" în Delphi sunt:
-Utilizarea multitasking-ului în aplicatiile Delphi (procese, fire de executie, sincronizare);
-Utilizarea memoriei în aplicatiile Windows create sub Delphi;
-Aplicatii grafice;
-Lucrul cu imprimanta;
-Obiecte programabile sub Delphi;
-Aplicatii INTERNET;
-Aplicatii multimedia, etc.
Majoritatea acestor topici presupun un studiu temeinic si din perspectiva numeroaselor tehnologii Windows care le fundamenteaza; partial acest studiu este realizat la optionalul de Programare Windows.
Dincolo de acest "partial" stau nenumaratele carti din librarii si biblioteci si marele sfetnic din totdeauna al omului: NECESITATEA.
Când va fi cazul, important este sa stim de unde sa începem demersul de solutionare a unei probleme, care necesita mai mult decât stim la un moment dat despre un anume univers.
|