[ komplikator @ 30.10.2008. 06:56 ] @
Pozdrav svima na forumu!

Radim vlastitu klasu za nadgledanje stanja aplikacije, učitavanje nekih postavki aplikacije, definiranje više DBX connectiona prema bazi, nadzor kroisničkih privilegija i još svašta nešto. Klasa dio postavki čita/piše u INI fajl.

Koristim konstruktore i destruktore u kojima stvaram instance polja sa svojstvima objekata, npr. string liste. Imam posebne metode za čitanje i snimanje polja u INI, punjenje tstringsa sekcijama i sl. no trebam nešto dodatno pročitati ili zapisati i mimo tih metoda. Imam 6-8 instanciranja TINIFile u metodama.

Sam objekt kreiram odmah prije prve forme nakon stvaranja TApplication, i oslobađam prije nego zatvorim TApplication.

Dakle, cijelo vrijeme života programa imam u memoriji taj svoj objekt sa svim njegovim varijablama i sl. Mene na kraju traktata interesira, ima li smisla odmah na početku u konstruktoru stvoriti instancu TIniFile private ili protected opsega i držati je cijelo vrijeme u memoriji i samo pristupati u metodama, ili je pametnije i "sigurnije" svaki put u metodi koja to zahtjeva napraviti novu instancu TInifile i onda je otpustiti ?



I drugo, "amatersko" pitanje; mogu li napraviti unit sa svojim klasama naslijeđenih standardnih kontrola tipa TEditBox kojima bi izmijenio neke metode, dodao neka svojstva i "naučio ih nekim svojim trikovima" i da to sve skupa koristim u programu, a bez da moram raditi kontrole, instalirati ih, i sl. ? Dakle, kad stavim TEditBox na kontrolu umjesto njega ručno ga prepravim u TMojEditBox, a bez da radim dodatnu kontrolu? ( hint: TurboDelphiExplorer) ?


Unaprijed svima hvala na odgovorima.
[ savkic @ 30.10.2008. 10:38 ] @
> Mene na kraju traktata interesira, ima li smisla odmah na početku u konstruktoru stvoriti instancu TIniFile private ili protected opsega i
> držati je cijelo vrijeme u memoriji i samo pristupati u metodama, ili je pametnije i "sigurnije" svaki put u metodi koja
> to zahtjeva napraviti novu instancu TInifile i onda je otpustiti ?

Nema neke bitne razlike, TIniFile je prilično "laka" klasa tako da ne utiče na potrošnju memorije. Dobra je praksa da ako retko imaš potrebu da koristiš neki objekat, nema ni potrebe da ga stalno držiš u memoriji. Inače ako ti je bitna brzina i često menjaš ini sadržaj a ne postoji opasnost da će se fajl promeniti van tvoje aplikacije, možeš koristiti TMemIniFile.

> I drugo, "amatersko" pitanje; mogu li napraviti unit sa svojim klasama naslijeđenih standardnih kontrola tipa TEditBox kojima bi izmijenio
> neke metode, dodao neka svojstva i "naučio ih nekim svojim trikovima" i da to sve skupa koristim u programu, a bez da moram raditi
> kontrole, instalirati ih, i sl. ? Dakle, kad stavim TEditBox na kontrolu umjesto njega ručno ga prepravim u TMojEditBox, a bez da
> radim dodatnu kontrolu? ( hint:

Ako kontrole nisu instalirane onda ih ne možeš koristiti u form designeru, bez instalacije ih možeš ručno praviti i postavljati direktno u kodu.
[ komplikator @ 30.10.2008. 12:11 ] @
Pala mi je na pamet ideja (moram probati) sa redosljedom pristupa komponenti, mada mi se to riješenje previše i ne sviđa. Mislim na onu priču da napraviš svoju klasu istog imena, koja "pregazi" onu pravu ako se njen unit pozove prije nego neki drugi. No to je toliko ružno i mutno riješenje da bi prije u obzir došlo ručno štrikanje komponenata na formu.

Pitao sam jer nikad nisam probao form designeru ručno eksternim editorom podvaliti druge nazive objekata na formi tj. ručno editirati DFM.
[ savkic @ 30.10.2008. 16:25 ] @
Još jedna mogućnost da koristiš standardni TEdit u designeru a onda u OnCreatu forme postaviš svoj edit umesto njega a originalni TEdit uništiš.
[ viking13 @ 30.10.2008. 23:37 ] @
Citat:
komplikator
Pitao sam jer nikad nisam probao form designeru ručno eksternim editorom podvaliti druge nazive objekata na formi tj. ručno editirati DFM.


A šta misliš kako sam prebacio D2007 projekat koji koristi TNT kontrole u D2009 koji ima Unicode podršku i ne treba mu TNT? Zar stvarno misliš da sam bio dovoljno lud da slažem kontrole po formu iz početka? :)

Znači, moguće je i vrlo je izvodljivo, samo pazi šta radiš i da ti dpr, pas i dfm budu sinhronizovani.

Najbolje editovanje odraditi direktno iz Delphi IDE-a. Ako se IDE pobuni da projekat koristi neke kontrole koje nisu instalirane, počasti ga sa Ignore klikom. :)

Obrati pažnju samo na to da moraš da edituješ SVE instance TSomeControl u TSomeOtherControl.

To konkretno znači da moraš da promeniš sve reference i u DFM i u PAS i u DPR fajlovima.

Manji problem nastaje ako neka kontrola ima neke propertije koja ova druga nema ili još gore ako se isto zovu, a nisu istog tipa.
[ savkic @ 31.10.2008. 00:34 ] @
> Obrati pažnju samo na to da moraš da edituješ SVE instance TSomeControl u TSomeOtherControl.
> To konkretno znači da moraš da promeniš sve reference i u DFM i u PAS i u DPR fajlovima.
> Manji problem nastaje ako neka kontrola ima neke propertije koja ova druga nema ili još gore ako se isto zovu, a nisu istog tipa.

Probaj GExperts i ReplaceComponents, radi upravo to.
[ komplikator @ 06.11.2008. 10:41 ] @
Još jedno malo pitanje vezano uz OOP, da ne otvaram novu temu bezveze...

Može li funkcija vraćati neki objekt, ili mu moram pristupati kroz parametar funkcije.


Drugim riječima, evo jednog malog primjera:


Imam neki Memo, Combo ili sl. i on sadrži "itemse" tipa TStrings ili TStringlist.
Imam i neku svoju klasu TMojObjekt, odnosno instancu MojObjekt s metodom (funkcijom) GetTSPopis( const Uvjet : Strings = '') :TStrings
Funkcija je u published opsegu.

Ako kažem ( sve je konstruirano, i "živo" uključujući i MojObjekt) :

Memo.Lines := MojObjekt.GetsPopis ('NEKIUVJET'); onda ne radi.

No ako prepravim funkciju i kažem da je funkcija: GetTSPopis( const Uvjet : Strings = '', var aTSPopis = nil )

I kaže: MojObjekt.GetsPopis ('NEKIUVJET', Memo.Lines); tada sve radi.

Bilo bi mi jasno da pokušavam upisati nešto što nije instancirano i ne postoji, no Lines itekako postoji. To znači da funkcija ne može vratiti podatak tipa klase i onda ga dodijeliti, nego može isključivo utjecati na tu klasu.
[ savkic @ 06.11.2008. 11:55 ] @
> Bilo bi mi jasno da pokušavam upisati nešto što nije instancirano i ne postoji, no Lines itekako postoji. To znači da funkcija ne može vratiti
> podatak tipa klase i onda ga dodijeliti, nego može isključivo utjecati na tu klasu.

Može vratiti i može se dodeliti tamo gde je to dozvoljeno, u primeru koji si ti dao pokušavaš nedozvoljenu dodelu. Pogledaj kako je deklarisan TMemo.Lines property. Ono što možeš uraditi je Memo.Lines.Assign(MojObjekt.GetsPopis ('NEKIUVJET'));

[Ovu poruku je menjao savkic dana 06.11.2008. u 13:17 GMT+1]
[ X Files @ 07.11.2008. 06:54 ] @
^
Takodje, postoji i procedure AddStrings(Strings: TStrings); virtual; kojom je moguce izvrsiti dodelu jednog string list objekta u drugom, naravno bez obzira da li je to TMemo::Lines ili nesto drugo.
[ komplikator @ 07.11.2008. 10:33 ] @
Znam i za assign i metodu addstrings, no u svim slučajima mi nije vraćao ništa.

Nema veze, napisao sam to pametnije i ustrojio na drugi sistem.