[ _v!rus_ @ 30.10.2006. 20:29 ] @
Jel moze neko da mi kaze ZASTO se SVE visual komponente zapisuju u dfm forme (samim tim i kreiraju) PRE non-visual komponenti?!
U form designer-u se nalazi opcija [Creation order], ali je sa njom moguće izmeniti redosled kreiranja samo visual komponenti... Problem je u tome sto sam napravio svoje kontrole i kada ih vezem na neku non-visual komponentu (npr. TField ili TImageList), ta non-visual komponenta ce se kreirati POSLE moje kontrole. Kada se forma sa mojim kontrolama snimi i ponovo otvori svi property-i budu ok osim onih sto se vezuju na non-visual kontrole. Kada Delphi ucita DFM on pravilno kreira moje kontrole ali npr. property accesor-u SetField ce proslediti nil, jer taj prosledjeni TField se nalazi tek kasnije u DFM fajlu i bice kreiran tek POSLE kreiranja moje kontrole...

Zna li neko resenje za ovo?
[ Srki_82 @ 30.10.2006. 21:26 ] @
Ne znam sta bih ti rekao... koristim Delphi 7 i sve kontrole se u DFM fajlu nalaze u istom redu kao sto sam ih kreirao. Ako sam prvo stavio neku non-visual kontrolu (recimo neki dialog) pa zatim visual kontrolu (recimo dugme) u DFM fajlu je prvo definisan dialog pa tek onda dugme, a tim redom su i kreirani (ako overridujes standardne konstruktore, mozes to i da vidis).

Edit: evo... na formu sam prvo stavio dialog i zatim dugme... dfm fajl izgleda ovako:
Code:
object Form1: TForm1
  Left = 192
  Top = 114
  Width = 783
  Height = 540
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object OpenDialog1: TOpenDialog
    DefaultExt = 'dll'
    Filter = 'Dll|*.dll'
    Left = 152
    Top = 8
  end
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Load'
    TabOrder = 0
    OnClick = Button1Click
  end
end
[ savkic @ 31.10.2006. 09:05 ] @
> Jel moze neko da mi kaze ZASTO se SVE visual komponente zapisuju u dfm
> forme (samim tim i kreiraju) PRE non-visual komponenti?!

TComponent ima metodu (ne secam se tacnog naziva) koja ide redom kroz sve child komponente (Components lista) koje poseduje i redom ih streamuje, TWinControl (TControl) overrajduje tu metodu i prolazi kroz sve vizuelne kontrole (Controls lista).

> kreiranja samo visual komponenti... Problem je u tome sto sam napravio
> svoje kontrole i kada ih vezem na neku non-visual komponentu (npr. TField ili TImageList),
> ta non-visual komponenta ce se kreirati POSLE moje kontrole. Kada se forma
> sa mojim kontrolama snimi i ponovo otvori svi property-i budu ok osim onih
> sto se vezuju na non-visual kontrole. Kada Delphi ucita DFM on pravilno
> kreira moje kontrole ali npr. property accesor-u SetField ce proslediti nil, jer
> taj prosledjeni TField se nalazi tek kasnije u DFM fajlu i bice kreiran
> tek POSLE kreiranja moje kontrole...

Delphi streaming sistem kod učitavanja pravi fixup listu referenci na metode i druge klase, tek kada se završi kompletno kreiranje svih komponenti, prelazi se na fixup listu i onda se radi resolving referenci. Dakle, u tom trenutku sve komponente postoje, klasičan primer su reference na TDataSet ili TDataSource u data aware komponentama. Ako vidiš rugačije ponašanje, znači da si negde napravio grešku. Proveri kod i pogledaj kako su urađene druge nevizuelne komponente.
[ Milos D @ 31.10.2006. 09:21 ] @
Preklopi Loaded metodu - u trenutku poziva te metode trebalo bi da sve property vrednosti budu podesene? Ili daj kod da vidimo...
[ _v!rus_ @ 31.10.2006. 12:41 ] @
Citat:
Delphi streaming sistem kod učitavanja pravi fixup listu referenci na metode i druge klase, tek kada se završi kompletno kreiranje svih komponenti, prelazi se na fixup listu i onda se radi resolving referenci

Posle malo(vise) igranja dosao sam do istog zakljucka, da radi u dva prolaza... U svakom slucaju delimicno sam resio problem. Stvar je bila u tome da sam hteo da napravim da SetImages i SetImageIndex moje kontrole oboje pozivaju UpdateImage proceduru koja dodeljuje image kombinacijom ta dva polja, greska je bila u tome da je taj UpdateImage modifikovao FImageIndex tj. stavljao ga na -1 ako je ImageIndex=nil, i obratno.

Nego kada ste vec raspolozeni za odgovaranje, jos par pitanja u vezi streaminga komponenti...
1. What's the deal sa TBitmap objektima u DFM-u? Kada napravim TBitmap property u svojoj kontroli, SetBitmap u FormDesigneru lepo odradi posao i dodeli TBitmap objekat mom property-u (SetBitmap(Val: TBitmap) if not nil then FBitmap.Assign(Val)...), ali se prilikom startovanja aplikacije SetBitmap uopste ne opali iako se slika uredno nadje u FBitmap polju. U DFM-u se slika nalazi u Data=... sekciji ali nemam SetBitmap da bih nesto jos uradio sa tom slikom kakda se dodeli... Onda moram neke budzeve tipa UpdateComponents na pocetku aplikacije (uzas...) Znam da TBimap je TPersistent, nije valjda da component streamer puni TPersistent direktno, preko pointera?!

(EDIT: Nisam video Milosev post za Loaded metod. Hvala Milose, ako to radi onda je to resenje i za ovaj i za prvobitni problem)

2. Kako da nateram FormDesigner da snima property-e podkontrola moje kontrole. Naime, imam svoj TPanel descendant koji izmadju ostalog ima i jedan TButton sa uredno postavljenim published Button: TButton read FButton; E sada, u FormDesigner-u mogu da menjam taj Button, ali se nijedna promena ne snima. Owner za TButton je moja kontrola... kapiram da property-je strimuje owner komponenta, i kada promenim ownera buttona na TMojaKontrola.Owner, onda se promene snimaju, ali se cudne stvari desavaju (sto je savrseno normalno, u tom slucaju TForm kreira moju kontrolu koja "vestacki" ubacuje jos jedan Button u TForm, onda posle svakog ucitavanja forme broj Button kontrola se udvostrucuje jer ih kreira i TForm i moja kontrola...). Ima li neki sistem da nateram svoju kontrolu da strimuje i svoje podkontrole kada njen owner hoce da je snimi u DFM?