2013.04.28. PASzSz
Hetedik témakör kiegészítés: Text-, INI-, bináris file-ok, Nyomtatás Lazarusban Készítette: Dr. Kotsis Domokos Vámossy Zoltán Maschek Ádám Monostori Ádám 2013.04.28. 2
Fájlkezelés Lazarusban Text fájlok INI fájlok Bináris fájlok
Text fájlok Sorokból állnak Sor=nyomtatható karakterek+sorvége jel Sorvége jel DOS/Win alatt 2 byte: #13#10 Ember számára olvasható
Text fájlok használata ->TP Fájlváltozó létrehozása Megnyitás (írásra/olvasásra) Írás/olvasás Lezárás
Példa Az alkalmazás bezárásakor mentsük el a főformunk pozícióját és méretét egy textfájlba. Megnyitáskor használjuk ezt a fájlt, hogy a formot kirakjuk. A property-k kiírási sorrendje legyen: Left, Top, Width, Height (mindegyik új sorban).
Példa - kiírás Fájlváltozó létrehozása: Var F: Text; vagy F: TextFile; Hozzárendelés fájlhoz: Assignfile(F, formadatok.txt ); Megnyitás írásra: Rewrite(F);
Adatok kiírása: Writeln(F, Left); Writeln(F, Top); Fájl bezárása: CloseFile(F); Példa - kiírás Mindez a form OnClose eseményére történjen.
Példa - beolvasás Fájlváltozó létrehozása: Var F: Text; vagy F: TextFile; Hozzárendelés fájlhoz: Assignfile(F, formadatok.txt ); Megnyitás olvasásra: Reset(F); Ha nem létezik a fájl, kivétel keletkezik!
Példa - beolvasás ROSSZ! Adatok beolvasása: Readln(F,Form1.Left,Form1.Top, ); Readln(F,l); Left:=StrToInt(l); Fájl bezárása: CloseFile(F); Mindez a form OnCreate eseményére történjen.
INI fájlok Kétszintű, hierarchikus felépítés: [section] key=value Tárolható string, integer, boolean, stb., de mindegyik stringként. Alapértelmezésben a %Windows% könyvtárban jön létre.
INI fájlok használata Uses részbe IniFiles!!! Inifájl változó létrehozása Inifájl helyfoglalása TIniFile.Create( fn ) osztálymetódussal + fájlnév hozzárendelése egy lépésben Írás/olvasás Felszabadítás
Példa Az alkalmazás bezárásakor mentsük el a főformunk pozícióját és méretét egy INIfájlba. Megnyitáskor használjuk ezt a fájlt, hogy a formot kirakjuk. A property-k kiírási sorrendje mindegy!!!
Példa - kiírás var inifile:tinifile; Aktuális könyvtár! begin inifile:=tinifile.create('.\formsettings.ini'); try inifile.writeinteger('form1','left', Section,key,value Left); inifile.writeinteger('form1','top', Top); inifile.writeinteger('form1','width', Width); inifile.writeinteger('form1','height', Height); finally inifile.free; end; Ne feledjük: Uses,IniFiles,
Példa - beolvasás var inifile:tinifile; begin inifile:=tinifile.create('.\formsettings.ini'); try Left:=inifile.ReadInteger('form1','left',100); Top:=inifile.ReadInteger('form1','top',100); Width:=inifile.ReadInteger('form1','width',100); Height:=inifile.ReadInteger('form1','height',100); finally inifile.free; end; Default érték!
INIfájlok előnyei A kulcs érték párok sorrendje nem számít Hibatűrő (default értékek)
Bináris (raw, untyped) fájlok Karakterek (bájtok) véges hosszú sorozataként tekinthetőek Ált. ember számára olvashatatlanok
Bináris fájlok használata FileStreamek segítségével
FileStreamek használata Változó létrehozása Helyfoglalás (Create) Írási, olvasási műveletek Felszabadítás
Változók létrehozása var sf,df:tfilestream; cpd:longint; buf:array[1..1024]of byte;
Helyfoglalás (Create) sf:=tfilestream.create(filenév,mód);... df:=tfilestream.create(filenév, mód);
Open/SaveDialog Filename a file nevét adja Filter a megjelenítendő fájlokat szűrhetjük Options - Title a dialógusablak felirata Execute megjeleníti a dialógusablakot
Legegyszerűbb dialógusok if OpenDialog1.Execute then begin megy := true; Edit3.Text := OpenDialog1.FileName; end; if SaveDialog1.Execute then begin megy := true; Edit4.Text:=SaveDialog1.FileName; end;
Megnyitási módok fmcreate új file létrehozása, ha kell fmopenread megnyit egy file-ot read-only-ra fmopenwrite megnyit egy file-ot write-only-ra fmopenreadwrite megnyit egy file-ot read-write-ra
Írási, olvasási műveletek cpd:=sf.read(buf,sizeof(buf)); df.write(buf,cpd);
Felszabadítás FreeAndNil(df); FreeAndNil(sf);
Példa Készítsünk fájlmásoló programot! Használjunk Open/SaveDialog komponenseket és FileStreamet!
ProgressBar (a Common Contros fülön) Max a maximalis kitérés Min a kezdőpozíció Step Egy lépés nagysága Position aktuális kitérés Smooth folyamatos progress StepIt egy step-nyivel növeli a progressbar pozícióját StepBy(count) count-nyival növeli
Forrás, cél meghatározása procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin Edit1.Text := OpenDialog1.FileName; end; end; procedure TForm1.Button2Click(Sender: TObject); begin if SaveDialog1.Execute then begin Edit2.Text := SaveDialog1.FileName; end; end;
Forrás, cél beállítása procedure TForm2.Button1Click(Sender: TObject); var sf,df:tfilestream; cpd:longint; buf:array[1..1024]of byte; begin Edit1.Hide; Edit2.Hide; Button2.Enabled:=false; sf:=tfilestream.create(edit1.text,fmopenread or fmsharedenywrite); try Progressbar1.Max:=sf.size; df:=tfilestream.create(edit2.text,fmcreate or fmsharedenyread);
Másolás, felszabadítás try repeat cpd:=sf.read(buf,sizeof(buf)); df.write(buf,cpd); ProgressBar1.Stepby(cpd); Application.ProcessMessages; until cpd<sizeof(buf); finally FreeAndNil(df); end; finally FreeAndNil(sf); Button2.Enabled := true; end; end;
Tudnivaló Ugyanez rövidebben, gyorsabban: df.copyfrom(sf,0); Átmásolja a teljes fájlt egy lépésben!!! Viszont így nem tudjuk a folyamatot nyomon követni.
Nyomtatás
Szükséges deklarációk uses Classes, FileUtil, Dialogs, PrintersDlgs, Printers, Var hprinter:tprinter;
A PrintDialog használata hprinter:=printer; printdialog1.options:=[popagenums,podisableprinttofile]; tovabb:=printdialog1.execute; //igaz, ha választottunk printert np:=printdialog1.frompage; xp:=printdialog1.topage; e:=not (printdialog1.printrange=prpagenums); if tovabb then begin printer.orientation:=poportrait; //vagy polandscape
Nyomtatás hprinter.begindoc; hprinter.canvas.font.style:=[]; hprinter.canvas.font.size:=11; hprinter.canvas.font.style:=[fsbold]; hprinter.canvas.textout(x,y,text); hprinter.enddoc; A koordináták