29
Мирослав Илић
Пример једноставне базе података - Адресар
На наредним страницама биће приказан један од начина креирања и обраде једноставне базе
података која се састоји из само једне датотеке. Биће описани сви послови везани за базу на
најједноставнији, али не и на најоптималнији начин. Биће описан рад са услужним програмима за
креирање базе података (Database Desktop) и формирање извештаја (Rave Project). Све команде и
сви објекти који буду коришћени у програму, биће детаљно објашњени.
• Анализа
Структура датотеке Adresar.dbf (број поља зависи од потреба корисника, овде је одабрана
оваква структура, али она може бити и другачија):
назив поља
тип
ширина
prezime
C
20
ime
C
15
ulica
C
40
broj
C
10
mesto
C
20
pbroj
C
5
drzava
C
20
fiksni
C
12
mobilni
C
12
hznak
C
10
email
C
40
datumr
D
-
aktivan
L
-
Послови које треба обрадити у програму:
•
•
•
•
•
•
•
•
•
•
•
•
Упис података
Исправка података
Брисање изабраног података
Брисање свих података
Претраживање
Штампање свих података
Штампање изабраних података
Штампање налепница за коверте
Архивирање података
Рестаурација података
Упутство за употребу
Контакт са аутором
Неки од послова могу се груписати и обрадити у оквиру једне целине. Програм ће, зато,
имати две варијанте, тј. послови који се могу објединити биће обрађени у оквиру једне целине, али
ће и сваки од послова бити обрађен и независно од других. Претраживање ће бити обрађено и само
по једном критеријуму и по неколико критеријума истовремено како би се приказале све
могућности филтрирања базе података. Штампање ће бити обрађено и као директно из делфија и
кроз помоћни програм за креирање извештаја како би се уочиле предности и мане сваког начина.
Евентуалне недоследности, неће бити плод непажње већ намера аутора да читаоца упозна са
различитим могућностима како би могао изабрати свој пут код каснијег самосталног рада.
Програмирање - први кораци
29
30
Програмирање - први кораци
• Креирање иницијалне датотеке
Отворићемо нову апликацију у делфију.
Сачуваћемо пројекат у новом фолдеру са именом
Адресар. Затворићемо делфи. Пронаћи ћемо
креирани фолдер Адресар и из њега отворити
делфи апликацију коју смо претходно сачували.
Покренућемо услужни програм Database Desktop
из менија Tools (десета опција менија). Отвориће
се прозор као на слици. Из менија File изабраћемо
опцију New -> Table да бисмо креирали датотеку у
којој ће се чувати уписани подаци. Отвориће се
дијалошки прозор у којем треба да изаберемо
формат датотеке коју креирамо. Програм подржава
следеће формате:
Paradox 7, Paradox 5.0 for Windows
Paradox 4, Paradox 3.5
DB2
Visual dBase
dBase for Windows
dBase IV, dBase III+
FoxPro
Informix, IntrBase
MSAccess, MSSQL
Oracle, SyBase
Изабраћемо Visual dBase из овог прозора. У
новоотвореном дијалошком прозору ћемо дефинисати поља слога датотеке. Кликом на дугме Define
у новоотвореном дијалошком прозору ћемо дефинисати индексне датотеке. Прости индекси ће бити
DatumR и HZnak. Креирају се двокликом на име
поља и затим на дугме ОК, па још једном на ОК.
Сложени индекс креирамо кликом на дугме
Expression Index и уносом одговарајућег израза у
истоименом оквиру (зависно од подешавања
оперативног система могу се куцати + или ; између
поља у изразу), а затим кликом на ОК даћемо име
индексној датотеци Adresa и кликнемо на ОК.
Сада ћемо сачувати датотеку кликом на дугме Save
As. У новоотвореном прозору у оквир File name:
уписаћемо име датотеке Adresar.dbf, чекираћемо
Display table да би се након снимања отворила
датотека за унос иницијалних ведности и кликнути
на дугме Save. Сада ћемо унети неколико података
да бисмо имали тест примере за тестирање
написаних процедура. Да бисмо могли да унесемо
податке потребно је притиснути тастер Ф9 или
кликнути на екрански тастер Edit data. Након
уноса података затворићемо апликацију и
наставити рад у делфију.
30
Мирослав Илић
31
Мирослав Илић
• Насловна страна програма
Насловна страна програма је оно што ће корисник прво угледати када покрене наш програм
зато она мора да буде онолико лепа колико ми то можемо да направимо.
За форму ћемо дефинисати следеће карактеристике (абецедним редом):
BorderIcons - [] (све иконе смо поставили на false, корисник неће моћи да минимизира, максимизира и
затвара форму помоћу екранских тастера), BorderStyle - bsSingle (корисник неће моћи да мења
величину дефинисане форме), Caption - Адресар, ClientHeight - 800, ClientWidth - 1100,
(димензије апликације су одређене резолуцијом на рачунару корисника, а овако су подешене јер се
претпоставља да сви корисници имају стандардну резолуцију новијих рачунара 1280х1024) FormStyle fsStayOnTop (прозор апликације ће увек бити на врху свих отворених прозора), Position poDesktopCenter (прозор апликације ће увек бити центриран на десктопу).
Поставићемо слику преко целе радне површине (листић Additional, шеста компонента Image).
Подесићемо карактеристике:
Align - alClient, Stretch - True, Picture - (двоклик, Load, Изабрана слика)
Дефинисаћемо главни мени (листић Standard, друга компонента MainMenu) двокликом на
поље карактеристике Items.
ПОДАЦИ
СЕРВИС
ПОМОЋ
КРАЈ РАДА
Унос података
Архивирање Упутство
Преглед података
Рестаурација О програму
Претраживање
О аутору
Штампање података
Брисање података Изабрани податак
Сви подаци
Програмирање - први кораци
31
32
Програмирање - први кораци
На сваку ставку менија додаћемо сличицу која ће симболизовати посао који ће се обавити
избором те опције. Сличице се додају кликом на карактеристику Bitmap сваке ставке менија.
Будући да смо користили ћириличне називе ставки, било би добро да дефинишемо њихова имена
по својој жељи. Тако ћемо за ставке основног менија као имена користити N1, N2, N3 и N4, за ставке
другог нивоа на име ставке основног менија додаћемо редни број ставке подменија, па ћемо имати:
N11, N12, N13, N14 и N15 (за подмени ПОДАЦИ), N21 и N22 (за подмени СЕРВИС), N31, N32 N33 (за
подмени ПОМОЋ), N151 и N152 (за подмени Брисање података). Подменији се додају десним
кликом на ставку којој се додају и избором опције Create Submenu.
Сада ћемо додати статусну линију (на листићу Win32, петнаеста компонента StatusBar) која
ће приказивати податак о томе која је процедура активна, опште податке о апликацији и датум и
време. Подесићемо је двокликом на карактеристику Panels. Отвара се дијалошки прозор:
Кликом на први тастер додајемо панеле. Кликом на панел у овом прозору селектујемо га и
подешавамо његове карактеристике:
Alignment - taCenter, (за први) Text - Насловна страница програма, Width - 280,
(за други) Text - Програмски пакет "АДРЕСАР", 2012, Девета гимназија "Михаило
Петровић Алас", Нови Београд, Width - 580, (за трећи) Width - 240.
Да би се исписивао датум и време у трећем панелу, прво ћемо на форму поставити тајмер (на
листићу System, прва компонента Timer), а затим написати следећу процедуру, двокликом на
постављену компоненту:
procedure TForm1.Timer1Timer(Sender: TObject);
var d,t:string;
begin d:=FormatDateTime('DDDD, DD. MMMM YYYY.',date);
t:=FormatDateTime('hh:mm:ss',time);
StatusBar1.Panels[2].Text:=d+' '+t;
end;
Формат коришћен за датум дефинише да ће се исписивати назив дана и датум по нашем
стандарду са по две цифре за дан и месец, четири цифре за годину и тачком на крају године. Формат
коришћен за време дефинише да ће се исписивати час, минут и секунд са по две цифре. На панелу
ће се исписивати прво датум, па време са једним размаком. Тајмер је предефинисан на једну секунду
(карактеристика Interval - 1000), па ће исписивање садржаја на панелу каснити једну секунду код
стартовања апликације. Ако нам то смета можемо смањити интервал или иницијализовати испис
садржаја на панел приликом креирања форме на старту апликације.
• Опште процедуре
Сада можемо дефинисати неколико општих процедура које немају везе са базом података,
али су неопходне да би апликација "нормално" функционисала.
// Затварање апликације - кликом на ставку КРАЈ РАДА
procedure TForm1.N4Click(Sender: TObject);
begin Application.Terminate;
end;
// Контакт са аутором програма - клик на ставку О аутору у оквиру менија ПОМОЋ
procedure TForm1.N33Click(Sender: TObject);
begin MessageBox(0,'ПРОГРАМСКИ ПАКЕТ АДРЕСАР'+#13+#13+
'Београд, 21.10.2012. године'+#13+
'® Мирослав Илић
© 2012.'+#13+#13+
'Контакт са аутором:'+#13+#13+
[email protected]'+#13+
[email protected]'+#13+
[email protected]'+#13+
[email protected]'+#13+#13+
32
Мирослав Илић
33
Мирослав Илић
'
тел. 011/301-83-83'+#13+#13,
'Аутор програма',MB_TASKMODAL+MB_ICONWARNING);
end;
// Обавештење о програму - клик на ставку О програму у оквиру менија ПОМОЋ
procedure TForm1.N32Click(Sender: TObject);
begin MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Програмски пакет за унос, ажурирање и брисање адреса'+#13+
'са могућношћу аутоматског слања честитки и штампањем'+#13+
'листе адреса, комплетних уписаних података о особи и'+#13+
'налепница за коверте за писма'+#13+#13+
'Version 1.0'+#13+
'Београд, 21.10.2012. године'+#13+#13,
'О програму',MB_TASKMODAL+MB_ICONASTERISK);
end;
// Упутство за употребу програма - клик на ставку Упутство у оквиру менија ПОМОЋ
procedure TForm1.N32Click(Sender: TObject);
begin Panel1.Visible:=true;
Panel1.BringToFront;
bb1:=N1.Enabled;
N1.Enabled:=false;
N2.Enabled:=false;
N3.Enabled:=false;
end;
Прва наредба приказује панел са упутством. Да би упутство било доступно из сваког дела
програма потребно је да панел преко свих панела које будемо додавали у програм. То је решено
програмски, другом наредбом која поставља панел са упутством на врх свих панела на форми.
Трећа наредба памти статус ставке Н1 главног менија. Следеће три наредбе забрањују коришћење
прве три ставке главног менија (ПОДАЦИ, СЕРВИС, ПОМОЋ). Да би упутство радило на форму
ћемо поставити панел (листић Standard, петнаеста компонента Panel) и подесити следеће
карактеристике:
Align - alClient, BevelInner - bvLowered, BevelOuter - bvLowered, BevelWidth - 4,
BorderStyle - bsSingle, BorderWidth - 2, Color - clMoneyGreen, Visible - false.
На панел ћемо ставити:
лабелу (листић Standard, четврта компонента Label) са карактеристикама:
Align - alTop, Alignment - taCenter, AutoSize - false, Caption - Упутство за
употребу програма, Font - Palatino Linotype/Bold Italic/22, Layout - tlCenter.
мемо поље (листић Standard, шеста компонента Memo) са карактеристикама:
Align - alBottomp, Alignment - taCenter, BorderStyle - bsNone, Font - Palatino
Linotype/Regular/11, Lines - (копмплетан текст упутства).
битбатон (листић Additional, прва компонента BitBtn) са карактеристикама:
Caption - (празно), Glyph - (двоклик, Load, Изабрана сличица), Height - 50, Left 1030, Top - 20, Width - 50.
Излазак из упутства омогућава процедура коју ћемо написати на двоклик на битбатон:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin Panel1.Visible:=false;
N1.Enabled:=bb1;
N2.Enabled:=bb1;
N3.Enabled:=true;
end;
Прва наредба затвара панел са упутством. Следеће три наредбе дозвољавају коришћење прве
три ставке главног менија (ПОДАЦИ, СЕРВИС, ПОМОЋ). Променљива bb1 је глобална логичка
променљива коју користимо да бисмо статус прве две ставке главног менија оставили каквим је био
пре отварања упутства.
Сада можемо да пређемо на програмирање процедура везаних за рад са базом података.
Најпре ћемо на форму додати две компоненте које омогућавају приступ подацима у
датотеци, са листића BDE прву компоненту Table и са листића Data Access прву компоненту
DataSource. Компонента Table повезује програм у делфију са физичком датотеком на диску.
Компонента DataSource омогућава приступ из програма подацима у датотеци.
Програмирање - први кораци
33
34
Програмирање - први кораци
За прву компоненту подесићемо:
TableName на Adresar.dbf, чиме смо изабрали датотеку коју ћемо повезати са програмом,
IndexName на Adresa, чиме смо дефинисали која ће се индексна датотека користити и
Active на true, чиме смо дозволили коришћење датотеке у програму.
За другу компоненту подесићемо само DataSet на Table1, чиме смо омогућили приступ
подацима у датотеци.
• Унос података
На форму ћемо поставити панел (листић Standard, петнаеста компонента Panel) водећи
рачуна да он не буде на панелу за упутство (додајемо панел преко неке од компоненти на форми,
рецимо, на тајмер) и подесити следеће карактеристике:
Align - alClient, BevelInner - bvLowered, BevelOuter - bvLowered, BevelWidth - 4,
BorderStyle - bsSingle, BorderWidth - 2, Color - clMoneyGreen, Visible - false.
На панел ћемо ставити следеће компоненте:
лабелу за наслов (листић Standard, четврта компонента Label) са карактеристикама:
Align - alTop, Alignment - taCenter, AutoSize - false, Caption - Унос нових
података, Font - Palatino Linotype/Bold Italic/22, Layout - tlCenter.
битбатон за повратак на насловну страну(листић Additional, прва компонента BitBtn)
са карактеристикама:
Caption - (празно), Glyph - (двоклик, Load, Изабрана сличица), Height - 50, Left 1030, Top - 20, Width - 50.
бевел - оквир (листић Additional, осма компонента Bevel) са карактеристикама:
Height - 590, Left - 15, Top - 100, Width - 585
тринаест лабела (листић Standard, четврта компонента Label) са карактеристикама:
AutoSize - false, Caption - Презиме/Име/Улица/Број/Место/Поштански број/Држава/
Број телефона/Мобилни/Хороскопски знак/Интернет адреса/Датум рођења/Активан,
34
Мирослав Илић
Мирослав Илић
35
Font - Palatino Linotype/Italic/14, Height - 30, Left - 25, Layout - tlCenter, Top
- 110/155/200/245/290/335/380/425/470/515/560/605/640, Width - 165.
једанаест едита за упис података (листић Standard, пета компонента Edit) са
карактеристикама:
Font - Arial/Bold/14, Left - 190, ReadOnly - true, Text - (празно), Top - 110/155/
200/245/290/335/380/425/470/515/560, Width - 400.
датумску компоненту помоћу које ћемо једноставније уносити датуме (листић Win32,
десета компонента DateTimePicker) са карактеристикама: Font - Arial/Bold/14,
Format - dd.MM.yyyy, Height - 30, Left - 190, Top - 605, Width - 130.
чекбокс за унос индикатора активности унетог податка (листић Standard, осма
компонента CheckBox) са карактеристикама:
Caption - (празно), Font - Arial/Bold/14, Height - 30, Left - 190, Top - 650,
Width - 20.
четири битбатона (листић Additional, прва компонента BitBtn) са карактеристикама:
Caption - Додај/Запамти/Поништи/Обриши, Font - Arial/Bold/14, Glyph - (двоклик,
Load, Изабрана сличица), Height - 40, Left - 20/165/310/455, Top - 715, Width - 135.
грид (листић DataControls, прва компонента dBGrid) са карактеристикама:
Align - alRight, DataSource - DataSource1, Font - Palatino
Linotype/Regular/11, TitleFont - Palatino Linotype/Bold
Italic/11, Width - 480.
Двокликом на грид отварамо едитор колона где кликом на тастер са
три срца додајемо сва поља из слога датотеке, а затим обришемо сва сем
поља: prezime, ime и datumr. За ова поља подесићемо карактеристике:
Alignment - taLeftJustify/taLeftJustify/taCenter, (Title)
Caption - Презиме/Име/Рођендан, (Title) Alignment - taCenter,
Width - 200/150/94.
Завршили смо са дизајнирањем уноса података и сада ћемо написати пратеће процедуре.
// Отварање панела за унос података
procedure TForm1.N11Click(Sender: TObject);
var i:integer;
begin Panel2.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
pan:=1;
// редни број првог едита на овом панелу
For i:=0 to 11 do
TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
Ispisi;
StatusBar1.Panels[0].Text:='УНОС ПОДАТАКА';
end;
Процедура Ispisi у одговарајуће компоненте (у едите, датумску компоненту и чекбокс)
уписује текући податак из датотеке. Пошто није реакција на неки догађај морамо је сами
декларисати у делу private:
private
procedure Ispisi;
public
{ Public declarations }
а затим ћемо је дефинисати на следећи начин:
procedure TForm1.Ispisi;
var i:integer;
begin For i:=1 to 11 do
TEdit(FindComponent('Edit'+IntToStr(i))).Text:=
Table1.Fields[i-1].AsString;
DateTimePicker1.Date:=Table1.FieldByName('datumr').AsDateTime;
CheckBox1.Checked:=Table1.FieldByName('aktivan').AsBoolean;
end;
Функција FindComponent налази компоненту класе TEdit са именом у аргументу. Користимо
је да не бисмо морали да напишемо једанаест наредби којима се едитима додељује садржај одговарајућих поља из слога датотеке. Функција Fields[i-1] одређује редни број поља из слога датотеке коме
се обраћамо (водимо рачуна о томе да редни бројеви поља почињу од 0). Пољу слога можемо се
обратити и навођењем његовог имена функцијом FieldByName чији аргумент је име поља.
Програмирање - први кораци
35
36
Програмирање - први кораци
Следећа процедура затвара панел за унос података, а користићемо је и за затварање свих
других панела, зато ћемо је одмах допунити свим панелима које ћемо касније додавати. Да не бисмо
имали проблема са тестирањем програма у овом тренутку ти панели који не постоје биће стављени
у коментар, а како који додамо на форму тако ћемо и брисати одговарајуће ознаке коментара.
Кликнућемо на битбатон за повратак и декларисати и дефинисати процедуру за догађај OnClick (у
Object Inspector-у на листићу Events пронађемо овај догађај и двокликом декларишемо процедуру
и одмах јој променимо име у Povratak):
// Затварање панела за унос података
procedure TForm1.Povratak(Sender: TObject);
begin Panel2.Visible:=false;
// Panel3.Visible:=false;
// Panel4.Visible:=false;
// Panel5.Visible:=false;
// Panel6.Visible:=false;
// Arhiv.Visible:=false;
N1.Enabled:=true;
N2.Enabled:=true;
Table1.Filtered:=false;
StatusBar1.Panels[0].Text:='Насловна страница програма';
end;
Селектоваћемо све едите и декларисати и дефинисати процедуру за догађај OnClick (у Object
Inspector-у на листићу Events пронађемо овај догађај и двокликом декларишемо процедуру и
одмах јој променимо име у Enter) којом ћемо кориснику олакшати рад јер ћемо му дозволити да
притиском тастера Ентер прелази из едита у едит без употребе миша:
// Омогућава прелазак из једног едита у други притиском тастера Ентер
procedure TForm1.Enter(Sender: TObject; var Key: Char);
var i:integer;
begin If key=#13 then
begin For i:=1 to 10 do
If sender=TEdit(FindComponent('Edit'+IntToStr(i)))
then TEdit(FindComponent('Edit'+IntToStr(i+1))).SetFocus;
If sender=Edit11 then DateTimePicker1.SetFocus;
end;
end;
За грид ћемо дефинисати да када кликнемо на неки ред (у Object Inspector-у на листићу
Events пронађемо догађај OnCellClick и двокликом декларишемо процедуру) или када померамо
стрелицама фокус са једног на други податак (у Object Inspector-у на листићу Events пронађемо
догађај OnKeyDown и двокликом декларишемо процедуру, затим пронађемо догађај OnKeyUp и
кликом изаберемо претходну процедуру да не бисмо писали исту процедуру два пута) у едитима
приказујемо текући податак (Ова процедура реагује на притисак и отпуштање било којег тастера на
тастатури, али се њени ефекти виде само ако се користе стрелице на горе и на доле).
// Када кликнемо на неко поље у гриду исписује податке у едитима
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin Ispisi;
end;
// Када се стрелицама горе или доле померамо по гриду исписује податке у едитима
procedure TForm1.DBGrid1KeyDown(Sender:TObject; var Key:Word;Shift:TShiftState);
begin Ispisi;
end;
Ако је неки податак погрешно унет или се променио, треба га променити. Може се направити
посебна процедура за измену података, али можемо дозволити измену података и у оквиру овог
дела програма. Да не бисмо додавали нови битбатон за ову процедуру, измену активног податка
ћемо дозволити двокликом на тај податак у гриду (селектујемо грид, па у Object Inspector-у на
листићу Events пронађемо догађај OnDblClick и двокликом декларишемо процедуру).
// Двоклик на неки податак у гриду омогућава његову измену
procedure TForm1.DBGrid1DblClick(Sender: TObject);
var i:integer;
begin For i:=1 to 11 do
36
Мирослав Илић
Мирослав Илић
37
TEdit(FindComponent('Edit'+IntToStr(i))).ReadOnly:=false;
Edit1.SetFocus;
end;
// Када кликнемо на битбатон Додај
procedure TForm1.BitBtn3Click(Sender: TObject);
var i:integer;
begin For i:=1 to 11 do
begin TEdit(FindComponent('Edit'+IntToStr(i))).ReadOnly:=false;
TEdit(FindComponent('Edit'+IntToStr(i))).Clear;
end;
DateTimePicker1.Date:=date;
CheckBox1.Checked:=true;
Table1.Append;
Edit1.SetFocus;
end;
// Када кликнемо на битбатон Запамти
procedure TForm1.BitBtn4Click(Sender: TObject);
var i:integer;
begin Table1.Edit;
For i:=1 to 11 do
begin TEdit(FindComponent('Edit'+IntToStr(i))).ReadOnly:=true;
Table1.Fields[i-1].AsString:=
TEdit(FindComponent('Edit'+IntToStr(i))).Text;
end;
Table1.FieldByName('datumr').AsDateTime:=DateTimePicker1.Date;
Table1.FieldByName('aktivan').AsBoolean:=CheckBox1.Checked;
Table1.Refresh;
end;
// Када кликнемо на битбатон Поништи
procedure TForm1.BitBtn5Click(Sender: TObject);
var i:integer;
begin For i:=1 to 11 do
TEdit(FindComponent('Edit'+IntToStr(i))).ReadOnly:=true;
Table1.Refresh;
Ispisi;
end;
// Када кликнемо на битбатон Обриши
procedure TForm1.BitBtn6Click(Sender: TObject);
begin Table1.Delete;
Ispisi;
end;
• Преглед података
Преглед свих података у датотеци је могућ и у оквиру претходног посла, стрелицама на горе
или на доле можемо проћи све податке у датотеци, а они ће се приказивати у едитима. Ипак, овде
ћемо направити још један, другачији приступ том послу.
Овде је приказан поступак комплетног креирања панела за преглед података, уместо тога,
могли смо прекопирати претходни панел и само променити неке компоненте и функције које су
придружене компонентама. На форму ћемо поставити панел (листић Standard, петнаеста
компонента Panel) водећи рачуна да он не буде на постојећем панелу (додајемо панел преко неке од
компоненти на форми, рецимо, на тајмер) и подесити следеће карактеристике:
Align - alClient, BevelInner - bvLowered, BevelOuter - bvLowered, BevelWidth - 4,
BorderStyle - bsSingle, BorderWidth - 2, Color - clMoneyGreen, Visible - false.
На панел ћемо ставити:
лабелу за наслов (листић Standard, четврта компонента Label) са карактеристикама:
Align - alTop, Alignment - taCenter, AutoSize - false, Caption - Преглед унетих
података, Font - Palatino Linotype/Bold Italic/22, Layout - tlCenter.
Програмирање - први кораци
37
38
Програмирање - први кораци
битбатон за повратак на насловну страну (листић Additional, прва компонента BitBtn)
са карактеристикама:
Caption - (празно), Glyph - (двоклик, Load, Изабрана сличица), Height - 50, Left 1030, Top - 20, Width - 50.
бевел - оквир (листић Additional, осма компонента Bevel) са карактеристикама:
Height - 590, Left - 15, Top - 100, Width - 585
тринаест лабела (листић Standard, четврта компонента Label) са карактеристикама:
AutoSize - false, Caption - Презиме/Име/Улица/Број/Место/Поштански број/Држава/
Број телефона/Мобилни/Хороскопски знак/Интернет адреса/Датум рођења/Активан,
Font - Palatino Linotype/Italic/14, Height - 30, Left - 25, Layout - tlCenter, Top
- 110/155/200/245/290/335/380/425/470/515/560/605/640, Width - 165.
дванаест текст компоненти које ће приказивати садржај поља из слога датотеке без
могућности њихове измене (листић Data Controls, трећа компонента DBText) са
карактеристикама:
DataSource - DataSource1, DataField - prezime/ime/ulica/broj/mesto/pbroj/drzava/
fiksni/mobilni/hznak/email/datumr, Font - Arial/Bold/14, Height - 30, Left 190, Top - 110/155/ 200/245/290/335/380/425/470/515/560/605, Width - 400.
чекбокс компоненту (листић Data Controls, девета компонента DBCheckBox) са
карактеристикама:
DataSource - DataSource1, DataField - aktivan, Font - Arial/Bold/14, Height - 30,
Left - 190, Top - 640, Width - 20.
радио групу
којом ћемо бирати које податке ћемо приказивати (листић Standard,
четрнаеста компонента RadioGroup) са карактеристикама:
Caption - Прикажи, Columns - 3, Font - Arial/Regular/11, Height - 50, Items Активне/Неактивне/Све, Left - 275, Layout - tlCenter, Top - 638, Width - 323.
навигатор компоненту која ће нам омогућити померање кроз податке датотеке (листић
Data Controls, друга компонента DBNavigator) са карактеристикама:
DataSource - DataSource1, VisibleButtons - [nbFirst,nbPrior,nbNext,nbLast]
(кликнемо на плусић испред имена карактеристике и прва четири тастера оставимо на
true, а осталих шест поставимо на false)
38
Мирослав Илић
Мирослав Илић
39
грид (листић DataControls, прва компонента dBGrid) са карактеристикама:
Align - alRight, DataSource - DataSource1, Font - Palatino
Linotype/Regular/11, TitleFont - Palatino Linotype/Bold
Italic/11, Width - 480.
Двокликом на грид отварамо едитор колона где кликом на тастер са
три срца додајемо сва поља из слога датотеке, а затим обришемо сва сем
поља: prezime, ime и datumr. За ова поља подесићемо карактеристике:
Alignment - taLeftJustify/taLeftJustify/taCenter, (Title)
Caption - Презиме/Име/Рођендан, (Title) Alignment - taCenter,
Width - 200/150/94.
Завршили смо са дизајнирањем прегледа података и сада ћемо написати пратеће процедуре.
// Отварање панела за преглед података
procedure TForm1.N11Click(Sender: TObject);
begin Panel3.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
(Table1.FieldByName('datumr') as TDateTimeField).DisplayFormat:='dd.MM.yyyy.';
StatusBar1.Panels[0].Text:='ПРЕГЛЕД ПОДАТАКА';
RadioGroup1.ItemIndex:=-1;
end;
У овој процедури користили смо форматизацију исписа датума јер се он исписује као текст, а
не у датумској компоненти.
Кликнућемо на битбатон за повратак и у Object Inspector-у на листићу Events пронаћи
догађај OnClick. Кликом на његов оквир за садржај и стрелицу која се ту појави отвориће се листа из
које ћемо изабрати процедуру Povratak и у њој избрисати ознаку коментара испред панела 3.
Дефинисаћемо филтрирање података по критеријуму активности као реакцију на клик на
радио групу (у Object Inspector-у на листићу Events пронађемо догађај OnClick и двокликом
декларишемо процедуру) да бисмо прегледали само активне, неактивне или све податке:
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin Table1.Filtered:=false;
Case RadioGroup1.ItemIndex of
0 : Table1.Filter:='aktivan=true';
1 : Table1.Filter:='aktivan=false';
2 : Table1.Filter:='(aktivan=true)or(aktivan=false)';
end;
Table1.Filtered:=true;
end;
Овде је поступак програмирања прегледа података завршен јер смо користили компоненте
које директно приказују поља текућег податка из датотеке и компоненту навигатор која омогућава
померање кроз датотеку.
• Претраживање
Посао претраживања података је прилично компликован. Знамо неки податак или део
податка и на основу тога филтрирамо базу да бисмо добили све податке који задовољавају задате
услове. Услов претраживања може бити једноставан као пронаћи све особе чије име почиње са М.
Али, некада знамо презиме, некада само име, а некада и неки други податак или део податка.
Програм који пишемо мора да обухвати што је могуће већи број случајева и зато је формирање
услова за филтрирање компликовано. Да бисмо колико-толико олакшали посао претраживања
ограничићемо корисника на, максимално, седам услова, тј. дозволићемо претраживање на основу
презимена, имена, улице, места, државе, хороскопског знака и датума рођења. За избор неког од
поменутих података као услова претраживања користићемо чекбоксове. Овим смо себи отежали
посао јер корисник може комбиновати више података. Једноставније решење било би користити
радио батоне јер би у том случају корисник морао да изабере један од података као критеријум за
претраживање. Но, шта је ту је.
Да кренемо од дизјнирања панела за претраживање. На форму ћемо поставити панел
(листић Standard, петнаеста компонента Panel) водећи рачуна да он не буде на постојећем панелу
(додајемо панел преко неке од компоненти на форми, рецимо, на тајмер) и подесити следеће
карактеристике:
Align - alClient, BevelInner - bvLowered, BevelOuter - bvLowered, BevelWidth - 4,
BorderStyle - bsSingle, BorderWidth - 2, Color - clMoneyGreen, Visible - false.
Програмирање - први кораци
39
40
Програмирање - први кораци
На панел ћемо ставити:
лабелу за наслов (листић Standard, четврта компонента Label) са карактеристикама:
Align - alTop, Alignment - taCenter, AutoSize - false, Caption - Претраживање
података, Font - Palatino Linotype/Bold Italic/22, Layout - tlCenter.
битбатон за повратак на насловну страну (листић Additional, прва компонента BitBtn)
са карактеристикама:
Caption - (празно), Glyph - (двоклик, Load, Изабрана сличица), Height - 50, Left 1030, Top - 20, Width - 50.
бевел - оквир (листић Additional, осма компонента Bevel) са карактеристикама:
Height - 590, Left - 15, Top - 100, Width - 585
тринаест лабела (листић Standard, четврта компонента Label) са карактеристикама:
AutoSize - false, Caption - Презиме/Име/Улица/Број/Место/Поштански број/Држава/
Број телефона/Мобилни/Хороскопски знак/Интернет адреса/Датум рођења/Активан,
Font - Palatino Linotype/Italic/14, Height - 30, Left - 25, Layout - tlCenter, Top
- 110/155/200/245/290/335/380/425/470/515/560/605/640, Width - 165.
једанаест едита за испис садржаја поља из слога датотеке (листић Standard, пета
компонента Edit) са карактеристикама:
Font - Arial/Bold/14, Left - 200, ReadOnly - true, Text - (празно), Top - 110/155/
200/245/290/335/380/425/470/515/560, Width - 390.
датумску компоненту за приказ датума (листић Win32, десета компонента
DateTimePicker) са карактеристикама:
Font - Arial/Bold/14, Format - dd.MM.yyyy, Height - 30, Left - 200, Top - 605,
Width - 130.
чекбокс за приказ активности податка (листић Standard, осма компонента CheckBox)
са карактеристикама:
Caption - (празно), Font - Arial/Bold/14, Height - 30, Left - 200, Top - 640,
Width - 20.
седам чекбоксова за избор поља за филтрирање података у датотеци (листић Standard,
осма компонента CheckBox) са карактеристикама:
40
Мирослав Илић
Мирослав Илић
41
Caption - (празно), Font - Arial/Bold/14, Height - 30, Left - 180, Top 110/155/200/290/380/515/605, Width - 20.
пет битбатона (листић Additional, прва компонента BitBtn) са карактеристикама:
Caption - Пронађи/Запамти/Поништи/Обриши/Измени, Font - Arial/Bold/14, Glyph (двоклик, Load, Изабрана сличица), Height - 40, Left - 20/135/250/365/480, Top 715, Width - 115.
грид (листић DataControls, прва компонента dBGrid) са карактеристикама:
Align - alRight, DataSource - DataSource1, Font - Palatino
Linotype/Regular/11, TitleFont - Palatino Linotype/Bold
Italic/11, Width - 480.
Двокликом на грид отварамо едитор колона где кликом на тастер са
три срца додајемо сва поља из слога датотеке, а затим обришемо сва сем
поља: prezime, ime и datumr. За ова поља подесићемо карактеристике:
Alignment - taLeftJustify/taLeftJustify/taCenter, (Title)
Caption - Презиме/Име/Рођендан, (Title) Alignment - taCenter,
Width - 200/150/94.
Завршили смо са дизајнирањем панела за преглед података и сада ћемо написати пратеће
процедуре.
// Отварање панела за претраживање података
procedure TForm1.N11Click(Sender: TObject);
var i:integer;
begin Panel4.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
pan:=12;
// редни број првог едита на овом панелу
For i:=0 to 10 do
begin TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
TEdit(FindComponent('Edit'+IntToStr(i+pan))).Clear;
end;
For i:=3 to 9 do
TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Checked:=false;
StatusBar1.Panels[0].Text:='ПРЕТРАГА ПОДАТАКА';
end;
Едити за приказ података морају бити заштићени од уноса података и празни све док се не
постави филтер на податке из датотеке и сви чекбоксови морају бити слободни.
Кликнућемо на битбатон за повратак и у Object Inspector-у на листићу Events пронаћи
догађај OnClick. Кликом на његов оквир за садржај и стрелицу која се ту појави отвориће се листа из
које ћемо изабрати процедуру Povratak и у њој избрисати ознаку коментара испред панела 4.
Да бисмо исписали податке у едите користићемо исту процедуру Ispisi као и код уноса
података само ћемо је модификовати увођењем параметра pan који је одређен првим едитом на
панелу. Код уноса података овај параметар ће имати вредност 1, а код претраживања 12.
Променљива pan мора бити глобална. На исти начин ћемо решити исписивање и на панелу за
брисање изабраног податка и на панелу за штампање изабраног податка.
// Исправљена процедура Ispisi
procedure TForm1.Ispisi;
var i:integer;
begin Case pan of
1:begin DateTimePicker1.Date:=Table1.FieldByName('datumr').AsDateTime;
CheckBox1.Checked:=Table1.FieldByName('aktivan').AsBoolean;
end;
12:begin DateTimePicker2.Date:=Table1.FieldByName('datumr').AsDateTime;
CheckBox2.Checked:=Table1.FieldByName('aktivan').AsBoolean;
end;
end;
For i:=0 to 10 do
TEdit(FindComponent('Edit'+IntToStr(i+pan))).Text:=
Table1.Fields[i].AsString;
end;
Када корисник чекбоксом селектује неки едит он треба да се испразни и постане активан. То
ћемо решити следећом процедуром (селектујемо свих седам чекбоксова, а затим у Object Inspector-у
на листићу Events пронађемо догађај OnCellClick и двокликом декларишемо процедуру):
Програмирање - први кораци
41
42
Програмирање - први кораци
// Празни едит поред чекбокса који се чекира
procedure TForm1.Izaberi(Sender: TObject);
const ed:array[3..8] of integer=(12,13,14,16,18,21);
var i:integer;
begin For i:=3 to 8 do
If sender=TCheckBox(FindComponent('CheckBox'+IntToStr(i)))
then begin TEdit(FindComponent('Edit'+IntToStr(ed[i]))).Clear;
TEdit(FindComponent('Edit'+IntToStr(ed[i]))).ReadOnly:=
not TEdit(FindComponent('Edit'+IntToStr(ed[i]))).ReadOnly;
TEdit(FindComponent('Edit'+IntToStr(ed[i]))).SetFocus;
end;
end;
Филтер на неко поље (прости филтер, односно, прости услов) поставља се као стринг:
a:='ImePolja=vrednost'
дефинишемо приказ свих података из базе које испуњавају задати услов.
Ако је филтер сложен онда се услови повезују логичким функцијама и и или у зависности од
тога шта хоћемо да постигнемо таквим условом, на пример:
a:='(ImePolja1=vrednost1) and (ImePolja2=vrednost2)'
дефинишемо приказ свих података из базе који задовољавају оба задата услова
a:='(ImePolja1=vrednost1) or (ImePolja2=vrednost2)'
дефинишемо приказ свих података из базе који задовољавају бар један од два задата услова.
Могуће су и друге комбинације.
Наредбом:
Table1.Filter:=a;
поставља се филтер, али се база не филтрира. Филтрирање почиње тек када се зада наредба:
Table1.Filtered:=true;
// Када кликнемо на битбатон Пронађи поставља се задати филтер
procedure TForm1.BitBtn9Click(Sender: TObject);
const ed:array[3..8] of integer=(12,13,14,16,18,21);
var a,b:string;
i:integer;
begin a:='';
For i:=3 to 8 do
If TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Checked then
begin b:=TEdit(FindComponent('Edit'+IntToStr(ed[i]))).Text+'*'')';
If Length(b)>2
then If Length(a)>0
then a:=a+'and('+Table1.Fields[ed[i]-12].FieldName+'='''+b
else a:='('+Table1.Fields[ed[i]-12].FieldName+'='''+b;
end;
If CheckBox9.Checked then
begin b:='(datumr='''+DateToStr(DateTimePicker2.Date)+''')';
If Length(a)>0
then a:=a+'and'+b
else a:=b;
end;
If Length(a)>0 then
begin Table1.Filtered:=false;
Table1.Filter:=a;
Table1.Filtered:=true;
end;
end;
Када кликнемо на битбатон Запамти позива се иста процедура као код уноса података зато
ћемо у Object Inspector-у на листићу Events пронаћи догађај OnClick, кликнути мишем да се отвори
прозор и изабрати процедуру BitBtn4Click. Процедура се мора модификовати на следећи начин
(да би радила и за унос података и за претраживање):
procedure TForm1.BitBtn4Click(Sender: TObject);
var i:integer;
begin Table1.Edit;
For i:=0 to 10 do
42
Мирослав Илић
Мирослав Илић
43
begin TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
Table1.Fields[i].AsString:=
TEdit(FindComponent('Edit'+IntToStr(i+pan))).Text;
end;
Case pan of
1:begin Table1.FieldByName('datumr').AsDateTime:=DateTimePicker1.Date;
Table1.FieldByName('aktivan').AsBoolean:=CheckBox1.Checked;
end;
2:begin Table1.FieldByName('datumr').AsDateTime:=DateTimePicker2.Date;
Table1.FieldByName('aktivan').AsBoolean:=CheckBox2.Checked;
end;
end;
Table1.Refresh;
end;
// Када кликнемо на битбатон Поништи поништавамо постављени филтер
// празне се едити и забрањује измена њиховог садржаја
// сви чекбоксови се "одчекирају", тј. ослободе
procedure TForm1.BitBtn11Click(Sender: TObject);
var i:integer;
begin Table1.Filtered:=false;
Table1.First;
For i:=0 to 10 do
begin TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
TEdit(FindComponent('Edit'+IntToStr(i+pan))).Clear;
end;
For i:=3 to 9 do
TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Checked:=false;
end;
Када кликнемо на битбатон Обриши позива се иста процедура као код уноса података зато
ћемо у Object Inspector-у на листићу Events пронаћи догађај OnClick, кликнути мишем да се отвори
прозор и изабрати процедуру BitBtn6Click.
// Када кликнемо на битбатон Измени дозвољавамо измену података у свим едитима
// и постављамо курсор у први едит на панелу за претраживање
procedure TForm1.BitBtn13Click(Sender: TObject);
var i:integer;
begin For i:=0 to 10 do
TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
Edit12.SetFocus;
end;
Овде је поступак програмирања претраживања података завршен.
• Штампање података
Извештаји представљају најприлагодљивији начин за приказивање и штампање података и
сумарних података. Подаци се приказују са произвољним нивоом детаља, у зависности од потреба
корисника. Штампањем извештаја у облику одговарајућих образаца и формулара корисник добија
могућност детаљне анализе и приказивања података. Извештаји могу садржати статистичка
упоређивања, графиконе и слике. При креирању штампаних извештаја мора се водити рачуна о
штампачу на коме ће корисник приказивати извештај.
Извештаје можемо да поделимо у неколико група:
• табеларни извештаји - подаци се штампају у редовима и колонама са евентуалним
збировима и међузбировима колона и редова
• стубачни извештаји - подаци се штампају у колонама са евентуалним збировима колона и
дијаграмима
• циркуларна писма - текст из једног или више мемо поља штампа се са различитим
заглављима
• налепнице - штампање поштанских адреса на ковертама или налепницама у више редова и
колона и штампање извештаја са хијерархијским приказом података
Планирање извештаја почиње пре него што почнемо да пишемо конкретни програмски код.
Најпре бирамо врсту извештаја и податке које желимо да прикажемо у њему, а затим:
• дефинишемо изглед извештаја;
• одређеним пољима у извештају придружујемо поља из базе података;
Програмирање - први кораци
43
44
Програмирање - први кораци
• пишемо програмски код који ће коначно обликовати извештај и
• пробамо штампање или преглед извештаја да бисмо добили коначну потврду исправности
претходних корака.
• Штампање из делфи програма
Основни рад са штампачем подразумева да се програму који пишемо придодају процедуре
библиотеке Printers у одељку који почиње са uses:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Printers;
Штампање из делфи програма је, уствари, креирање текстуалне датотеке на штампачу и
поступак је сличан креирању било које текстуалне датотеке:
Најпре се декларише променљива датотеке помоћу које се посредно обраћамо датотеци:
var dat: System.Text;
Затим се датотека креира на штампачу са:
AssignPrn(dat);
ReWrite(dat);
Штампање се остварује стандардном процедуром за унос:
WriteLn(dat,’Текст који се штампа или текстуална променљива’);
WriteLn(dat,numericki podatak ili numericka promenljiva);
Дозвољено је и комбиновање нумеричких и знаковних података. Испис је могуће
форматизовати применом, између осталих, команде Format.
По завршеном штампању датотека се затвара са:
CloseFile(dat);
Уместо процедуре WriteLn може се употребити и процедура Write, али у том случају податак
се штампа без преласка у нови ред. Са датотекама на штампачу не смеју се користити процедуре
Read и ReadLn јер се не могу читати подаци из излазне датотеке на штампачу.
Код креирања извештаја методом директног обраћања штампачу могу се користити ASCII
кодови специјалних тастера:
• #9 - тастер Таб -прескаче осам просечних ширина знака у фонту који се користи
• #13 - тастер Ентер - празни излазни бафер
• #10 - празни излазни бафер и започиње нови ред
• #12 - празни излазни бафер и започиње нову страну
Избор фонта остварујемо постављањем карактеристике Canvas.Font:
Printer.Canvas.Font.Name:=’Palatino Linotype’;
Printer.Canvas.Font.Size:=13;
Printer.Canvas.Font.Style:=[fsBold];
Да би се дефинисали сви параметри стране и штампања потребно је детаљно проучити
својства и методе објеката класе TPrinter. За то нам је потребно много више од расположивог
времена, зато овај део посла препуштамо само онима који су заинтересовани за детаљно
проучавање креирања извештаја директним обраћањем штампачу (отворити Help и у одељку Help
Topics укуцати TPrinter, а затим изабрати VCL References и, коначно, Properties или Methods).
• Програм Rave Reports
Други начин за креирање извештаја је коришћење неког од услужних програма. То је
једноставнији начин, али има и ограничења која су одређена самим програмом, нешто, што бисмо
ми хтели да изведемо на извештају, програмом није предвиђено („туђа рука свраб не чеше“). Један
од таквих програма је Rave Reports (Designer). Услужни програм Rave Reports можемо стартовати и
независно од делфија, али ћемо добити поруку да је програм повезан са компонентама делфи
програма за који креирамо извештај. Зато нећемо радити на тај начин.
Стартоваћемо делфи и отворићемо апликацију (пројекат) у који желимо да уградимо
извештај. Са листића Rave на форму ћемо додати онолико компоненти RvDataSetConnection
колико датотека желимо да користимо у извештају и преко карактеристике DataSet ћемо их
повезати са одговарајућим Table објектима. Карактеристика Active у свим табелама морају бити
постављене на true. Сада ћемо, из менија Tools, изабрати опцију Rave Designer. Отвориће се прозор
следећег изгледа:
44
Мирослав Илић
Мирослав Илић
45
Најпре ћемо поставити карактеристике стране:
PageHeight и PageWidth ћемо поставити на 297 и 210 (ако желимо да извештај буде штампан на
папиру А4 формата).
PaperSize је карактеристика помоћу које, такође, можемо одредити формат извештаја и може се
користити уместо претходне две карактеристике, ако желимо извештај на неком од уграђених
формата (Letter, Legal, A4, итд.) у том случају ширина и висина се аутоматски прилагођавају
изабраном формату. Ако користимо нестандардни формат овде ће се дефинисати вредност
карактеристике Custom.
Orientation је карактеристика којом се дефинише оријентација извештаја на папиру и може бити
poPortrait (дужа страна по висини) или poLandScape (краћа страна по висини).
GridLines је карактеристика којом одређујемо које ће се линије координатног система видети на
екрану док дизајнирамо извештај (на пример, свака пета или десета).
GridSpacing је карактеристика којом одрежујемо растојање између линија координатног система на
екрану док дизајнирамо извештај (ове линије нам помажу код постављања и уређивања
објеката на извештају, али се код штампања не виде).
Остале карактеристике стране не морамо подешавати. У прозору који личи на Object
Inspector у делфију кликнућемо на RaveProject и затим подесити карактеристику Units на unMM
(ако нам је једноставније да радимо са милиметрима, иначе се може оставити unInch или поставити
unCM или unPoint). Сада ћемо из менија File изабрати опцију New Data Object. Отвориће се прозор
Програмирање - први кораци
45
46
Програмирање - први кораци
Data Connections из којег ћемо изабрати Direct Data View и RvDataSetConection1 (и 2, 3, 4, ... зависно
од броја табела које можемо да користимо у нашем извештају) и кликнути на Finish.
Сада дизајнирамо извештај.
На листићу Drawing су праве линије, правоугаоници и елипсе, елементарни графички
елементи које можемо додати у извештај. Линија може бити хоризонтална, вертикална или коса,
при чему можемо задати њену дужину и дебљину (карактеристикама Width, Height и LineWidth),
њен положај (карактеристикама Left и Top), боју (ако ће се извештај штампати на неком колор
штампачу) карактеристиком Color и врсту (пуна линија, испрекидана, тачкаста, црта-тачка)
карактеристиком LineStyle. Исте карактеристике могу се подешавати и код правоугаоника и
елипси (уместо Line овде се користе Border карактеристике) уз додатак карактеристика за
испуњавање (Fill).
Са листића Standard поменућемо компоненте Text, Memo и Bitmap које користимо за
додавање текстова и слика извештају. Код прве две компоненте можемо подешавати фонт за испис,
ширину и уређење (карактеристикама Font, Height и FontJustify), а код свих положај на страни
(карактеристикама Left и Top).
На листићу Report налазе се објекти помоћу којих се подаци из датотека увозе у извештај.
Поменућемо компоненте за приказ садржаја поља из слога датотеке DataText и DataMemo
(компонентама се додељују називи поља из одговарајућих датотека), компоненту за израчунавање
Calc Text која се повезује са одговарајућом формулом (сабери, изброји, просек, максимум и
минимум) везаном за поље из датотеке и компоненте Region (омогућава приказ групе података из
датотеке на више страница), Band (омогућава дефинисање заглавља и подножја извештаја) и
DataBand (омогућава дефинисање групе података која се приказује у једном реду на дефинисаном
региону).
На листићу Fonts можемо дефинисати начин исписа појединих текстуалних компоненти у
оквиру извештаја (верзија програма 5.0 не ради са ћириличним словима иако се она могу
поставити, односно, дефинисати, а да би се и видела на извештају мора се ћирилична кодна страна
поставити у оперативном систему).
Листић Alignment нам даје могућност уређивања положаја објеката у оквиру извештаја и
садржаја у оквиру неке компоненте.
Остале листиће ћемо ређе користити, а ако нам неки објекат или команда од понуђених на
тим листићима буде затребала објаснићемо их тада.
Детаљније објашњење рада у овом програму и постављања објеката и њихових
карактеристика биће дато на конкретном примеру креирања извештаја. Код креирања извештаја
обавезно треба консултовати будућег корисника нашег програма (они увек имају неку идеју како да
вам отежају завршетак програма додавањем специфичних захтева, чак и код извештаја).
• Штампање извештаја
Треба пронаћи податак или групу података и одштампати у погодној форми. Креирамо пет
врста извештаја, један директним штампањем из програма - приказаћемо све податке о изабраној
особи у облику табеле и четири извештаја креирана помоћу услужног програма Rave Project табелу са свим подацима о свим унетим особама, адресу изабране особе, адресе групе изабраних
особа на обичном папиру и на налепницама 2х7 на папиру А4 формата. Да бисмо могли да
креирамо извештаје по датуму рођења користићемо помоћну датотеку Stampa која има исту
структуру као и основна датотека Adresar и у њу ћемо преписати податке који задовољавају задати
услов. Да бисмо успоставили везу са овом датотеком на форму ћемо поставити још један објекат
Table (са листића BDE прва компонента са карактеристикама TableName на Stampa.dbf, IndexName
на Adresa и Active на true ) који ће датотеку повезати са програмом и још један објекат DataSource (са
листића Data Access прва компонента) са карактеристиком DataSet на Table1 који ће омогућити
приступ подацима у програму. Затим ћемо на форму поставити са листића Rave четири објекта
RvProject (први објекат) и један RvDataSetConnection (пети објекат). Да кренемо са дизјнирањем
панела за претраживање. На форму ћемо поставити панел (листић Standard, петнаеста компонента
Panel) водећи рачуна да он не буде на постојећем панелу (додајемо панел преко неке од компоненти
на форми, рецимо, на тајмер) и подесити следеће карактеристике:
Align - alClient, BevelInner - bvLowered, BevelOuter - bvLowered, BevelWidth - 4,
BorderStyle - bsSingle, BorderWidth - 2, Color - clMoneyGreen, Visible - false.
На панел ћемо ставити:
лабелу за наслов (листић Standard, четврта компонента Label) са карактеристикама:
Align - alTop, Alignment - taCenter, AutoSize - false, Caption - Штампање
података, Font - Palatino Linotype/Bold Italic/22, Layout - tlCenter.
46
Мирослав Илић
Мирослав Илић
47
битбатон за повратак на насловну страну (листић Additional, прва компонента BitBtn)
са карактеристикама:
Caption - (празно), Glyph - (двоклик, Load, Изабрана сличица), Height - 50, Left 1030, Top - 20, Width - 50.
бевел - оквир (листић Additional, осма компонента Bevel) са карактеристикама:
Height - 155, Left - 25, Top - 145, Width - 575
три лабеле (листић Standard, четврта компонента Label) са карактеристикама:
AutoSize - false, Caption - Презиме/Име/Датум рођења, Font - Palatino
Linotype/Italic/14, Height - 30, Left - 35, Layout - tlCenter, Top - 155/205/255,
Width - 155.
два едита (листић Standard, пета компонента Edit) са карактеристикама:
Font - Arial/Bold/14, Left - 190, ReadOnly - true, Text - (празно), Top - 155/ 205,
Width - 400.
компоненту за унос датума (листић Win32, десета компонента DateTimePicker) са
карактеристикама:
Font - Arial/Bold/14, Format - dd.MM.yyyy, Height - 30, Left - 190, Top - 255,
Width - 130.
две радио групе (листић Standard, четрнаеста компонента RadioGroup) са
карактеристикама:
Caption - Прикажи/Претражи по, Columns - 3, Font - Arial/Regular/14, Height - 60,
ItemIndex - 2, Items - [Активне/Неактивне/Све]/[Презимену/Имену/Датуму], Left 595/25, Top - 77, Width - 485/565.
битбатон (листић Additional, прва компонента BitBtn) са карактеристикама:
Caption - Налепнице, Font - Arial/Bold/14, Glyph - (двоклик, Load, Изабрана сличица),
Height - 50, Left - 610, Top - 250, Width - 220.
шест битбатона (листић Additional, прва компонента BitBtn) са карактеристикама:
Caption - Пронађи податак/Штампај податак/Штампај податке/Налепнице адресе/Штампај
адресу/Штампај адресе, Font - Arial/Bold/14, Glyph - (двоклик, Load, Изабрана
сличица), Height - 50, Left - 595/840, Spacing - 15/20/20/5/25/15, Top - 140/195/
250, Width - 240.
Програмирање - први кораци
47
48
Програмирање - први кораци
грид (листић DataControls, прва компонента dBGrid) са карактеристикама:
Align - alBottom, DataSource - DataSource2, Font - Palatino Linotype/Regular/11,
TitleFont - Palatino Linotype/Bold Italic/11, Height - 460.
Двокликом на грид отварамо едитор колона где кликом на тастер са
три срца додајемо сва поља из слога датотеке, а затим обришемо сва сем
поља: prezime, ime, ulica, broj, mesto и datumr. За ова поља подесићемо следеће
карактеристике:
Alignment - taLeftJustify/taLeftJustify/taLeftJustify/taLeft
Justify/taCenter, (Title) Caption - Презиме/Име/Улица/Број/
Место/Рођендан, (Title) Alignment - taCenter, Width 202/165/325/85/165/95.
Завршили смо са дизајнирањем панела за штампање података и сада ћемо написати пратеће
процедуре.
// Отвара панел за штампање
procedure TForm1.N14Click(Sender: TObject);
begin Panel5.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
Table2.Active:=false;
Table2.EmptyTable;
Table2.Active:=true;
RadioGroup2.ItemIndex:=2;
RadioGroup3.ItemIndex:=2;
StatusBar1.Panels[0].Text:='ШТАМПАЊЕ ПОДАТАКА';
end;
Кликнућемо на битбатон за повратак и у Object Inspector-у на листићу Events пронаћи
догађај OnClick. Кликом на његов оквир за садржај и стрелицу која се ту појави отвориће се листа из
које ћемо изабрати процедуру Povratak и у њој избрисати ознаку коментара испред панела 5.
// Када кликнемо на другу радио групу на овом панелу бирамо поље по коме се претражују подаци
procedure TForm1.RadioGroup3Click(Sender: TObject);
var n:integer;
begin Edit23.ReadOnly:=true;Edit23.Clear;
Edit24.ReadOnly:=true;Edit24.Clear;
n:=RadioGroup3.ItemIndex+23;
If n<25
then begin TEdit(FindComponent('Edit'+IntToStr(n))).ReadOnly:=false;
TEdit(FindComponent('Edit'+IntToStr(n))).SetFocus;
end
else DateTimePicker3.SetFocus;
end;
Ако је изабран критеријум штампања по имену или презимену дозвољавамо унос у
одговарајући едит у противном позиционирамо датумску компоненту у којој чемо задати дан и
месец податка који тражимо (година не утиче на избор података за штампање).
// Када кликнемо на битбатон Пронађи бирамо податке који се приказују
procedure TForm1.BitBtn16Click(Sender: TObject);
var a:string;
i,d,m:integer;
begin d:=0;m:=0;
Table2.Active:=false;
Table2.EmptyTable;
Table2.Active:=true;
Table2.Refresh;
Table1.Filtered:=false;
Case RadioGroup2.ItemIndex of
0 : a:='(aktivan=true)';
1 : a:='(aktivan=false)';
2 : a:='((aktivan=true)or(aktivan=false))';
end;
Case RadioGroup3.ItemIndex of
0 : a:=a+'and(prezime='+QuotedStr(Edit23.Text)+')';
48
Мирослав Илић
Мирослав Илић
49
1 : a:=a+'and(ime='+QuotedStr(Edit24.Text)+')';
2 : begin d:=DayOf(DateTimePicker3.Date);
m:=MonthOf(DateTimePicker3.Date);
end;
end;
Table1.Filter:=a;
Table1.Filtered:=true;
Table1.First;
If RadioGroup3.ItemIndex<2
then While not Table1.Eof do
begin Table2.Append;Table2.Edit;
For i:=0 to 11 do
Table2.Fields[i]:=Table1.Fields[i];
Table1.Next;
end
else While not Table1.Eof do
begin If (DayOf(Table1.FieldByName('datumr').AsDateTime)=d)and
(MonthOf(Table1.FieldByName('datumr').AsDateTime)=m)
then begin Table2.Append;Table2.Edit;
For i:=0 to 11 do
Table2.Fields[i]:=Table1.Fields[i];
end;
Table1.Next;
end;
Table2.Refresh;Table2.First;
end;
Када два пута кликнемо на тастер Штампај податак написаћемо процедуру за штампање
података о изабраној особи:
procedure TForm1.Button17Click(Sender: TObject);
var dat:System.Text;
begin AssignPrn(dat);ReWrite(dat);
Printer.Canvas.Font.Name:=’Courier New’;
Printer.Canvas.Font.Size:=13;
Printer.Canvas.Font.Style:=[];
Write(dat,’Презиме
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[0].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Име
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[1].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Улица
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[2].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Број
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[3].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Поштански број
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[4].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Место
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[5].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Држава
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[6].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Електронска адреса : ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[7].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Број телефона
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
Програмирање - први кораци
49
50
Програмирање - први кораци
WriteLn(dat,Table1.Fields[8].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Мобилни телефон
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[9].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Датум рођења
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[10].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,’Хороскопски знак
: ‘);
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[11].AsString);
CloseFile(dat);
end;
Процедура податке из датотеке директно шаље на штампач.
Када два пута кликнемо на тастере Штампај податке, Штампај адресу, Штампај адресе,
Налепнице адресе написаћемо процедуре за штампање свих података изабраних особа, штампање
налепница за коверте, штампање адресе селектоване особе и штампање адреса свих изабраних
особа:
// Штампа све податке
procedure TForm1.Button18Click(Sender: TObject);
begin Table2.First;
If not Table2.Eof then
RvProject1.Execute;
end;
// Штампа једну адресу
procedure TForm1.Button20Click(Sender: TObject);
begin If not Table2.Eof then
RvProject2.Execute;
end;
// Штампа све адресе
procedure TForm1.Button21Click(Sender: TObject);
begin Table2.First;
If not Table2.Eof then
RvProject3.Execute;
end;
// Штампа налепнице
procedure TForm1.Button19Click(Sender: TObject);
begin Table2.First;
If not Table2.Eof then
RvProject4.Execute;
end;
Сада ћемо из менија Tools изабрати опцију Rave Designer и направити потребне обрасце да
би ове процедуре могле и да се користе.
• Образац Адреса
Стандардна коверта за писма има димензије 176 x 125 мм (формат Б6) , зато ћемо овај извештај
креирати тако да стане у овај простор. Ако штампач за који радимо извештај нема могућност
штампања коверти извештај ће се штампати на папиру А4 формата, па адресу треба исећи и
залепити, друга варијанта је направити извештај за налепнице које би се лепиле на коверте. Друга
варијанта подразумева да се направи онолико извештаја колико има налепница на папиру, јер се
мора водити рачуна о положају налепнице на папиру, и програмирање уноса редног броја
налепнице на коју се адреса исписује. Ово је нешто сложеније и зато ћемо претпоставити да
штампач може штампати коверте.
У прозору са десне стране (одговара прозору Object TreeView у делфију) кликнућемо на
RaveProject, а затим ћемо у прозору са леве стране (одговара прозору Object Inspector у делфију)
подесити карактеристику Units на unMM, овиме смо дефинисали милиметре као јединице у којима
ћемо задавати вредности положаја и величине објеката на извештају. Затим ћемо изабрати објекат
Page1 и поставити карактеристике PaperSize на B6 Envelope, 176- by 125-millimeters и Orientation на
poPortrait, чиме смо дефинисали формат извештаја.
Извештај мора бити повезан са датотеком у којој су подаци за штампање на следећи начин:
50
Мирослав Илић
Мирослав Илић
51
Из менија File изабраћемо New Data Object. Из отвореног прозора Data Connection изабраћемо
Direct Data View, а затим у новоотвореном прозору RvDataSet Connection1. На овај начин смо
будући извештај повезали са датотеком из које ће се читати подаци за креирање тог извештаја.
Отворићемо листић Report, изабрати компоненту DataText и поставити је на папир, а затим
подесити њене карактеристике (понављаћемо поступак седам пута):
Width = 50, Top = 40, Left = 30, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 18,
Bold, DataView = DataView1 и DataField = prezime.
Width = 50, Top = 40, Left = 80, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 18,
Bold, DataView = DataView1 и DataField = ime.
Width = 80, Top = 54, Left = 30, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = ulica.
Width = 20, Top = 54, Left = 120, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = broj.
Width = 20, Top = 62, Left = 30, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = pbroj.
Width = 80, Top = 62, Left = 50, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = mesto.
Width = 100, Top = 70, Left = 30, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = drzava.
Овим смо завршили креирање извештаја као на
слици. Из менија File изабраћемо Save As и сачувати
извештај у фолдер Adresar са именом Adresa.
Затворићемо Rave Designer или ћемо га само
минимизирати ако желимо да наставимо са
креирањем других извештаја. Селектоваћемо објекат
RvProject2 и поставити његову карактеристику
ProjectFile на управо креирани извештај и сада се он
може користити из програма.
Наравно, ако извештај правимо за неки други
тип коверте положаји и све димензије компоненти
DataText могу бити другачији (‘лењир у шаке’ и
меримо да подесимо параметре онако како се нама
или кориснику највише свиђа).
• Образац Адресе
Стандардна коверта за писма има димензије 176 x 125 мм (формат Б6) , зато ћемо овај извештај
креирати тако да стане у овај простор. Ако штампач за који радимо извештај нема могућност
штампања коверти онда је овај извештај непотребан.
У прозору са десне стране (одговара прозору Object TreeView у делфију) кликнућемо на
RaveProject, а затим ћемо у прозору са леве стране (одговара прозору Object Inspector у делфију)
подесити карактеристику Units на unMM, овиме смо дефинисали милиметре као јединице у којима
ћемо задавати вредности положаја и величине објеката на извештају. Затим ћемо изабрати објекат
Page1 и поставити карактеристике PaperSize на B6 Envelope, 176- by 125-millimeters и Orientation на
poPortrait, чиме смо дефинисали формат извештаја.
Из менија File изабраћемо New Data Object. Из отвореног прозора Data Connection изабраћемо
Direct Data View, а затим у новоотвореном прозору RvDataSet Connection1. На овај начин смо
будући извештај повезали са датотеком из које ће се читати подаци за креирање тог извештаја.
Програмирање - први кораци
51
52
Програмирање - први кораци
Отворићемо листић Report, изабрати компоненту Region која омогућава приказивање серије
података у извештају, а затим подесити њене карактеристике:
Height - 45, Left - 30, Top - 40, Width - 100.
Са листића Report изабраћемо компоненту DataBand која дефинише један ред на Region-у и
подесити њене карактеристике:
Height - 35, DataView = DataView1.
Са листића Report изабраћемо и компоненту DataText и поставити је на DataBand, а затим
подесити њене карактеристике (понављаћемо поступак седам пута):
Left = 0, Top = 0, Width = 50, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 18,
Bold, DataView = DataView1 и DataField = prezime.
Left = 50, Top = 0, Width = 50, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 18,
Bold, DataView = DataView1 и DataField = ime.
Left = 0, Top = 13, Width = 80, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = ulica.
Left = 80, Top = 13, Width = 20, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = broj.
Left = 0, Top = 21, Width = 20, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = pbroj.
Left = 20, Top = 21, Width = 80, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = mesto.
Left = 0, Top = 29, Width = 100, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = drzava.
Овим смо завршили креирање извештаја као на
слици. Из менија File изабраћемо Save As и сачувати
извештај у фолдер Adresar са именом Adrese.
Затворићемо Rave Designer или ћемо га само
минимизирати ако желимо да наставимо са
креирањем других извештаја. Селектоваћемо објекат
RvProject3 и поставити његову карактеристику
ProjectFile на управо креирани извештај и сада се он
може користити из програма.
Наравно, ако извештај правимо за неки други
тип коверте положаји и све димензије компоненти
Region, DataBand и DataText могу бити другачији
(‘лењир у шаке’ и меримо да подесимо параметре
онако како се нама или кориснику највише свиђа).
• Образац Налепнице адреса
Стандардна коверта за писма има димензије 176 x 125 мм (формат Б6) , зато ћемо овај извештај
креирати тако да стане у овај простор. Извештај се штампа на специјалном папиру са налепницама
димензије 99.1х38.1 мм, па ћемо њему прилагодити штампање.
У прозору са десне стране (одговара прозору Object TreeView у делфију) кликнућемо на
RaveProject, а затим ћемо у прозору са леве стране (одговара прозору Object Inspector у делфију)
подесити карактеристику Units на unMM, овиме смо дефинисали милиметре као јединице у којима
ћемо задавати вредности положаја и величине објеката на извештају. Затим ћемо изабрати објекат
Page1 и поставити карактеристике PaperSize на A4 Sheet, 210- by 297-millimeters и Orientation на
poPortrait, чиме смо дефинисали формат извештаја.
Из менија File изабраћемо New Data Object. Из отвореног прозора Data Connection изабраћемо
Direct Data View, а затим у новоотвореном прозору RvDataSet Connection1. На овај начин смо
будући извештај повезали са датотеком из које ће се читати подаци за креирање тог извештаја.
Отворићемо листић Report, изабрати компоненту Region која омогућава приказивање серије
података у извештају, а затим подесити њене карактеристике:
Height - 267, Left - 5.9, Top - 14.7, Width - 198.2, Columns - 2.
Са листића Report изабраћемо компоненту DataBand која дефинише један ред на Region-у и
подесити њене карактеристике: Height - 38.1, DataView = DataView1.
Са листића Report изабраћемо и компоненту DataText и поставити је на DataBand, а затим
подесити њене карактеристике (понављаћемо поступак седам пута):
52
Мирослав Илић
Мирослав Илић
53
Left = 2, Top = 1, Width = 50, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 18,
Bold, DataView = DataView1 и DataField = prezime.
Left = 52, Top = 1, Width = 47, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 18,
Bold, DataView = DataView1 и DataField = ime.
Left = 2, Top = 13, Width = 80, FontJustify = pjLeft, Font = ‘Comic Sans MS’, 14,
Bold, DataView = DataView1 и DataField = ulica.
Left = 82, Top = 13, Width = 17, FontJustify
= pjLeft, Font = ‘Comic Sans MS’, 14, Bold,
DataView = DataView1 и DataField = broj.
Left = 2, Top = 21, Width = 20, FontJustify =
pjLeft, Font = ‘Comic Sans MS’, 14, Bold,
DataView = DataView1 и DataField = pbroj.
Left = 22, Top = 21, Width = 79, FontJustify
= pjLeft, Font = ‘Comic Sans MS’, 14, Bold,
DataView = DataView1 и DataField = mesto.
Left = 2, Top = 29, Width = 97, FontJustify =
pjLeft, Font = ‘Comic Sans MS’, 14, Bold,
DataView = DataView1 и DataField = drzava.
Овим смо завршили креирање извештаја као на
слици. Из менија File изабраћемо Save As и сачувати
извештај у фолдер Adresar са именом NAdrese.
Затворићемо Rave Designer или ћемо га само
минимизирати ако желимо да наставимо са
креирањем других извештаја. Селектоваћемо објекат
RvProject4 и поставити његову карактеристику
ProjectFile на управо креирани извештај и сада се он
може користити из програма.
Наравно, ако извештај правимо за други тип
папира са налепницама сви положаји и димензије
компоненти Region, DataBand и DataText могу бити
другачији (‘лењир у шаке’ и меримо да подесимо
параметре онако како најбоље одговара формату
папира и налепнице).
• Образац Адресар
Овај извештај је замишљен као табела свих података о селектованим особама, особама које
испуњавају филтером задати услов. Будући да података има много, распоређени су у три реда.
У прозору са десне стране (одговара прозору Object TreeView у делфију) кликнућемо на
RaveProject, а затим ћемо у прозору са леве стране (одговара прозору Object Inspector у делфију)
подесити карактеристику Units на unMM, овиме смо дефинисали милиметре као јединице у којима
ћемо задавати вредности положаја и величине објеката на извештају. Затим ћемо изабрати објекат
Page1 и поставити карактеристике PaperSize на A4 Sheet, 210- by 297-millimeters и Orientation на
poPortrait, чиме смо дефинисали формат извештаја.
Из менија File изабраћемо New Data Object. Из отвореног прозора Data Connection изабраћемо
Direct Data View, а затим у новоотвореном прозору RvDataSet Connection1. На овај начин смо
будући извештај повезали са датотеком из које ће се читати подаци за креирање тог извештаја.
Отворићемо листић Standard, изабрати компоненту Text која омогућава приказивање текста
по избору, а затим подесити њене карактеристике:
Font = ‘Comic Sans MS’, 48, Bold, FontJustify = pjLeft, Left - 10, Text - М о ј
а
д р е с а р, Top - 8, Width - 160.
Са листића Standard изабраћемо и компоненту Bitmap која омогућава приказивање слике по
избору, а затим подесити њене карактеристике:
Height - 20, Left - 170, Top - 8, Width - 30, Image - (кликом мишем отварамо
дијалог за унос слике по избору).
Отворићемо листић Report, изабрати компоненту Region која омогућава приказивање серије
података у извештају, а затим подесити њене карактеристике:
Height - 262, Left - 10, Top - 30, Width - 190.
Са листића Report изабраћемо компоненту Band која дефинише заглавље табеле на Region-у и
подесити њену карактеристику Height - 20.
Програмирање - први кораци
53
54
Програмирање - први кораци
Са листића Drawing изабраћемо компоненту Rectangle - правоугаоник и поставићемо је на
Band, а затим подесити њене карактеристике (поновићемо поступак пет пута):
BorderWidth - 2, FillColor - $00DFDFDF (Silver, 50%), Height - 18, Left - 0, Top 0, Width - 61.
BorderWidth - 2, FillColor - $00DFDFDF (Silver, 50%), Height - 18, Left - 61, Top
- 0, Width - 61.
BorderWidth - 2, FillColor - $00DFDFDF (Silver, 50%), Height - 18, Left - 122, Top
- 0, Width - 31.
BorderWidth - 2, FillColor - $00DFDFDF (Silver, 50%), Height - 18, Left - 153, Top
- 0, Width - 37.
BorderWidth - 2, FillColor - $00DFDFDF (Silver, 50%), Height - 6, Left - 0, Top 6, Width - 190.
Са листића Standard изабраћемо и компоненту Text која омогућава приказивање текста по
избору и поставићемо је на Band, а затим подесити њене карактеристике (поновићемо поступак
дванаест пута):
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 0,
Text - Презиме, Top - 0.672, Width - 61.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 61,
Text - Улица, Top - 0.672, Width - 61.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 122,
Text - Број, Top - 0.672, Width - 31.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 153,
Text - Фиксни телефон, Top - 0.672, Width - 37.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 0,
Text - Име, Top - 6.672, Width - 61.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 61,
Text - Место становања, Top - 6.672, Width - 61.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 122,
Text - Поштански број, Top - 6.672, Width - 31.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 153,
Text - Мобилни телефон, Top - 6.672, Width - 37.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 0,
Text - Електронска адреса, Top - 12.672, Width - 61.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 61,
Text - Држава, Top - 12.672, Width - 61.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 122,
Text - Датум рођења, Top - 12.672, Width - 31.
Color - Brown, Font = ‘Palatino Linotype’,11, FontJustify = pjCenter, Left - 153,
Text - Хороскопски знак, Top - 12.672, Width - 37.
Са листића Report изабраћемо компоненту DataBand која дефинише један ред на Region-у и
подесити њене карактеристике: Height - 20, DataView = DataView1.
Селектоваћемо компоненту Band и поставити DataBand1 у поље карактеристике ControllerBand.
Овиме смо дефинисали да заглавље припада табели одређеној траком DataBand1. А двокликом на
поље карактеристике BandStyle у отвореном едитору бирамо: Body Header, First и New Page чиме смо
дефинисали да се заглавље појављује на првој и свакој новој страни извештаја.
Са листића Drawing изабраћемо компоненту Rectangle - правоугаоник и поставићемо је на
DataBand, а затим подесити њене карактеристике (поновићемо поступак пет пута):
BorderWidth - 2, Height - 18, Left - 0, Top - 0, Width - 61.
BorderWidth - 2, Height - 18, Left - 61, Top - 0, Width - 61.
BorderWidth - 2, Height - 18, Left - 122, Top - 0, Width - 31.
BorderWidth - 2, Height - 18, Left - 153, Top - 0, Width - 37.
BorderWidth - 2, Height - 6, Left - 0, Top - 6, Width - 190.
Са листића Drawing изабраћемо компоненту HLine - хоризонтална линија и поставићемо је
на DataBand, а затим подесити њене карактеристике:
LineWidth - 2, Left - 0, Top - 19, Width - 190.
Са листића Report изабраћемо и компоненту DataText и поставити је на DataBand, а затим
подесити њене карактеристике (понављаћемо поступак дванаест пута):
54
Мирослав Илић
Мирослав Илић
55
Color - Brown, FontJustify = pjLeft, Font = ‘Palatino Linotype’,11, Bold, Left =
1, Top = 0.672, Width = 59, DataView = DataView1 и DataField = prezime.
Color - Black, FontJustify = pjLeft, Font = ‘Palatino Linotype’,11, Bold, Left =
62, Top = 0.672, Width = 59, DataView = DataView1 и DataField = ulica.
Color - Black, FontJustify = pjLeft, Font = ‘Palatino Linotype’,11, Bold, Left =
127, Top = 0.672, Width = 25, DataView = DataView1 и DataField = broj.
Color - Black, FontJustify = pjCenter, Font = ‘Palatino Linotype’,11, Bold, Left
= 154, Top = 0.672, Width = 35, DataView = DataView1 и DataField = fiksni.
Color - Brown, FontJustify = pjLeft, Font = ‘Palatino Linotype’,11, Bold, Left =
1, Top = 6.672, Width = 59, DataView = DataView1 и DataField = ime.
Color - Black, FontJustify = pjLeft, Font = ‘Palatino Linotype’,11, Bold, Left =
62, Top = 6.672, Width = 59, DataView = DataView1 и DataField = mesto.
Color - Black, FontJustify = pjLeft, Font = ‘Palatino Linotype’,11, Bold, Left =
127, Top = 6.672, Width = 25, DataView = DataView1 и DataField = pbroj.
Color - Black, FontJustify = pjCenter, Font = ‘Palatino Linotype’,11, Bold, Left
= 154, Top = 6.672, Width = 35, DataView = DataView1 и DataField = mobilni.
Color - TealBlue, FontJustify = pjLeft, Font = ‘Palatino Linotype’,10, Italic,
Left = 1, Top = 12.672, Width = 59, DataView = DataView1 и DataField = email.
Color - Black, FontJustify = pjLeft, Font = ‘Palatino Linotype’,11, Bold, Left =
62, Top = 12.672, Width = 59, DataView = DataView1 и DataField = drzava.
Color - Black, FontJustify = pjLeft, Font = ‘Palatino Linotype’,11, Bold, Left =
127, Top = 12.672, Width = 25, DataView =
DataView1 и DataField = datumr.
Color - Black, FontJustify = pjCenter,
Font = ‘Palatino Linotype’,11, Bold, Left
= 154, Top = 12.672, Width = 35, DataView
= DataView1 и DataField = hznak.
Да би се датум исписивао са осам цифара и
тачкицама потребно је форматизовати испис. То
ћемо урадити тако што ћемо у прозору са десне
стране (одговара прозору Object TreeView у
делфију) кликнути на плусић испред Data View
Dictionary, па на плусић испред DataView1 и
затим на DataView1DATUMR, а у прозору са леве
стране (одговара прозору Object Inspector у
делфију)
написати
dd.MM.yyyy.
у
пољу
карактеристике DisplayFormat.
Овим смо завршили креирање извештаја
као на слици. Из менија File изабраћемо Save As и
сачувати извештај у фолдер Adresar са именом
Adresar.
Затворићемо Rave Designer или ћемо га само
минимизирати ако желимо да наставимо са
креирањем других извештаја. Селектоваћемо
објекат
RvProject1
и
поставити
његову
карактеристику ProjectFile на управо креирани
извештај и сада се он може користити из
програма.
Ово је био последњи програмом предвиђени
извештај.
• Брисање података
Брисање појединачног податка из датотеке решили смо на панелу за упис података, али је
проналажење податка за брисање отежано јер се мора стрелицама на горе и на доле проћи готово
цела датотека да бисмо дошли до њега. Зато ћемо сада направити независну процедуру за брисање
података.
Посао брисања поделићемо на два: брисање изабраног и брисање свих података у датотеци.
Други посао је једноставнији и зато ћемо прво њега објаснити и програмирати.
Избором опције Сви подаци у подменију Брисање података опције ПОДАЦИ покренућемо
процедуру за брисање комплетног садржаја датотеке. Да би се избегло брисање података
Програмирање - први кораци
55
56
Програмирање - први кораци
случајним, нежељеним избором ове опције пре самог брисања података проверићемо поруком да
ли је то заиста жеља корисника програма и ако јесте испразнићемо датотеку. Ево како изгледа та
процедура:
procedure TForm1.N152Click(Sender: TObject);
begin If MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Извршењем ове команде бришу се СВИ ПОДАЦИ'+#13+
'у датотеци без могућности враћања !!!'+#13+
'Да ли сте ПОТПУНО СИГУРНИ да то желите?'+#13,
'ОБРАТИ ПАЖЊУ',MB_OKCancel+MB_TaskModal+MB_IconError)
=IDOK
then begin Table1.Active:=false;
Table1.EmptyTable;
Table1.Active:=true;
Table1.Refresh;
end;
end;
Значење ознака употребљених у функцији MessageBox:
• MB_OKCancel - приказује тастере ОК и Cancel
• MB_TaskModal - не дозвољава приступ другим опцијама програма све док се не затвори
прозор
• MB_IconError - приказује црвену иконицу са крстићем
• IDOK - корисник је кликнуо на тастер ОК
Сада ћемо креирати панел за брисање изабраног податка и одговарајуће процедуре.
На форму ћемо поставити панел (листић Standard, петнаеста компонента Panel) водећи
рачуна да он не буде на постојећем панелу (додајемо панел преко неке од компоненти на форми,
рецимо, на тајмер) и подесити следеће карактеристике:
Align - alClient, BevelInner - bvLowered, BevelOuter - bvLowered, BevelWidth - 4,
BorderStyle - bsSingle, BorderWidth - 2, Color - clMoneyGreen, Visible - false.
На панел ћемо ставити:
56
Мирослав Илић
Мирослав Илић
57
лабелу за наслов (листић Standard, четврта компонента Label) са карактеристикама:
Align - alTop, Alignment - taCenter, AutoSize - false, Caption - Брисање
изабраних података, Font - Palatino Linotype/Bold Italic/22, Layout - tlCenter.
битбатон за повратак на насловну страну (листић Additional, прва компонента BitBtn)
са карактеристикама:
Caption - (празно), Glyph - (двоклик, Load, Изабрана сличица), Height - 50, Left 1030, Top - 20, Width - 50.
две лабеле (листић Standard, четврта компонента Label) са карактеристикама:
AutoSize - false, Caption - Презиме/Име, Font - Palatino Linotype/Italic/14,
Height - 30, Left - 25, Layout - tlCenter, Top - 100/135, Width - 85.
два едита (листић Standard, пета компонента Edit) са карактеристикама:
Font - Arial/Bold/14, Left - 110, ReadOnly - true, Text - (празно), Top - 100/135,
Width - 390.
радио
групу
(листић
Standard,
четрнаеста
компонента
RadioGroup)
са
карактеристикама:
Caption - Прикажи, Columns - 3, Font - Arial/Regular/16, Height - 75, ItemIndex 2, Items - [Активне/Неактивне/Све], Left - 510, Top - 90, Width - 390.
два битбатона (листић Additional, прва компонента BitBtn) са карактеристикама:
Caption - (празно), Glyph - (двоклик, Load, Изабрана сличица), Height - 75, Left 910/995, Top - 90, Width - 75.
грид (листић DataControls, прва компонента dBGrid) са карактеристикама:
Align - alBottom, DataSource - DataSource2, Font - Palatino Linotype/Regular/11,
TitleFont - Palatino Linotype/Bold Italic/11, Height - 595.
Двокликом на грид отварамо едитор колона где кликом на тастер са
три срца додајемо сва поља из слога датотеке, а затим обришемо сва сем
поља: prezime, ime, ulica, broj, mesto и datumr. За ова поља подесићемо следеће
карактеристике:
Alignment - taLeftJustify/taLeftJustify/taLeftJustify/taLeft
Justify/taCenter, (Title) Caption - Презиме/Име/Улица/Број/
Место/Рођендан, (Title) Alignment - taCenter, Width 202/165/325/85/165/95.
Завршили смо са дизајнирањем панела за штампање података и сада ћемо написати пратеће
процедуре.
// Отвара панел за брисање изабраног податка
procedure TForm1.N151Click(Sender: TObject);
begin Panel6.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
RadioGroup4.ItemIndex:=2;
StatusBar1.Panels[0].Text:='БРИСАЊЕ ИЗАБРАНИХ ПОДАТАКА';
end;
Кликнућемо на битбатон за повратак и у Object Inspector-у на листићу Events пронаћи
догађај OnClick. Кликом на његов оквир за садржај и стрелицу која се ту појави отвориће се листа из
које ћемо изабрати процедуру Povratak и у њој избрисати ознаку коментара испред панела 6.
Критеријум за претраживање састоји се из три услова:
• радио група одређује да ли тражимо активне, неактивне или све податке,
• едит са презименом издваја податке код којих презиме почиње унетим стрингом
• едит са именом издваја податке код којих име почиње унетим стрингом
у или дозвољавамо унос у одговарајући едит у противном позиционирамо датумску
компоненту у којој чемо задати дан и месец податка који тражимо (година не утиче на избор
података за штампање).
// Клик на тастер за налажење података поставља филтер на датотеку
procedure TForm1.BitBtn23Click(Sender: TObject);
var a:string;
begin Table1.Filtered:=false;
Case RadioGroup4.ItemIndex of
0 : a:='(aktivan=true)';
1 : a:='(aktivan=false)';
2 : a:='((aktivan=true)or(aktivan=false))';
Програмирање - први кораци
57
58
Програмирање - први кораци
end;
If Length(Edit25.Text)>0
then a:=a+'and(prezime='+QuotedStr(Edit25.Text+'*')+')';
If Length(Edit26.Text)>0
then a:=a+'and(ime='+QuotedStr(Edit26.Text+'*')+')';
Table1.Filter:=a;
Table1.Filtered:=true;
Table1.First;
end;
Да бисмо убрзали процес налажења податка за брисање, ову исту процедуру ћемо позивати и
када се промени садржај било којег од два едита или када се кликне на радио групу. Селектоваћемо
оба едита и радио групу, па у Object Inspector-у на листићу Events пронаћи догађај OnClick. Кликом
на његов оквир за садржај и стрелицу која се ту појави отвориће се листа из које ћемо изабрати
процедуру BitBtn23Click.
// Клик на тастер за брисање изабраних података
procedure TForm1.BitBtn24Click(Sender: TObject);
begin If MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Извршењем ове команде бришу се ПОДАТЦИ'+#13+
'у датотеци без могућности враћања !!!'+#13+
'Да ли сте ПОТПУНО СИГУРНИ да то желите?'+#13,
'ОБРАТИ ПАЖЊУ',MB_OKCancel+MB_TaskModal+MB_ICONError)=IDOK
then begin Table1.First;
While not Table1.Eof do
begin Table1.Delete;
end;
Table1.Refresh;
Edit25.Clear;Edit26.Clear;
Edit25.SetFocus;
end;
end;
Ако је корисник селектовао неке податке и кликнуо на бит батон за брисање програм га
упозорава да је поступак брисања неповратан и тражи потврду брисања. Корисник кликом на ОК
потврђује брисање или кликом на Cancel одустаје од брисања. Да бисмо избегли системску поруку
пре брисања податка из датотеке (чиме би се дуплирало тражење потврде брисања) кликнућемо да
бисмо селектовали компоненту Table1 и у Object Inspector-у на листићу Events пронаћи догађај
BeforeDelete. Двокликом ћемо декларисати процедуру коју ћемо оставити празну (коментар је
написан да делфи не би обрисао ову процедуру приликом компајлирања јер у њој нема никакве
друге наредбе).
procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
begin // искључује системску поруку о брисању податка из датотеке
end;
Ову поруку би требало додати и у процедуру на клик тастера Обриши код уноса података јер
сада више неће бити системске поруке која тражи потврду брисања податка.
Ако је филтером издвојено више података, а желимо да обришемо само неке од њих или ћемо
пооштрити критеријум за претраживање или ћемо жељени податак (или податке) обрисати
двокликом на ред у коме се налазе у гриду. То ћемо урадити следећом процедуром:
// Брише податак означен двокликом
procedure TForm1.DBGrid5DblClick(Sender: TObject);
begin If MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Извршењем ове команде брише се ПОДАТАК'+#13+
'у датотеци без могућности враћања !!!'+#13+
'Да ли сте ПОТПУНО СИГУРНИ да то желите?'+#13,
'ОБРАТИ ПАЖЊУ',MB_OKCancel+MB_TaskModal+MB_ICONError)=IDOK
then begin Table1.Delete;Table1.Refresh;
end;
end;
Ако је корисник селектовао податак двокликом у гриду, програм га упозорава да је поступак
брисања неповратан и тражи потврду брисања. Корисник кликом на ОК потврђује брисање или
кликом на Cancel одустаје од брисања.
Сада смо комплетно завршили и поступак брисања података из датотеке
58
Мирослав Илић
Мирослав Илић
59
• Архивирање и рестаурација података
Када радимо са важним подацима на рачунару морамо бити свесни опасности да податке
изгубимо због квара на машини или других разлога. Зато податке морамо чувати на спољашним
меморијама. Поступак чувања података на спољним носиоцима меморије зове се архивирање.
Архивирање података треба вршити кад год упишемо онолико података колико би нам било тешко
да поново уносимо. Није лоше имати и по две или више копија података на различитим носиоцима
меморије. Ако се подаци, из било ког разлога, изгубе са рачунара, онда је важно да програм
обезбеђује враћање података из архиве. Овај поступак зове се рестаурација података. Програм који
ради са базом података мора у себи имати уграђене рутине архивирања и рестаурације података из
базе.
Пошто су архивирање и рестаурација, практично, исти посао, разлика је само у смеру кретања
података, онда ћемо ова два посла обрадити на једном панелу и са што је могуће мање компоненти
и процедура. Најпре ћемо дизајнирати панел. На форму ћемо поставити панел (листић Standard,
петнаеста компонента Panel) водећи рачуна да он не буде на постојећем панелу (додајемо панел
преко неке од компоненти на форми, рецимо, на тајмер) и подесити следеће карактеристике:
BevelInner - bvLowered, BevelOuter - bvLowered, BevelWidth - 2, BorderStyle bsSingle, BorderWidth - 2, Color - clMoneyGreen, Height - 300, Left - 350, Name Arhiv, Top - 290, Visible - false, Width - 500.
На панел ћемо ставити:
лабелу за наслов (листић Standard, четврта компонента Label) са карактеристикама:
Align - alTop, Alignment - taCenter, AutoSize - false, Caption - (празно), Font Palatino Linotype/Bold Italic/22, Layout - tlCenter.
битбатон за повратак на насловну страну (листић Additional, прва компонента BitBtn)
са карактеристикама:
Caption - (празно), Glyph - (двоклик, Load, Изабрана сличица), Height - 60, Left 360, Top - 200, Width - 60.
битбатон (листић Additional, прва компонента BitBtn) са карактеристикама:
Caption - (празно), Font - Palatino Linotype/Bold Italic/22, Glyph - (двоклик, Load,
Изабрана сличица), Height - 60, Left - 75, Spacing - 30, Top - 200, Width - 280.
лабелу (листић Standard, четврта компонента Label) са карактеристикама:
AutoSize - false, Caption - Унесите ознаку јединице, Font - Palatino Linotype/
Italic/18, Height - 41, Layout - tlCenter, Left - 90, Top - 115, Width - 280.
едит (листић Standard, пета компонента Edit) са карактеристикама:
BevelInner - bvLowered,BevelKind - bkSoft, CharCase - ecUpperCase, Font - Courier
New/Bold/22, Left - 370, MaxLength - 1, Name - Arhiva, Text - C, Top - 115, Width 40.
Завршили смо са дизајнирањем прегледа података и сада ћемо написати пратеће процедуре.
Кликнућемо на битбатон за повратак и у Object Inspector-у на листићу Events пронаћи
догађај OnClick. Кликом на његов оквир за садржај и стрелицу која се ту појави отвориће се листа из
које ћемо изабрати процедуру Povratak и у њој избрисати ознаку коментара испред панела Arhiv.
Пошто исти панел користимо и за архивирање и за рестаурацију података отварање панела је
мало другачије него код осталих панела јер осим забране коришћења неких опција главног менија
морамо и да доделимо различите текстове у Caption карактеристикама лабеле и бит батона за
позивање архивских процедура. Зато ћемо написати следеће две процедуре (када се из менија
изабере архивирање и када се из менија изабере рестаурација података):
// Архивирање података из програма - клик на
// ставку Архивирање у оквиру менија СЕРВИС
procedure TForm1.N21Click(Sender: TObject);
begin Arhiv.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
Label44.Caption:='Архивирање
података';
BitBtn14.Caption:='Архивирај';
StatusBar1.Panels[0].Text:=
'АРХИВИРАЊЕ ПОДАТАКА';
Arhiva.SetFocus;
end;
Програмирање - први кораци
59
60
Програмирање - први кораци
// Враћање архивираних података - клик на ставку
// Рестаурација у оквиру менија СЕРВИС
procedure TForm1.N22Click(Sender: TObject);
begin Arhiv.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
Label44.Caption:='Враћање података
из архиве';
BitBtn14.Caption:='Врати';
StatusBar1.Panels[0].Text:=
'РЕСТАУРАЦИЈА ПОДАТАКА';
Arhiva.SetFocus;
end;
Пошто имамо један тастер, а две процедуре које се прилично разликују, кликом на бит батон
не можемо одмах извршити једну од процедура. Зато ћемо тестирати шта пише на тастеру и у
зависности од тога потвати једну или другу процедуру.
// Клик на битбатон Архивирај/Врати
procedure TForm1.BitBtn14Click(Sender: TObject);
begin If BitBtn14.Caption='Архивирај'
then Sacuvaj
else Vrati;
end;
Процедуре Sacuvaj и Vrati нису реакција на неки догађај зато их сами морамо декларисати у
одељку private:
private
procedure Ispisi;
procedure Sacuvaj;
procedure Vrati;
public
Сада можемо дефинисати ове две процедуре:
// Архивирање података
procedure TForm1.Sacuvaj;
var d,f,v:int64;
gde,disk:string;
new,old:TFileStream;
const s:array[1..2] of string=('\Adresar.dbf','\Adresar.mdx');
begin If Length(Arhiva.Text)<1
then begin ShowMessage('Морате уписати ознаку уређаја!');
Arhiva.SetFocus;
end
else begin d:=Ord(Arhiva.Text[1])-64;
f:=DiskFree(d);
gde:=Arhiva.Text+':\AdresarArhiva';
GetDir(0,disk);
Table1.Active:=false;
old:=TFileStream.Create(disk+s[1],fmOpenRead);
New:=TFileStream.Create(disk+s[2],fmOpenRead);
v:=Old.Size+New.Size;
FreeAndNil(Old);FreeAndNil(New);
Table1.Active:=true;
If f=-1
then begin ShowMessage('Погрешна ознака уређаја!');
Arhiva.SetFocus;
end
else If f<v
then begin ShowMessage('Нема довољно простора на уређају!'+
#13+'Потребно је '+IntToStr(v)+'b');
Arhiva.SetFocus;
end
else begin Table1.Active:=false;
If not DirectoryExists(gde) then MkDir(gde);
old:=TFileStream.Create(disk+s[1],fmOpenRead);
try new:=TFileStream.Create(gde+s[1],fmCreate);
60
Мирослав Илић
61
Мирослав Илић
try ne.CopyFrom(old,old.Size);
finally FreeAndNil(new);
end;
finally FreeAndNil(old);
end;
old:=TFileStream.Create(disk+s[2],fmOpenRead);
try new:=TFileStream.Create(gde+s[2],fmCreate);
try new.CopyFrom(old,old.Size);
finally FreeAndNil(new);
end;
finally FreeAndNil(old);
end;
ShowMessage('Архивирање података је завршено!');
Table1.Active:=true;
Arhiv.Visible:=false;
N1.Enabled:=true;
N2.Enabled:=true;
StatusBar1.Panels[0].Text:='Насловна страница програма';
end;
end;
end;
// Рестаурација података
procedure TForm1.Vrati;
var gde,disk:string;
new,old:TFileStream;
const s:array[1..2] of string=('\Adresar.dbf','\Adresar.mdx');
begin If Length(Arhiva.Text)<1
then begin ShowMessage('Морате уписати ознаку уређаја!');
Arhiva.SetFocus;
end
else begin gde:=Arhiva.Text+':\AdresarArhiva';
GetDir(0,disk);
If not DirectoryExists(gde)
then begin ShowMessage('Нема архиве. Погрешан уређај!');
Arhiva.SetFocus;
end
else begin Table1.Active:=false;
old:=TFileStream.Create(gde+s[1],fmOpenRead);
try new:=TFileStream.Create(disk+s[1],fmCreate);
try new.CopyFrom(old,old.Size);
finally FreeAndNil(new);
end;
finally FreeAndNil(old);
end;
old:=TFileStream.Create(gde+s[2],fmOpenRead);
try new:=TFileStream.Create(disk+s[2],fmCreate);
try new.CopyFrom(old,old.Size);
finally FreeAndNil(new);
end;
finally FreeAndNil(old);
end;
ShowMessage('Рестаурација података је завршена!');
Table1.Active:=true;
Arhiv.Visible:=false;
N1.Enabled:=true;
N2.Enabled:=true;
StatusBar1.Panels[0].Text:='Насловна страница програма';
end;
end;
end;
Једноставнији начин архивирања и рестаурације података је коришћењем неких екстерних
команди, на пример:
procedure TForm1.Button1Click(Sender: TObject);
var k:string;
begin k:='C:\Program Files\WinRAR\WinRAR.exe a -ep c:\arhiva\proba c:\baza\*.*';
winexec(pchar(k),SW_RESTORE);
Програмирање - први кораци
61
62
Програмирање - први кораци
end;
Процедура је ефикасан начин архивирања датотека са компресијом. Уместо унапред задатих
путања архивских датотека и архиве могу се увести променљиве које корисник може да дефинише
до у детаља. Међутим, овакав начин захтева да корисник има инсталиран неки програм за
архивирање и компресију података (у овом случају је то WinRAR) и да на рачунару има довољно
радне меморије за извршење екстерних команди (ово друго и није неко ограничење, с обзиром на
тренутни стандард за рачубарске конфигурације).
Следи комплетан програмски код како би се сагледала комплетна слика програма, али и како
би се избегле, евентуалне, забуне у вези са неким процедурама које су најпре написане на један
начин, а затим прилагођаване да би се примениле и на другим местима.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, jpeg, ExtCtrls, ComCtrls, StdCtrls, Buttons, Grids,
DBGrids, DB, DBTables, DBCtrls, StrUtils, DateUtils, RpCon, RpConDS,
RpDefine, RpRave, Printers;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem; N3: TMenuItem; N4: TMenuItem;
N11: TMenuItem; N12: TMenuItem; N13: TMenuItem; N14: TMenuItem;
N15: TMenuItem;N151: TMenuItem;N152: TMenuItem; N21: TMenuItem;
N22: TMenuItem; N31: TMenuItem; N32: TMenuItem; N33: TMenuItem;
Image1: TImage;
StatusBar1: TStatusBar;
Timer1: TTimer;
Panel1: TPanel;Panel2: TPanel;Panel3: TPanel;Panel4: TPanel;
Panel5: TPanel;Panel6: TPanel;Arhiv: TPanel;
Memo1: TMemo;
Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel;
Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel;
Label9: TLabel ;Label10: TLabel;Label11: TLabel;Label12: TLabel;
Label13: TLabel;Label14: TLabel;Label15: TLabel;Label16: TLabel;
Label17: TLabel;Label18: TLabel;Label19: TLabel;Label20: TLabel;
Label21: TLabel;Label22: TLabel;Label23: TLabel;Label24: TLabel;
Label25: TLabel;Label26: TLabel;Label27: TLabel;Label28: TLabel;
Label29: TLabel;Label30: TLabel;Label31: TLabel;Label32: TLabel;
Label33: TLabel;Label34: TLabel;Label35: TLabel;Label36: TLabel;
Label37: TLabel;Label38: TLabel;Label39: TLabel;Label40: TLabel;
Label41: TLabel;Label42: TLabel;Label43: TLabel;Label44: TLabel;
Label45: TLabel;Label46: TLabel;Label47: TLabel;Label48: TLabel;
Label49: TLabel;Label50: TLabel;Label51: TLabel;Label52: TLabel;
Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit;
Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Edit10: TEdit;
Edit11: TEdit;Edit12: TEdit;Edit13: TEdit;Edit14: TEdit;Edit15: TEdit;
Edit16: TEdit;Edit17: TEdit;Edit18: TEdit;Edit19: TEdit;Edit20: TEdit;
Edit21: TEdit;Edit22: TEdit;Edit23: TEdit;Edit24: TEdit;Edit25: TEdit;
Edit26: TEdit;Arhiva: TEdit;
DateTimePicker1: TDateTimePicker;DateTimePicker2: TDateTimePicker;
DateTimePicker3: TDateTimePicker;
CheckBox1: TCheckBox;CheckBox2: TCheckBox;CheckBox3: TCheckBox;
CheckBox4: TCheckBox;CheckBox5: TCheckBox;CheckBox6: TCheckBox;
CheckBox7: TCheckBox;CheckBox8: TCheckBox;CheckBox9: TCheckBox;
DBGrid1: TDBGrid;DBGrid2: TDBGrid;DBGrid3: TDBGrid;
DBGrid4: TDBGrid;DBGrid5: TDBGrid;
BitBtn1: TBitBtn; BitBtn2: TBitBtn; BitBtn3: TBitBtn; BitBtn4: TBitBtn;
BitBtn5: TBitBtn; BitBtn6: TBitBtn; BitBtn7: TBitBtn; BitBtn8: TBitBtn;
BitBtn9: TBitBtn; BitBtn10: TBitBtn;BitBtn11: TBitBtn;BitBtn12: TBitBtn;
BitBtn13: TBitBtn;BitBtn14: TBitBtn;BitBtn15: TBitBtn;BitBtn16: TBitBtn;
BitBtn17: TBitBtn;BitBtn18: TBitBtn;BitBtn19: TBitBtn;BitBtn20: TBitBtn;
BitBtn21: TBitBtn;BitBtn22: TBitBtn;BitBtn23: TBitBtn;BitBtn24: TBitBtn;
BitBtn25: TBitBtn;
DataSource1: TDataSource;DataSource2: TDataSource;
Table1: TTable;Table2: TTable;
62
Мирослав Илић
Мирослав Илић
63
Bevel1: TBevel;Bevel2: TBevel;Bevel3: TBevel;Bevel4: TBevel;
DBText1: TDBText; DBText2: TDBText; DBText3: TDBText; DBText4: TDBText;
DBText5: TDBText; DBText6: TDBText; DBText7: TDBText; DBText8: TDBText;
DBText9: TDBText; DBText10: TDBText;DBText11: TDBText;DBText12: TDBText;
DBNavigator1: TDBNavigator;
DBCheckBox1: TDBCheckBox;
RadioGroup1: TRadioGroup;RadioGroup2: TRadioGroup;
RadioGroup3: TRadioGroup;RadioGroup4: TRadioGroup;
RvProject1: TRvProject;RvProject2: TRvProject;
RvProject3: TRvProject;RvProject4: TRvProject;
RvDataSetConnection1: TRvDataSetConnection;
procedure N4Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure N33Click(Sender: TObject);
procedure N32Click(Sender: TObject);
procedure N31Click(Sender: TObject);
procedure Povratak(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure N13Click(Sender: TObject);
procedure Enter(Sender: TObject; var Key: Char);
procedure DBGrid1CellClick(Column: TColumn);
procedure DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure DBGrid1DblClick(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure N21Click(Sender: TObject);
procedure BitBtn14Click(Sender: TObject);
procedure N22Click(Sender: TObject);
procedure Izaberi(Sender: TObject);
procedure BitBtn11Click(Sender: TObject);
procedure BitBtn13Click(Sender: TObject);
procedure BitBtn9Click(Sender: TObject);
procedure N14Click(Sender: TObject);
procedure BitBtn16Click(Sender: TObject);
procedure RadioGroup3Click(Sender: TObject);
procedure BitBtn17Click(Sender: TObject);
procedure BitBtn18Click(Sender: TObject);
procedure BitBtn19Click(Sender: TObject);
procedure BitBtn20Click(Sender: TObject);
procedure BitBtn21Click(Sender: TObject);
procedure N152Click(Sender: TObject);
procedure N151Click(Sender: TObject);
procedure BitBtn23Click(Sender: TObject);
procedure BitBtn24Click(Sender: TObject);
procedure DBGrid5DblClick(Sender: TObject);
procedure Table1BeforeDelete(DataSet: TDataSet);
private
procedure Ispisi;
procedure Sacuvaj;
procedure Vrati;
public
{ Public declarations }
end;
var
Form1: TForm1;
bb1:boolean;
pan:integer;
implementation
{$R *.dfm}
// Kraj rada sa programom
procedure TForm1.N4Click(Sender: TObject);
begin Application.Terminate;
end;
Програмирање - први кораци
63
64
Програмирање - први кораци
// Prikazuje datum i vreme
procedure TForm1.Timer1Timer(Sender: TObject);
var d,t:string;
begin d:=FormatDateTime('DDDD, DD. MMMM YYYY.',date);
t:=FormatDateTime('hh:mm:ss',time);
StatusBar1.Panels[2].Text:=d+' '+t;
end;
// искључује системску поруку о брисању податка из датотеке
procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
begin //
end;
// Kontakt sa autorom programa
procedure TForm1.N33Click(Sender: TObject);
begin MessageBox(0,'ПРОГРАМСКИ ПАКЕТ АДРЕСАР'+#13+#13+
'Београд, 21.10.2012. године'+#13+
'® Мирослав Илић
© 2012.'+#13+#13+
'Контакт са аутором:'+#13+#13+
[email protected]'+#13+
[email protected]'+#13+
[email protected]'+#13+
[email protected]'+#13+#13+
'
тел. 011/777-88-99'+#13+#13,
'Аутор програма',MB_TASKMODAL+MB_ICONWARNING);
end;
// Opis svrhe programa
procedure TForm1.N32Click(Sender: TObject);
begin MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Програмски пакет за унос, ажурирање и брисање адреса'+#13+
'са могућношћу аутоматског слања честитки и штампањем'+#13+
'листе адреса, комплетних уписаних података о особи и'+#13+
'налепница за коверте за писма'+#13+#13+
'Version 1.0'+#13+
'Београд, 21.10.2012. године'+#13+#13,
'О програму',MB_TASKMODAL+MB_ICONASTERISK);
end;
// Otvara panel sa uputstvom za upotrebu programa
procedure TForm1.N31Click(Sender: TObject);
begin Panel1.Visible:=true;
Panel1.BringToFront;
bb1:=N1.Enabled;
N1.Enabled:=false;
N2.Enabled:=false;
end;
// Zatvara panel sa uputstvom za upotrebu programa
procedure TForm1.BitBtn1Click(Sender: TObject);
begin Panel1.Visible:=false;
N1.Enabled:=bb1;
N2.Enabled:=bb1;
end;
// Omogucava prelazak iz edita u edit pomocu tastera enter
procedure TForm1.Enter(Sender: TObject; var Key: Char);
var i:integer;
begin If key=#13 then
begin For i:=1 to 10 do
If sender=TEdit(FindComponent('Edit'+IntToStr(i)))
then TEdit(FindComponent('Edit'+IntToStr(i+1))).SetFocus;
If sender=Edit11 then DateTimePicker1.SetFocus;
end;
end;
// Zatvara sve panele i postavlja naslovnu stranu
procedure TForm1.Povratak(Sender: TObject);
begin Panel2.Visible:=false;
Panel3.Visible:=false;
Panel4.Visible:=false;
Panel5.Visible:=false;
Panel6.Visible:=false;
Arhiv.Visible:=false;
64
Мирослав Илић
Мирослав Илић
65
N1.Enabled:=true;
N2.Enabled:=true;
Table1.Filtered:=false;
StatusBar1.Panels[0].Text:='Насловна страница програма';
end;
// Otvara panel za upis podataka
procedure TForm1.N11Click(Sender: TObject);
begin Panel2.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
pan:=1;Ispisi;
StatusBar1.Panels[0].Text:='УНОС ПОДАТАКА';
end;
// Ispisuje polja tekuceg podatka datoteke
procedure TForm1.Ispisi;
var i:integer;
begin Case pan of
1 : begin DateTimePicker1.Date:=Table1.FieldByName('datumr').AsDateTime;
CheckBox1.Checked:=Table1.FieldByName('aktivan').AsBoolean;
end;
12 : begin DateTimePicker2.Date:=Table1.FieldByName('datumr').AsDateTime;
CheckBox2.Checked:=Table1.FieldByName('aktivan').AsBoolean;
end;
end;
For i:=0 to 10 do TEdit(FindComponent('Edit'+IntToStr(i+pan))).Text:=
Table1.Fields[i].AsString;
end;
// Ispisuje selektovani podatak
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin Ispisi;
end;
// Ispisuje podatak kada se pritisne strelica na gore ili na dole u gridu
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin Ispisi;
end;
// Omogucava ispravku podatka oznacenog dvoklikom u gridu
procedure TForm1.DBGrid1DblClick(Sender: TObject);
var i:integer;
begin For i:=1 to 11 do
TEdit(FindComponent('Edit'+IntToStr(i))).ReadOnly:=false;
Edit1.SetFocus;
end;
// Klik na taster Dodaj
procedure TForm1.BitBtn3Click(Sender: TObject);
var i:integer;
begin For i:=1 to 11 do
begin TEdit(FindComponent('Edit'+IntToStr(i))).ReadOnly:=false;
TEdit(FindComponent('Edit'+IntToStr(i))).Clear;
end;
DateTimePicker1.Date:=date;
CheckBox1.Checked:=true;
Table1.Append;
Edit1.SetFocus;
end;
// Klik na taster Zapamti
procedure TForm1.BitBtn4Click(Sender: TObject);
var i:integer;
begin Table1.Edit;
For i:=0 to 10 do
begin TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
Table1.Fields[i].AsString:=
TEdit(FindComponent('Edit'+IntToStr(i+pan))).Text;
end;
Case pan of
1:begin Table1.FieldByName('datumr').AsDateTime:=DateTimePicker1.Date;
Table1.FieldByName('aktivan').AsBoolean:=CheckBox1.Checked;
Програмирање - први кораци
65
66
Програмирање - први кораци
end;
2:begin Table1.FieldByName('datumr').AsDateTime:=DateTimePicker2.Date;
Table1.FieldByName('aktivan').AsBoolean:=CheckBox2.Checked;
end;
end;
Table1.Refresh;
end;
// Klik na taster Ponisti
procedure TForm1.BitBtn5Click(Sender: TObject);
var i:integer;
begin For i:=1 to 11 do
TEdit(FindComponent('Edit'+IntToStr(i))).ReadOnly:=true;
Table1.Refresh;
Ispisi;
end;
// Klik na taster Obrisi
procedure TForm1.BitBtn6Click(Sender: TObject);
begin If MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Извршењем ове команде брише се ПОДАТАК'+#13+
'у датотеци без могућности враћања !!!'+#13+
'Да ли сте ПОТПУНО СИГУРНИ да то желите?'+#13,
'ОБРАТИ ПАЖЊУ',MB_OKCancel+MB_TaskModal+MB_ICONError)=IDOK
then begin Table1.Delete;Table1.Refresh;
Ispisi;
end;
end;
// Otvara panel za pregled podataka
procedure TForm1.N12Click(Sender: TObject);
begin Panel3.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
(Table1.FieldByName('datumr') as TDateTimeField).DisplayFormat:='dd.MM.yyyy.';
StatusBar1.Panels[0].Text:='ПРЕГЛЕД ПОДАТАКА';
RadioGroup1.ItemIndex:=-1;
end;
// Definise filter po aktivnosti podataka
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin Table1.Filtered:=false;
Case RadioGroup1.ItemIndex of
0 : Table1.Filter:='aktivan=true';
1 : Table1.Filter:='aktivan=false';
2 : Table1.Filter:='(aktivan=true)or(aktivan=false)';
end;
Table1.Filtered:=true;
end;
// Otvara panel za pretrazivanje
procedure TForm1.N13Click(Sender: TObject);
var i:integer;
begin Panel4.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
pan:=12;
For i:=0 to 10 do
begin TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
TEdit(FindComponent('Edit'+IntToStr(i+pan))).Clear;
end;
For i:=3 to 9 do
TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Checked:=false;
StatusBar1.Panels[0].Text:='ПРЕТРАЖИВАЊЕ';
end;
// Otvara panel za arhiviranje podataka
procedure TForm1.N21Click(Sender: TObject);
begin Arhiv.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
Label44.Caption:='Архивирање података';
66
Мирослав Илић
Мирослав Илић
67
BitBtn14.Caption:='Архивирај';
StatusBar1.Panels[0].Text:='АРХИВИРАЊЕ ПОДАТАКА';
Arhiva.SetFocus;
end;
// Otvara panel za restauraciju podataka
procedure TForm1.N22Click(Sender: TObject);
begin Arhiv.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
Label44.Caption:='Враћање података из архиве';
BitBtn14.Caption:='Врати';
StatusBar1.Panels[0].Text:='АРХИВИРАЊЕ ПОДАТАКА';
Arhiva.SetFocus;
end;
// Klik na taster Arhiviraj/Vrati
procedure TForm1.BitBtn14Click(Sender: TObject);
begin If BitBtn14.Caption='Архивирај'
then Sacuvaj
else Vrati;
end;
// Arhivira podatke na fles ili harddisk
procedure TForm1.Sacuvaj;
var d,f,v:int64;
gde,disk:string;
new,old:TFileStream;
const s:array[1..2] of string=('\Adresar.dbf','\Adresar.mdx');
begin If Length(Arhiva.Text)<1
then begin ShowMessage('Морате уписати ознаку уређаја!');
Arhiva.SetFocus;
end
else begin Table1.Active:=false;
d:=Ord(Arhiva.Text[1])-64;
f:=DiskFree(d);
gde:=Arhiva.Text+':\AdresarArhiva';
GetDir(0,disk);
old:=TFileStream.Create(disk+s[1],fmOpenRead);
New:=TFileStream.Create(disk+s[2],fmOpenRead);
v:=Old.Size+New.Size;
FreeAndNil(Old);FreeAndNil(New);
Table1.Active:=true;
If f=-1
then begin ShowMessage('Погрешна ознака уређаја!');
Arhiva.SetFocus;
end
else If f<v
then begin ShowMessage('Нема довољно простора на уређају!'
+#13+'Потребно је '+IntToStr(v)+'b');
Arhiva.SetFocus;
end
else begin Table1.Active:=true;
If not DirectoryExists(gde) then MkDir(gde);
old:=TFileStream.Create(disk+s[1],fmOpenRead);
try new:=TFileStream.Create(gde+s[1],fmCreate);
try new.CopyFrom(old,old.Size);
finally FreeAndNil(new);
end;
finally FreeAndNil(old);
end;
old:=TFileStream.Create(disk+s[2],fmOpenRead);
try new:=TFileStream.Create(gde+s[2],fmCreate);
try new.CopyFrom(old,old.Size);
finally FreeAndNil(new);
end;
finally FreeAndNil(old);
end;
ShowMessage('Архивирање података је завршено!');
Arhiv.Visible:=false;
N1.Enabled:=true;
Програмирање - први кораци
67
68
Програмирање - први кораци
N2.Enabled:=true;
StatusBar1.Panels[0].Text:='Насловна страница програма';
Table1.Active:=true;
end;
end;
end;
// Vraca podatke sa flesa ili harddiska
procedure TForm1.Vrati;
var gde,disk:string;
new,old:TFileStream;
const s:array[1..2] of string=('\Adresar.dbf','\Adresar.mdx');
begin If Length(Arhiva.Text)<1
then begin ShowMessage('Морате уписати ознаку уређаја!');
Arhiva.SetFocus;
end
else begin gde:=Arhiva.Text+':\AdresarArhiva';
GetDir(0,disk);
If not DirectoryExists(gde)
then begin ShowMessage('Нема архиве. Погрешан уређај!');
Arhiva.SetFocus;
end
else begin Table1.Active:=false;
old:=TFileStream.Create(gde+s[1],fmOpenRead);
try new:=TFileStream.Create(disk+s[1],fmCreate);
try new.CopyFrom(old,old.Size);
finally FreeAndNil(new);
end;
finally FreeAndNil(old);
end;
old:=TFileStream.Create(gde+s[2],fmOpenRead);
try new:=TFileStream.Create(disk+s[2],fmCreate);
try new.CopyFrom(old,old.Size);
finally FreeAndNil(new);
end;
finally FreeAndNil(old);
end;
ShowMessage('Рестаурација података је завршена!');
Table1.Active:=true;
Arhiv.Visible:=false;
N1.Enabled:=true;N2.Enabled:=true;
StatusBar1.Panels[0].Text:='Насловна страница програма';
end;
end;
end;
// Prazni edit pored cekboksa koji se cekira
procedure TForm1.Izaberi(Sender: TObject);
const ed:array[3..8] of integer=(12,13,14,16,18,21);
var i:integer;
begin For i:=3 to 8 do
If sender=TCheckBox(FindComponent('CheckBox'+IntToStr(i)))
then begin TEdit(FindComponent('Edit'+IntToStr(ed[i]))).Clear;
TEdit(FindComponent('Edit'+IntToStr(ed[i]))).ReadOnly:=
not TEdit(FindComponent('Edit'+IntToStr(ed[i]))).ReadOnly;
TEdit(FindComponent('Edit'+IntToStr(ed[i]))).SetFocus;
end;
end;
// Kada kliknemo na ponisti uklanjamo filter
procedure TForm1.BitBtn11Click(Sender: TObject);
var i:integer;
begin Table1.Filtered:=false;
Table1.First;
For i:=0 to 10 do
begin TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
TEdit(FindComponent('Edit'+IntToStr(i+pan))).Clear;
end;
For i:=3 to 9 do
TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Checked:=false;
end;
68
Мирослав Илић
Мирослав Илић
69
// Dozvoljava upis u edite
procedure TForm1.BitBtn13Click(Sender: TObject);
var i:integer;
begin For i:=0 to 10 do
TEdit(FindComponent('Edit'+IntToStr(i+pan))).ReadOnly:=true;
Edit12.SetFocus;
end;
// Postavlja filter
procedure TForm1.BitBtn9Click(Sender: TObject);
const ed:array[3..8] of integer=(12,13,14,16,18,21);
var a,b:string;
i:integer;
begin a:='';
For i:=3 to 8 do
If TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Checked
then begin
b:=TEdit(FindComponent('Edit'+IntToStr(ed[i]))).Text+'*'')';
If Length(b)>2
then If Length(a)>0
then
a:=a+'and('+Table1.Fields[ed[i]-12].FieldName+'='''+b
else a:='('+Table1.Fields[ed[i]-12].FieldName+'='''+b;
end;
If CheckBox9.Checked
then begin b:='(datumr='''+DateToStr(DateTimePicker2.Date)+''')';
If Length(a)>0
then a:=a+'and'+b
else a:=b;
end;
If Length(a)>0
then begin Table1.Filtered:=false;
Table1.Filter:=a;
Table1.Filtered:=true;
end;
end;
// otvara panel za stampanje
procedure TForm1.N14Click(Sender: TObject);
begin Panel5.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
Table2.Active:=false;
Table2.EmptyTable;
Table2.Active:=true;
RadioGroup2.ItemIndex:=2;
RadioGroup3.ItemIndex:=2;
StatusBar1.Panels[0].Text:='ШТАМПАЊЕ ПОДАТАКА';
end;
// Klik na taster pronadji formira datoteku izvestaja
procedure TForm1.BitBtn16Click(Sender: TObject);
var a:string;
i,d,m:integer;
begin d:=0;m:=0;
Table2.Active:=false;
Table2.EmptyTable;
Table2.Active:=true;
Table2.Refresh;
Table1.Filtered:=false;
Case RadioGroup2.ItemIndex of
0 : a:='(aktivan=true)';
1 : a:='(aktivan=false)';
2 : a:='((aktivan=true)or(aktivan<>true))';
end;
Case RadioGroup3.ItemIndex of
0 : a:=a+'and(prezime='+QuotedStr(Edit23.Text)+')';
1 : a:=a+'and(ime='+QuotedStr(Edit24.Text)+')';
2 : begin d:=DayOf(DateTimePicker3.Date);m:=MonthOf(DateTimePicker3.Date);
end;
end;
Програмирање - први кораци
69
70
Програмирање - први кораци
Table1.Filter:=a;
Table1.Filtered:=true;
Table1.First;
If RadioGroup3.ItemIndex<2
then While not Table1.Eof do
begin Table2.Append;Table2.Edit;
For i:=0 to 11 do
Table2.Fields[i]:=Table1.Fields[i];
Table1.Next;
end
else While not Table1.Eof do
begin If (DayOf(Table1.FieldByName('datumr').AsDateTime)=d)and
(MonthOf(Table1.FieldByName('datumr').AsDateTime)=m)
then begin Table2.Append;Table2.Edit;
For i:=0 to 11 do
Table2.Fields[i]:=Table1.Fields[i];
end;
Table1.Next;
end;
Table2.Refresh;Table2.First;
end;
// Menja polje za pretrazivanje podataka
procedure TForm1.RadioGroup3Click(Sender: TObject);
var n:integer;
begin Edit23.ReadOnly:=true;Edit23.Clear;
Edit24.ReadOnly:=true;Edit24.Clear;
n:=RadioGroup3.ItemIndex+23;
If n<25
then begin TEdit(FindComponent('Edit'+IntToStr(n))).ReadOnly:=false;
TEdit(FindComponent('Edit'+IntToStr(n))).SetFocus;
end
else DateTimePicker3.SetFocus;
end;
// Штампање свих података из активног слога
procedure TForm1.BitBtn17Click(Sender: TObject);
var dat:System.Text;
begin AssignPrn(dat);ReWrite(dat);
Printer.Canvas.Font.Name:='Courier New';
Printer.Canvas.Font.Size:=13;
Printer.Canvas.Font.Style:=[];
Write(dat,'Презиме
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[0].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Име
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[1].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Улица
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[2].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Број
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[3].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Поштански број
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[4].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Место
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[5].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Држава
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[6].AsString);
Printer.Canvas.Font.Style:=[];
70
Мирослав Илић
Мирослав Илић
71
Write(dat,'Електронска адреса : ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[7].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Број телефона
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[8].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Мобилни телефон
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[9].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Датум рођења
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[10].AsString);
Printer.Canvas.Font.Style:=[];
Write(dat,'Хороскопски знак
: ');
Printer.Canvas.Font.Style:=[fsBold];
WriteLn(dat,Table1.Fields[11].AsString);
CloseFile(dat);
end;
// Stampanje koverte sa adresom
procedure TForm1.BitBtn18Click(Sender: TObject);
begin RvProject1.Execute;
end;
// Stampanje koverti sa adresama
procedure TForm1.BitBtn19Click(Sender: TObject);
begin RvProject2.Execute;
end;
// Stampanje nalepnica za koverte
procedure TForm1.BitBtn20Click(Sender: TObject);
begin RvProject3.Execute;
end;
// Stampanje svih podataka iz adresara
procedure TForm1.BitBtn21Click(Sender: TObject);
begin RvProject4.Execute;
end;
// Brisanje svih podataka iz adresara
procedure TForm1.N152Click(Sender: TObject);
begin If MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Извршењем ове команде бришу се СВИ ПОДАЦИ'+#13+
'у датотеци без могућности враћања !!!'+#13+
'Да ли сте ПОТПУНО СИГУРНИ да то желите?'+#13,
'ОБРАТИ ПАЖЊУ',MB_OKCancel+MB_TaskModal+MB_ICONError)=IDOK
then begin Table1.Active:=false;
Table1.EmptyTable;
Table1.Active:=true;
Table1.Refresh;
end;
end;
// Otvara panel za brisanje podataka
procedure TForm1.N151Click(Sender: TObject);
begin Panel6.Visible:=true;
N1.Enabled:=false;
N2.Enabled:=false;
RadioGroup4.ItemIndex:=2;
Table1.Filtered:=false;
Table1.Filter:='prezime=0';
Table1.Filtered:=true;
StatusBar1.Panels[0].Text:='ШТАМПАЊЕ ПОДАТАКА';
end;
// Postavlja filter za izbor podataka za brisanje
procedure TForm1.BitBtn23Click(Sender: TObject);
var a:string;
begin Table1.Filtered:=false;
Case RadioGroup4.ItemIndex of
0 : a:='(aktivan=true)';
Програмирање - први кораци
71
72
Програмирање - први кораци
1 : a:='(aktivan=false)';
2 : a:='((aktivan=true)or(aktivan=false))';
end;
If Length(Edit25.Text)>0 then
a:=a+'and(prezime='+QuotedStr(Edit25.Text+'*')+')';
If Length(Edit26.Text)>0 then
a:=a+'and(ime='+QuotedStr(Edit26.Text+'*')+')';
Table1.Filter:=a;
Table1.Filtered:=true;
Table1.First;
end;
// Brise izabrane podatke klikom na Obrisi
procedure TForm1.BitBtn24Click(Sender: TObject);
begin If MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Извршењем ове команде бришу се ПОДАЦИ'+#13+
'у датотеци без могућности враћања !!!'+#13+
'Да ли сте ПОТПУНО СИГУРНИ да то желите?'+#13,
'ОБРАТИ ПАЖЊУ',MB_OKCancel+MB_TaskModal+MB_ICONError)=IDOK
then begin Table1.First;
While not Table1.Eof do
begin Table1.Delete;
end;
Table1.Refresh;
Edit25.Clear;Edit26.Clear;
Edit25.SetFocus;
end;
end;
// Brise selektovani podatak dvoklikom na grid
procedure TForm1.DBGrid5DblClick(Sender: TObject);
begin If MessageBox(0,'ПРОГРАМ АДРЕСАР'+#13+#13+
'Извршењем ове команде брише се ПОДАТАК'+#13+
'у датотеци без могућности враћања !!!'+#13+
'Да ли сте ПОТПУНО СИГУРНИ да то желите?'+#13,
'ОБРАТИ ПАЖЊУ',MB_OKCancel+MB_TaskModal+MB_ICONError)=IDOK
then begin Table1.Delete;Table1.Refresh;
end;
end;
end.
72
Мирослав Илић
Download

Пример једноставне базе података