Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Vidljivost property-a

[es] :: Pascal / Delphi / Kylix :: Vidljivost property-a

[ Pregleda: 2574 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Vidljivost property-a27.01.2010. u 22:23 - pre 173 meseci
Kako napraviti da se iz klase, u programu koji definira objekt te klase vide samo željeni property?
Ovo je ukratko, a o čemu se rad:
Radim ispis na matrični štampać preko:
Code:

AssignFile(fPrinter, 'LPT1');
WriteLn(fPrinter, 'Neki tekst...');


Kreirao sam klasu tLPTPrinter u kojoj definiram sve što mi treba... komande kodove itd.

Klas tLPTPrinter sadrži klasu CommandCode u kojoj su svi potrebni kodovi definirani kao string-ovi, a pristupa im se preko property-y

Code:

   tComandCode = class
      private
         fReset: string;
         fPaperLength: string;
         ...
      public
         property Reset: string read fReset write fReset;
         property PaperLength: string read fPaperLength write fPaperLength;
         ...
   end;

   tLPTPrinter= class
       ...
      fCommandCode: tCommandCode;
   public
       property CommandCode: tCommandCode read fCommandCode write fCommandCode;
   end;


U konstruktoru tLPTPrinter klase kreiram objekt fCommandCode i dodjeljujem mu inicijalne vrijednosti.

Kako postići da se u programu kada se napiše:
MyPrinter.CommandCode. (MyPrinter je objekt tipa tLPTPrinter.)
vide samo definirani property-i (u ovom slučaju: Reset i PaperLength)?
Sada, ovako kako je napisano, nudi puno toga, a što se siguno ne treba (i ne smije) pozivati iz programa.

Da li CommandCode definirati nekako drugačije, a ne kao klasu?

Želio bih da mi u programu setiranje komandih kodova ostane na način npr:
MyPrinter.CommandCode.Reset := #27 + #64;
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Vidljivost property-a28.01.2010. u 11:08 - pre 173 meseci
> Kako postići da se u programu kada se napiše:
> MyPrinter.CommandCode. (MyPrinter je objekt tipa tLPTPrinter.)
> vide samo definirani property-i (u ovom slučaju: Reset i PaperLength)?
> Sada, ovako kako je napisano, nudi puno toga, a što se siguno ne treba (i ne smije) pozivati iz programa.

Pitaš li kako da se u IDEu posle tačke ne pojavljuju svi dostupni propertiji i metode neke klase?

 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Vidljivost property-a28.01.2010. u 23:31 - pre 173 meseci
tako je.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Vidljivost property-a29.01.2010. u 01:17 - pre 173 meseci
Pojavljuju se public i published metode i svojstva, a ako se nalaziš u datom unitu onda svi. Ako neka metoda ne treba da se vidi onda verovatno i nije za public sekciju, ako je potrebno da bude dostupna samo iz klasa naslednica onda je stavi u protected.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Vidljivost property-a30.01.2010. u 20:30 - pre 173 meseci
Evo točnog primjera kako bih želio da mi se klasa ponaša:
Kreirao sam u unitu MojeKlase.pas klasu tUplata:
Code:

tUplata = class(tList)
   ...
public
   ...
   procedure Append(Iznos: double, ...);
end;


u unit-u Uplate.pas koristim objekt tipa tUplata npr:
Code:

procedure fmUpalte.btnNovaClic(Sendet: tOBject)
var up: tUplata;
begin
     up := tUplata.Create;
     ...
     up.Append(<neki iznos>, <još neki podaci>);
end;


Kad u unit-u Uplate.pas pišem kod, nakon unosa "up." IDE punudi i funkciju "Add" koja je definirana u tList clasi.
Pokušao sam dodati u tUplata klasu sljedeće:
Code:

   ...
protected
   ...
   function Add(Item: pointer): integer;
end;


Tada moram kreirati i funkciju:
Code:

function tUplata.Add(Item: pointer): integer
begin
   inherited Add(Item);
end;


U tom slučaju u unit-u Uplate.pas funkcija Add nije vidljiva, ali za svaku funkciju i proceduru moram pisati u svojoj kalasi proceduru sa pozivom inheritane funkcije... Da li je ovo moguće izbječi?
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Vidljivost property-a01.02.2010. u 03:02 - pre 173 meseci
Sve sto je definisano unutar klase pod protected i private ne bi trebalo da se vidi van te klase. Dakle, imas klasu tUplata koja nasledjuje klasu tList:

- Sve sto je definisano kao private u tList se nece videti nigde osim u samoj tList klasi
- Sve sto je definisano kao protected u tList se nece videti nigde osim u samoj tList klasi i u njenim naslednicima - dakle metodi klase tList koji su pod protected ce se videti i u klasi tUplata, dok se nece videti van te klase.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Vidljivost property-a01.02.2010. u 08:43 - pre 173 meseci
reiser, jasno mi je to.

Pitanje je kako sakriti property-e i metode klase TList.
Ne vide se van unita u kom je definirana moja klasa ako ih definiram u protected moje klase, ali tada moram za svaku od njih kreirati proceduru s pozivom inheritane metode. Zanima me da li je moguće izbjeći pisanje procedura s pozivima inheritanih metoda iz parent klase.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Vidljivost property-a01.02.2010. u 12:35 - pre 173 meseci
> Ne vide se van unita u kom je definirana moja klasa ako ih definiram u protected moje klase, ali tada moram za svaku od njih kreirati
> proceduru s pozivom inheritane metode. Zanima me da li je moguće izbjeći pisanje procedura s pozivima inheritanih metoda iz parent klase.

Nije moguće, ako ti metode TList klase ne trebaju onda si verovatno pogrešio u odabiru parent klase.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Vidljivost property-a01.02.2010. u 14:53 - pre 173 meseci
Ma koristim metode, ali unutar svoje klase, prema vam se ne trebaju vidjeti.

Metodu Add koristim tako da dodam strukturu koja se sastoji od varijabli od kojih su neke opet klase. Izvan klase se ne može odati novi Item, a da odgovara podacima... bar ne jednostavno.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Vidljivost property-a01.02.2010. u 17:23 - pre 173 meseci
> Ma koristim metode, ali unutar svoje klase, prema vam se ne trebaju vidjeti.
> Metodu Add koristim tako da dodam strukturu koja se sastoji od varijabli od kojih su neke opet klase. Izvan klase se ne može odati novi Item, a
> da odgovara podacima... bar ne jednostavno.

Onda tebi ne treba klasa nasleđena iz TList već obična klasa koja će sadržati TList membera:

TMojaKlasa = class
private
FList: TList;
...

Samim odabiranjem za osnovnu klasu TList ti govoriš da svi oni koji je koristi imaju potrebu i za metodama i pristupu mogućnosti osnovne klase, ako to nije slučaj onda imaš pogrešno odabranu osnovnu klasu. Dao sam ti gore jedan primer kako to možeš rešiti, ako ti to ne odgovara onda moraš dati više detalja kako bih svatio šta želiš i ponudio prigodnije rešenje.
 
Odgovor na temu

krle_zr

Član broj: 96307
Poruke: 258
79.101.237.*



+7 Profil

icon Re: Vidljivost property-a01.02.2010. u 20:40 - pre 173 meseci

Citat:
savkic


> Ma koristim metode, ali unutar svoje klase, prema vam se ne trebaju vidjeti.
> Metodu Add koristim tako da dodam strukturu koja se sastoji od varijabli od kojih su neke opet klase. Izvan klase se ne može odati novi Item, a
> da odgovara podacima... bar ne jednostavno.

Onda tebi ne treba klasa nasleđena iz TList već obična klasa koja će sadržati TList membera:

TMojaKlasa = class
private
FList: TList;
...

Samim odabiranjem za osnovnu klasu TList ti govoriš da svi oni koji je koristi imaju potrebu i za metodama i pristupu mogućnosti osnovne klase, ako to nije slučaj onda imaš pogrešno odabranu osnovnu klasu. Dao sam ti gore jedan primer kako to možeš rešiti, ako ti to ne odgovara onda moraš dati više detalja kako bih svatio šta želiš i ponudio prigodnije rešenje.


Bas razmisljam o ovoj temi i mislim da gorepomenuti pristup (savkic) ima najvise smisla. Sve sto ti treba mozes interno da odradis u klasi sa TList metodama, a ostale metode (sa tvojim nazivima) koje zelis da koristis dalje proglasi javnim.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.gs1hr.org.



+1 Profil

icon Re: Vidljivost property-a02.02.2010. u 09:53 - pre 173 meseci
Mislim da osnovnu klasu nisam pogrešno odabrao, ako jesam, predložite što bi bilo bolje.
Problem koji rješavam s klasom (moglo je i bez nje, ali mi je ovako bilo zgodnije) je sljedeće:

Klasu koristim za pretakanje podatak iz jedne baze u drugu sa potpuno drugačijom strukturom. Podaci koji se pretaću su podaci o računima, kamatama i uplatama.

Postojeća baza je složene tako da se zadužuje račun, a pri uplati se upisuje u isti slog datum uplate.
Kamata se obračunava prilikom zaduženje računa. Upisuje se ukupan iznos za sve obračunate kamate u račun (bez specifikacije). U slog računa na koji je obračunata kamata upisuje se datum obračuna.

Slog izgleda ovako (stanje nakon upisa računa 01.03.2009)

Kupac; Datum knjižena; Broj računa; Datum dospjeća; Datum plaćanja; Iznos računa; Iznos kamata; datum kamata
1112 ; 01.01.2009 ; 1 ; 15.01.2009 ; 20.03.2009 ; 100.00 ; 0 ; 01.03.2009
1112 ; 01.02.2009 ; 2 ; 15.02.2009 ; 20.03.2009 ; 100.00 ; 0 ; 01.03.2009
1112 ; 01.03.2009 ; 3 ; 15.03.2009 ; ; 100.00 ; 24.85

(Ne znam kako formatirati zapis da ostane u obliku tablice, ispravno poredan po kolonama...)

Kamta na račune 1 i 2 je obračunata nakon uplate, a pri zaduženju računa 3 za 01.03.2009

Te podatke prebacujem u strukturu u kojoj su zaduženja, uplate, zaduženja kamata i uplate kamata u odvojenim slogovima tako da predhodni primjer generira 7 zapisa u novoj tablici. Ove izmjene su se morale napravit kako bi se vidjelo koliko je točno kamate zaduženo na svaki račun kao i rješenje problema pri uplatu većoj ili manjoj od iznosa računa. U staroj tablici se taj problem nije mogao rješiti jer se iznos uplat nigdje ne upisuje.

Ovo sam rješio tako da mi je u klasi definirana nova struktura. Učitam postojeće podatke, a kod učitavanja - u koliko postoje datum uplate kreiram dva sloga. Nakon učitavanja svih podataka za jednog kupca radim izračun kamata i po potrebi ga zadužujem.

TList mi je container koji drži sve slogove.
Kreirao sam svoju metodu koja dodaje novi zapis iz stare tablice i pri tom upisuje podatke u fieldove koje treba, kreira zpis za uplatu ako treba.
Kreirao sam metodu koja radi obračun kamata na uplate na koje nije obračunata kamata i dodaje slogove za svaku obračunatu kamata.
Posljednji korak mi je upis u bazu, što je najjednostavnije. Klasa mi ima metode: First, Next kao i property Eof pa se kroz nju krećem kao kroz bazu.

Mislim da je ovako malo jasnije zašto ne mogu (i ne smijem) koristiti većinu metoda i property-a klas TList van moje klase. Koji je smisao dodati pointer u TList ako on nije pointer na strukturu sloga?

Slog čiji pointer čuva moja klas je tagođe klasa.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Vidljivost property-a02.02.2010. u 10:59 - pre 173 meseci
> TList mi je container koji drži sve slogove.
> Kreirao sam svoju metodu koja dodaje novi zapis iz stare tablice i pri tom upisuje podatke u fieldove koje treba, kreira zpis za uplatu ako treba.
> Kreirao sam metodu koja radi obračun kamata na uplate na koje nije obračunata kamata i dodaje slogove za svaku obračunatu kamata.
> Posljednji korak mi je upis u bazu, što je najjednostavnije. Klasa mi ima metode: First, Next kao i property Eof pa se kroz nju krećem kao kroz bazu.

> Mislim da je ovako malo jasnije zašto ne mogu (i ne smijem) koristiti većinu metoda i property-a klas TList van moje klase. Koji je smisao dodati pointer u TList > ako on nije pointer na strukturu sloga?

Da budem iskren meni nije jasno, i dalje ne vidim ništa što zahteva izvedenost iz TList nasuprot prostom korišćenju TList kao kontainer propertija. U svakom slučaju da sakriješ metode osnovne klase ne možeš, a ti sad vidi kako ti se to uklapa u ostalu koncepciju.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.gs1hr.org.



+1 Profil

icon Re: Vidljivost property-a02.02.2010. u 12:55 - pre 173 meseci
Istina, nisam morao kreirati svoju klasu kao nasljednika TList, već sam mogao unutar svoje klase kreirati var. tipa TList. Vjerojatno je bolje rješenje, ali u trenutku kada sam započeo to mi je izgledala odlićna ideja. (:

Znam za ubuduće...

Želim pohvaliti ovaj site i zahvaliti se svima koji su mi do sada odgovarali na pitanja. Od kada sam ovdje, dosta toga sam naučio, a vjerojatno će još toga biti... Unaprijed hvala.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Vidljivost property-a

[ Pregleda: 2574 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.