Pridanie prvku do databázy/štruktúry.
Pridanie prvku do štruktúry a jeho okamžité zapísanie do súboru, to je cieľ funkcie, ktorá má toto na starosti. Prvý krok k tomu bude vytvorenie druhého formuláru. Druhý formulár sa bude používať na vstup údajov, vkladania nového prvku do databázy. Druhy formulár bude obsahovať 5 komponentov – LabeledEdit a jeden komponent Button. Označenia týchto komponentov budú meno, priezvisko, adresa, číslo ulice a ID číslo.
Hlavná zmena, ktorá sa uskutoční v súbore Unit1.cpp – zdrojový kód patriaci k formulári 1 je , že načítanie nebude súčasťou kódu, ale vytvoríme ho ako funkciu pre opätovné použitie aj v iných formulároch. Postup je veľmi jednoduchý, funkciu nazveme nacitaj. Deklarácia funkcie bude vyzerať takto:
void nacitaj(void)
Void by sa dalo v chápaní programovacieho jazyka preložiť ako – nič, nula, prázdne.
1. Funkcia nevracia žiadnu hodnotu, to nám vraví prvé označenie void.
2. Druhé void nám vraví, že funkcia nebude obsahovať žiadne premenné definované v jej mene.
Do tela funkcie sa presunie nasledujúci blok kódu:
void nacitaj(void)
{
int b,h,k;
i = 1;
pole = new ZOZNAM[10000];
pom = new char[1000];
f = fopen(nazov_suboru.c_str(), "r");
if(f == NULL){
Application->MessageBox("Cannot open a file!", "Error", MB_OK +
MB_ICONERROR);
}
else{
while(k != EOF){
fscanf(f,"%s", ((pole + i)->meno));
fscanf(f,"%s", ((pole + i)->priezvisko));
fscanf(f,"%s", ((pole + i)->adresa));
fscanf(f,"%d", &((pole + i)->suma));
fscanf(f,"%d", &((pole + i)->idcislo));
k = fgetc(f);
i++;
}
}
Form1->strgridOpen->RowCount = i;
q = i;
if(fclose(f) == EOF){
Application->MessageBox("Cannot close a file!", "Error", MB_OK +
MB_ICONERROR);
}
Form1->strgridOpen->Cells[0][0] = "Meno";
Form1->strgridOpen->Cells[1][0] = "Priezvisko";
Form1->strgridOpen->Cells[2][0] = "Ulica";
Form1->strgridOpen->Cells[3][0] = "Číslo ulice";
Form1->strgridOpen->Cells[4][0] = "ID číslo";
for(b = 1; b < i; b++){
sprintf(pom, " %s", (pole + b)->meno);
Form1->strgridOpen->Cells[0][b] = pom;
sprintf(pom, " %s", (pole + b)->priezvisko);
Form1->strgridOpen->Cells[1][b] = pom;
sprintf(pom, " %s", (pole + b)->adresa);
Form1->strgridOpen->Cells[2][b] = pom;
sprintf(pom, " %d", (pole + b)->suma);
Form1->strgridOpen->Cells[3][b] = pom;
sprintf(pom, " %d", (pole + b)->idcislo);
Form1->strgridOpen->Cells[4][b] = pom;
}
}
Po tomto kroku nahradí tento kód v bloku, ktorý sa spúšťa pri kliknutí na otvorenie súboru jednoduché zavolanie funkcie – nacitaj(). Ďalej je nutné zapísať tzv. funkčný prototyp do súboru Unit1.h. C++ Builder poskytuje pohodlný prístup aj k týmto súborom, pretože ich máte automaticky otvorené v dolnej lište.

Deklaráciu umiestnime tesne pred deklaráciu triedy TForm1.
Stačí napísať riadok void nacitaj(void); sem.....
.......
#include <Grids.hpp>
#include <Menus.hpp>
//---------------------------------------------------
void nacitaj(void);
class TForm1 : public TForm
{
.......
Začneme pracovať s formulárov číslo 2. Prvou fázou je prepojenie s formulárom číslo 1. Aby Form2 „poznal“ komponenty a funkcie z Form1, použijeme dômyselnú funkciu, ktorá je ukrytá v položke menu – File. Je to Include Unit Hdr... a zabezpečí, že do hornej deklarácie pribudne riadok #include "Unit1.h"
Ďalšia fáza je použiť parameter extern, ktorý povie programu, že budeme používať externé globálne premenné z Unit1. Externé premenné môžu byť jedine globálne premenné. Externé premenné, ktoré budeme deklarovať vo Form2 sú:
........
#pragma resource "*.dfm"
TForm2 *Form2;
extern char *pom; //pomocné pole znakov
extern FILE *f; //pointer typu FILE na otváranie súboru
extern i,q; //externé číselné premenné
extern AnsiString nazov_suboru; //premenná obsahujúca cestu a názov
//----------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
..........
Poslednou fázou je hlavná funkcia tohto formuláru.
1. Najprv je nutné otvoriť súbor pre zapisovanie na koniec.
f = fopen(nazov_suboru.c_str(), "a");
2. Potom skopírovať obsah jednotlivých komponentov LabeledEdit do pomocného poľa pom a následné vypísanie do súboru.
strcpy(pom, Form2->LabeledEdit1->Text.c_str());
fprintf(f,"n%s ",pom);
To je vlastne všetko, čo potrebujeme a celá funkcia vyzerá takto:
void __fastcall TForm2::Button1Click(TObject *Sender)
{
f = fopen(nazov_suboru.c_str(), "a");
strcpy(pom, Form2->LabeledEdit1->Text.c_str());
fprintf(f,"n%s ",pom); //v prvom výpise použijeme znak n, aby
//sa začínalo v novom riadku vypisovať,
//medzera medzi s a “ znamená, že aj pri
//zapisovaní bude za výpisom medzera preto
//aby položky nesplynuli do jedného slova
strcpy(pom, Form2->LabeledEdit2->Text.c_str());
fprintf(f,"%s ",pom);
strcpy(pom, Form2->LabeledEdit3->Text.c_str());
fprintf(f,"%s ",pom);
strcpy(pom, Form2->LabeledEdit4->Text.c_str());
fprintf(f,"%s ",pom);
strcpy(pom, Form2->LabeledEdit5->Text.c_str());
fprintf(f,"%s",pom);
fclose(f); //uzatvorenie súboru
nacitaj(); //volanie funkcie, ktorá obsahuje výpis aj načítanie
Odstránenie prvku z databázy/štruktúry:
Odstraňovanie prvku budeme robiť sofistikovane a pritom nesmierne jednoducho. Proces bude spočívať v tom, že pri vypisovaní prvkov sa bude súčasne overovať či nejdeme vypísať práve ten, ktorý chceme zmazať. Ak sa k nemu dostaneme tak ho vo vypisovaní jednoducho preskočíme.
Vytvoríme si nový formulár – Form3. Tento formulár bude vyzerať veľmi jednoducho a stroho, bude obsahovať iba jeden komponent LabeledEdit a jeden Button, ktorý bude spúšťať proces vymazania.
Pre porovnávanie prvok budeme používať príkaz strcmp – String Compare. Obe tieto funkcie majú len pár riadkov a ťažko sa vysvetľuje ich podstata, ale jeden pohľad na ne vám oveľa viac osvetlí ich význam.
Funkcia strcmp porovnáva dva reťazce a vracia hodnotu 0 ak sa reťazce zhodujú a ak nie vracia inú hodnotu. Použitie v praxi vyzerá takto, pom a por reprezentujú polia znakov:
if(strcmp(pom,por) == 0){
ShowMessage(“reťazce sú zhodné”);
}
V súbore Unit3 je nutné okrem všetkých extern príkazov ako to bolo v Unit2, ešte pridať deklaráciu štruktúry podobne, ako je to v súbore Unit1. Funkcia vlastne prepisuje celý súbor a vynechá prvok, ktorý sme označili ako ten, ktorý chceme vymazať.
Celá funkcia na vymazanie prvku bude vyzerať takto:
void __fastcall TForm3::Button1Click(TObject *Sender)
{
FILE *fw;
int m;
char por[500];
strcpy(por,Form3->LabeledEdit1->Text.c_str());
fw = fopen(nazov_suboru.c_str(), "w");
for(m = 1; m < i; m++){
if(strcmp(por,(pole + m)->priezvisko) == 0){
}
else{
fprintf(fw,"n% s ",(pole + m)->meno);
fprintf(fw,"% s ",(pole + m)->priezvisko);
fprintf(fw,"% s ",(pole + m)->adresa);
fprintf(fw,"% d ",(pole + m)->suma);
fprintf(fw,"% d",(pole + m)->idcislo);
}
}
fclose(fw);
nacitaj();
}
Celý program si môžete stiahnuť.
V budúcom dieli si povieme viac o funkciách a práci so súbormi, ktoré sú rýdzo C++. Tieto funkcie, ktoré sme si ukázali sa volajú stará metóda preto, lebo vychádzajú z klasického C jazyka. Existujú však metódy práce so súbormi, ktoré využívajú čisto funkcie iba z C++.