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

Problem sa container kontrolom.

[es] :: Pascal / Delphi / Kylix :: Problem sa container kontrolom.

[ Pregleda: 3140 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Shevchenko
Nikola Vasiljevski

Član broj: 37756
Poruke: 218
*.ADSL.neobee.net.

Sajt: www.vasiljevski.com


+2 Profil

icon Problem sa container kontrolom.17.09.2008. u 13:46 - pre 189 meseci
Napravio sam jednu kontrolu A, koja sadrzi X kontola B. Kada kontrolu A prebacim na formu na njoj se kreira kontrola A i isti broj kontrola B koliko ih ima u kontroli A.
Kada se kontrola A instancira direktno iz koda na FormCreate sve je u redu, ali kada se prebaci na formu javlja gresku da FClassNameNotFound posto nije mogao da nadje class name B kontrole.
Posto je broj kontrola B u kontroli A proizvoljan prilikom kreiranja komponente A izvrsava se :

Code:

  SetLength(fPlayerArray,COUNT);
  for i:=0 to COUNT-1 do
    begin
      fBArray[i]:=B.Create(owner);
      fBArray[i].Parent:=TWinControl(owner);
    end;


Da li je problem sto se koristi dinamicki niz controla B?

Obe kontrole nasledjuju TGraphicControl.
Shoot for the moon. Even if you miss, you'll land among the stars.
Les Brown
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa container kontrolom.17.09.2008. u 14:10 - pre 189 meseci
> Napravio sam jednu kontrolu A, koja sadrzi X kontola B. Kada kontrolu A prebacim na formu na njoj se kreira kontrola A i isti broj
> kontrola B koliko ih ima u kontroli A.
> Kada se kontrola A instancira direktno iz koda na FormCreate sve je u redu, ali kada se prebaci na formu javlja gresku
> da FClassNameNotFound posto nije mogao da nadje class name B kontrole.

Nisam siguran da sam najbolje shvatio šta se tu dešava, odgovornost za kreiranje child kontrola je na master kontroli a ona bi valjda trebalo da zna koja je klasa u pitanju. Ko ti javlja tu grešku?

> Posto je broj kontrola B u kontroli A proizvoljan prilikom kreiranja komponente A izvrsava se :

Zašto ne praviš te dodatne kontrole gde je owner master kontrola, onda ti ne treba dodatni niz a i kontrole se automatski uništavaju.

 
Odgovor na temu

Shevchenko
Nikola Vasiljevski

Član broj: 37756
Poruke: 218
*.ADSL.neobee.net.

Sajt: www.vasiljevski.com


+2 Profil

icon Re: Problem sa container kontrolom.17.09.2008. u 14:22 - pre 189 meseci
Citat:
savkic:
Nisam siguran da sam najbolje shvatio šta se tu dešava, odgovornost za kreiranje child kontrola je na master kontroli a ona bi valjda trebalo da zna koja je klasa u pitanju. Ko ti javlja tu grešku?


Upravo tako. Ali se iz nekog razloga na formi kreira isti broj kontola koliko ih ima unutar komponente A.
Gledajuci iz dizajnera sve je to OK, ali kada se pogleda text forme izgleda ovako:
Code:

object B;
object B;
object B;
Object A;


Kada izbrisem sve "object B" i ne prebacim u Form View vec pokrenem aplikaciju sve je OK.

Imam i drugih komponenti koje su takodje containeri za neke druge kontrole na istoj formi i one se normalno ponasaju. Jedina razlika je u tome sto kao sto rekoh ovde tek pri kreiranju dimenzionisem niz i kreiram child komponente.

Citat:
savkic: >

Zašto ne praviš te dodatne kontrole gde je owner master kontrola, onda ti ne treba dodatni niz a i kontrole se automatski uništavaju.


Pa i kreiraju se u Owner kontroli, u konstruktoru. Ako si na to mislio.
Same se i unistavaju kada obrisem komponentu sa forme. SAmo mi nije jasno zasto u Text view forme ne stoji samo Object A.
Shoot for the moon. Even if you miss, you'll land among the stars.
Les Brown
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa container kontrolom.18.09.2008. u 15:02 - pre 189 meseci

> Kada izbrisem sve "object B" i ne prebacim u Form View vec pokrenem aplikaciju sve je OK.

> Imam i drugih komponenti koje su takodje containeri za neke druge kontrole na istoj formi i one se normalno ponasaju. Jedina razlika je u tome
> sto kao sto rekoh ovde tek pri kreiranju dimenzionisem niz i kreiram child komponente.

Proveri da ti nije aktivna (instalirana) kontrola od neke prethodne verzije koda koja radi pogrešno. U svakom slučaju to je nešto što treba da radi, nedavno je bilo pitanje kako ubaciti više podkontrola u jednu pa možeš i te savete pogledati.



 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
77.46.240.*



+62 Profil

icon Re: Problem sa container kontrolom.18.09.2008. u 15:30 - pre 189 meseci
Citat:
Code:

  SetLength(fPlayerArray,COUNT);
  for i:=0 to COUNT-1 do
    begin
      fBArray[i]:=B.Create(owner);
      fBArray[i].Parent:=TWinControl(owner);
    end;


Treba valjda ovako:

Code:

     fBArray[i]:=B.Create(self);
     fBArray[i].Parent:=TWinControl(owner);


Sa gornjim kodom, novokreirane instance klase B se upisuju u Components listu forme (jer je Owner klase A valjda forma?). U primeru ispod, instance klase B se upisuju u Components listu "parent" kontrole A.
E sad, zasto onda ne poturimo instancu klase A i za Parent (vidi drugu liniju gde se dodjeljuje Parent)? Zato sto Parent mora biti TWinControl, a tvoje obe kontrole su izvedene od TGraphicControl (koji nije TWinControl); sledi da ni jedna ne moze biti Parent.
Ovo bi valjda trebalo da radi... ili ja tu nesto nisam shvatio.

Rajko


 
Odgovor na temu

Shevchenko
Nikola Vasiljevski

Član broj: 37756
Poruke: 218
79.101.194.*

Sajt: www.vasiljevski.com


+2 Profil

icon Re: Problem sa container kontrolom.22.09.2008. u 01:04 - pre 189 meseci
Citat:
Rapaic Rajko: Treba valjda ovako:

Code:

     fBArray[i]:=B.Create(self);
     fBArray[i].Parent:=TWinControl(owner);


Sa gornjim kodom, novokreirane instance klase B se upisuju u Components listu forme (jer je Owner klase A valjda forma?). U primeru ispod, instance klase B se upisuju u Components listu "parent" kontrole A.
E sad, zasto onda ne poturimo instancu klase A i za Parent (vidi drugu liniju gde se dodjeljuje Parent)? Zato sto Parent mora biti TWinControl, a tvoje obe kontrole su izvedene od TGraphicControl (koji nije TWinControl); sledi da ni jedna ne moze biti Parent.
Ovo bi valjda trebalo da radi... ili ja tu nesto nisam shvatio.

Rajko


Pa generalno da trebalo bi da bude tako :) Imam x kontrola koje instanciram bas na gore napomenuti nacin :) Ali u ovom slucaju to ne radi. Sa B.Create(Self) dobijam AccesViolation at adress.... kada pokusam da prebacim kontrolu na formu.

Meni je fascinantno da kontrola bez problema radi kada se instancira iz koda, jedino prebacivanjem na formu iz dizajnera pravi probleme. Tako da sam privremeno resio time da je iz koda instanciram. Ali bas bih voleo da znam razlog zbog koga se kontrola tako cudno ponasa.

Shoot for the moon. Even if you miss, you'll land among the stars.
Les Brown
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
93.86.19.*



+62 Profil

icon Re: Problem sa container kontrolom.22.09.2008. u 09:56 - pre 189 meseci
Nisi rekao na kom mestu u kodu pozivas onaj kod iz prvog posta (for petlja za instance B klase)?
U konstruktoru klase A, ili negde drugde?

Rajko
 
Odgovor na temu

Shevchenko
Nikola Vasiljevski

Član broj: 37756
Poruke: 218
79.101.140.*

Sajt: www.vasiljevski.com


+2 Profil

icon Re: Problem sa container kontrolom.27.09.2008. u 20:17 - pre 189 meseci
Citat:
Rapaic Rajko: Nisi rekao na kom mestu u kodu pozivas onaj kod iz prvog posta (for petlja za instance B klase)?
U konstruktoru klase A, ili negde drugde?

Rajko


Da u konstruktoru klase A, iliti kontejner klase :)
Shoot for the moon. Even if you miss, you'll land among the stars.
Les Brown
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
79.101.217.*



+62 Profil

icon Re: Problem sa container kontrolom.29.09.2008. u 14:33 - pre 189 meseci
Pokusaj u virtuelnoj metodi Loaded. Nesto ovako:

Code:
 
procedure TMyClassA.Loaded; override;
var 
  i: integer;
begin
  inherited;
  for i := 0 to fInstanceBNumber - 1 do
    // ovde kreiramo instance klase B
end;


Jedna vazna napomena u vezi procedure Loaded. Kada se ona izvrsava TACNO? Evo mali primer da pojasnim:

Code:

constructor TMyClassA.Create(aOwner: TComponent; InstanceBNumber: integer); // menjamo malo konstruktor, primera radi
begin
  fInstanceBNumber := InstanceNumber;
  inherited Create(aOwner);  // OVDE se izvrsava Loaded
end;


Obrati paznju na redosled u konstruktoru. Ako prvo pozovemo inherited konstruktor, pa naknadno dodelimo broj instanci fInstanceBNumber, Loaded nece raditi (kreirace se nula instanci).
Takodje, ako zelis da radvojis kod (logicki) koji treba da se izvrsava u nekom trenutku/stanju komponenta, koristi property ComponentState instance A. Recimo, dok se izvrsavaju Loaded metode tvoje aplikacije (svi komponenti imaju Loaded) vazi takodje za sve komponente

Code:

(csLoading in ComponentState)  = true;   


Ima tu jos dosta caka sa ComponentState, recimo postoji i csDesigning, za indikaciju da si komponent upravo drop-ovao sa palete na formu, to jest da nisi u runtime-u.
Probaj, mislim da bi ovo gore trebalo da radi.

Rajko
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Problem sa container kontrolom.

[ Pregleda: 3140 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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