IT NEWS PC REVUE PC FORUMInternet time: @530
Obsah fóra
Pravidlá  •  Kontakt  •  Prihlásenie  •  Registrácia

Bezpečnosť výrobkov

Požiadavky chemickej legislatívy Podmienky vstupu na trh Európskej Únie www.ekotox.sk

inhodinky.sk, hodinky pre Vás

Excelentné hodinky, excelentné ceny Širkoký výber značkových hodiniek www.inhodinky.sk

Hodinky - zásielkový predaj

Už o 2 dni môžete mať hodinky na Vašej ruke! CASIO, SEIKO, LORUS, 4YOU. www.casallia.sk

Štýlové hodinky za super ceny

Veľký výber hodiniek za super ceny. Všetko skladom, odosielame do 24 hod. www.redstone.sk

.cz doména za 9,95 EUR

Top cena na trhu a k tomu webvizitka zdarma! www.webglobe.sk

Triedy a práca s nimi

Zaslať odpoveď
AutorSpráva
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Po 09.08.10 15:33Odpovedať s citátomNávrat hore

Ahoj, veľa o triedach (TClass) neviem, možno je moja predstava o triedach nesprávna, ale pracujem na jednom projekte, ktorý vkuse pracuje s MySQL, v ktorej sú uložené informácie o používateľoch, zmluvách, faktúrach, produktoch, platbách atď.

Ide o to, že tam mám väčšie množstvo funkcií... sú funkcie pre:
Používateľov:
- vytvorenie používateľa
- vymazanie používateľa
- editáciu

Faktúry:
- vytvorenie faktúry
- tlač faktúry

atď.

Od tried očakávam, že mi v tomto spravia poriadok a funkcie (resp. metódy) mi zoskupia pod svoje krídlo, takže k nim budem môcť pristupovať napr. cez:
kód:
User.Add('Jozef', 'Mocný'); // vytvori usera
Invoice.Create(17); // vytvori fakturu pre usera s idckom 17

Dá sa to? Je to vôbec možné?
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 909

PríspevokZaslal: Po 09.08.10 16:12Odpovedať s citátomNávrat hore

Nielenže sa to dá, ale na to sú triedy určené. To je vlastne cieľ objektovo orientovaných jazykov - neprogramovať procedurálne, ale pomocou tried, teda objektovo.
Vytvoríš si triedu, ktorá bude mať konšruktor (deštruktor) a členské funkcie. Členské funkcie sú prístupné iba pre objekty danej triedy.
Ďalej môžeš využívať dedenie, tzn, že máš rodičovskú triedu, ktorá má spoločné časti pre používateľov aj pre faktúry a z nej potom vytvoríš ďalšie triedy s pridanými vlastnosťami od rodičosvskej.

Prečítaj si základy o OOP v delphi, aby si sa trocha do toho dostal a potom ak budeš mať nejaký konkrétny problém vo svojom programe, tak sa spýtaj. Pozri sa napríklad sem, ako vytvoriť triedu.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Pi 20.08.10 12:57Odpovedať s citátomNávrat hore

No buď to nefunguje ako chcem (málo pravdepodobné) alebo som blbý (takmer isté). V každom prípade, čo čítam je nutné vytovoriť objekt (instanciu) danej triedy. Mne ide však o to, aby som nič vytvárať nemusel a jednoducho len napísal:
Faktura.Vytvor('baf');
a funckia Vytvor triedy Faktura to urobí. Čiže ja od toho očakávam niečo na štýl zgrupených funkcií, lebo teoreticky by to šlo spraviť cez funkcie:

Faktura_Vytvor(bla bla);
Faktura_Edituj(nieco);

Ale ak to chápem správne, tak classy (triedy) umožňujú navyše vytvorenie prepojenia medzi metódami triedy. Čiže napr. si budú môcť zdieľať hodnoty premenných atď. Len furt neviem či to chápem dobre :/
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
coldak
Skúsený užívateľ
Skúsený užívateľ

Založený: 29.10.2008
Príspevky: 927

PríspevokZaslal: Pi 20.08.10 13:31Odpovedať s citátomNávrat hore

asi myslis class metody tried , ale najprv si to poriadne nastuduj
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 909

PríspevokZaslal: Pi 20.08.10 13:41Odpovedať s citátomNávrat hore

V prvom rade si musíš uvedomiť, ako funguje trieda a ako s nimi pracovať. Pokúsim sa ti to vysvetliť na nejakom príklade:
Predstav si triedu auto. Táto trieda má určité prvky, vlastnosti, podľa ktorých ju dokážeme rozlíšiť, identifikovať ju, pracovať s ňou. Každé auto má napríklad štyri kolesá, volant, karosériu atď. To všetko daná trieda obsahuje. Z tejto triedy (auto) môžme vytvoriť inštancie, napríklad zelené auto, modré auto, atď. Všetky inštancie triedy auto majú všetky vlastnosti tejto triedy, ale pritom jedna inštancia nezasahuje do tej druhej. Tzn v tvojom prípade - môžeš si vytvoriť ľubovoľný počet inštancií na triedu Faktura, kde každá môže obsahovať iné dáta. Teraz vytvorenie triedy:

Ak chceš vytvoriť triedu, tak to musíš spraviť pomocou konštruktoru danej triedy, ktorý si môžeš sám napísať. V tvojom prípade do tohto konštruktoru môžeš vložiť celé telo funkcie Vytvor. Konštruktor vyzerá takto:
kód:
constructor TFaktura.Vytvor( nieco: integer );
begin

    // sem pride inicializacia a podobne

end;

Potom si možeš vytvoriť trebárs dve faktúry:
kód:
var
  faktura1, faktura2: TFaktura;
begin

  faktura1 := TFaktura.Vytvor( 100 );
  faktura2 := TFaktura.Vytvor( 500 );

end;

Prepojenie si mal na mysli zrejme niečo také, že faktura1 má nejaký údaj, ktorý chceš spracovať aj vo faktura2. Ak áno, to je samozrejme možné. Proste v tride TFaktura vytvoríš funkciu, ktorá bude brať ako parameter objekt triedy TFaktura. Napríklad:
kód:
procedure TFaktura.ZdielajData( inaFaktura: TFaktura );
begin

  meno := inaFaktura.meno;

end;


Neviem, či som odpovedal na všetky otázky a či dostatočne výstižne, v každom prípade sa opýtaj, ak ešte niečo robí problém.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Po 23.08.10 13:44Odpovedať s citátomNávrat hore

Fico, díky za vyčerpávajúcu odpoveď, veľmi mi ujasnila situáciu Podľa všetkého teda vždy musím vytvoriť inštanciu, ak chcem využiť triedu, správne?

Predstavme si inú modelovú situáciu... máme tabuľku používateľov. Aj používateľa by sme mohli využiť ako triedu, nakoľko aj on má nejaké vlastnosti objektov na sebe nezávislé (meno, priezvisko, login, heslo, email).

S používateľom potrebujeme robiť nasledovné veci:
kód:
TUser.Create(name, surname, login, pass, email: string);
TUser.Update(id: string; name, surname, login, pass, email: string);
TUser.Delete(id: string);


Pracujeme s MySQL - po zavolaní funkcie TUser.Create(...); sa skontroluje či sme vyplnili údaje a či sa už používateľ v DB nenachádza. Ak je všetko OK, vytvoríme ho cez SQL INSERT a tým funkcia končí.

Obdobne sú na tom zvyšné dve funkcie, SQL UPDATE a SQL DELETE.
Je teda aj v tomto prípade nutné vytvárať inštancie? Alebo je možné len nejak zavolať:
kód:
TUser.Create('Jozef', 'Mocný', 'jozo_power', 'power_jozef', 'jozef@mocny.sk');
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 909

PríspevokZaslal: Po 23.08.10 14:15Odpovedať s citátomNávrat hore

Manny napísal:
vždy musím vytvoriť inštanciu, ak chcem využiť triedu, správne?
Správne.

Neviem, či som pochopil správne otázku, tak sa teda spýtam: Potrebuješ vytvoriť inštanciu objektu TUser až po tom, čo si overiš, či sa už nachádzajú informácie o danom userovi v databáze? Ak áno, tak myslím, že je zbytočne na každého usera vytvárať triedu, keďže s userom ako takým sa nenarába, pracuje sa len s jeho údajmi v databáze. Vytvoril by som skôr len jednu triedu, napr TDatabaza, pomocou ktorej by si vytváral, menil a mazal dáta z danej databázy. Príklad:

kód:
TDatabaza = class
  private:
    // tuna pridu clenske premenne, ktore budeš potrebovať pre danu triedu
  public
    constructor Create( nejaka_inicializacia: integer );    // vytvorenie triedy, inicializacia clenskych premennych, atd
    destructor Destroy; override;   // zrusenie triedy, sem sa zvykne davat uvolnovanie datovych typov, dealokacia pamate, atd
    function existujeTentoUser( meno: string ): boolean;   // funkcia vrati true ak existuje, inak false
    procedure pridajUsera( meno: string );     // prida usera do databazy
    procedure odstranUsera( meno: string );    // odstrani usera z databazy
// a tak podobne, podla toho, co potrebujes
end;


Toto je iba malý príklad, ako som to mal na mysli. Proste bolo by zbytočné mať tam X inštancií na TUser, keď to nie je nutné (za predpokladu, že užívateľov iba pridávaš, edituješ a odoberáš z databázy). Keď som ale zle pochopil otázke, tak ma oprav.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
coldak
Skúsený užívateľ
Skúsený užívateľ

Založený: 29.10.2008
Príspevky: 927

PríspevokZaslal: Po 23.08.10 18:34Odpovedať s citátomNávrat hore

Manny napísal:
Fico, díky za vyčerpávajúcu odpoveď, veľmi mi ujasnila situáciu Podľa všetkého teda vždy musím vytvoriť inštanciu, ak chcem využiť triedu, správne?


Nie, pokial chces triedu vyuzit iba ako balik metod tak nemusis vytvarat instanciu. Ide o obdobu statickych metod v JAVE

kód:

program Project4;

{$APPTYPE CONSOLE}

uses
  SysUtils,Dialogs;
type
  TUser = class
  public
    class procedure Create(name, surname, login, pass, email: string);
  end;

  var tt: string;

  class procedure TUser.Create(name, surname, login, pass, email: string);
  begin
    showmessage('name : '+name+chr(10)+'surname : '+surname );
  end;

begin
    TUser.Create('Istvan','Sandokan','','','');
    read(tt);
end.
Zobraziť informácie o autoroviOdoslať súkromnú správu
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Ut 24.08.10 10:43Odpovedať s citátomNávrat hore

Statické triedy, to je ono! Díky moc coldak
Fico, aj ty si mi teraz veľmi pomohol, tie praktické príklady sú najjednoduchším vysvetlením funkcionalít tried (spolu s ovocím na http://www.delphibasics.co.uk/RTL.asp?Name=Class). Teraz je mi jasné, že to môžem riešiť buď dynamickou (pomenoval som to správne?) triedou zameranú na databázu, ktorá bude obsahovať metódy na prácu s užívateľmi alebo to spraviť cez statickú triedu.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Zobraziť príspevky z predchádzajúcich:    
Zaslať odpoveď
Nemôžete pridávať nové témy do tohto fóra.
Nemôžete odpovedať na témy v tomto fóre.
Nemôžete upravovať svoje príspevky v tomto fóre.
Nemôžete mazať svoje príspevky v tomto fóre.
Nemôžete hlasovať v tomto fóre.

Powered by phpBB 2.x.x © 2005 - 2012 PCforum, webhosting by WebSupport, edited by JanoF