Autor Téma: Překreslení formuláře  (Přečteno 4335 krát)

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Překreslení formuláře
« kdy: 04-12-2013, 14:13:19 »
Nenapadá vás nějaký rozumný způsob, jak překreslit nějaký TControl ve Firemonkey na XE2.
Jde o to, že dynamicky vytvářím na TScrollBoxu Controly a navíc v threadu. Postupným vkládáním se některé prvky ani nezobrazí a jiné jsou zobrazeny třeba jenom částečně. Zkoušel jsem různé kombinace repaint, invalidate, UpdateEffects, beginUpdate, EndUpdate atd...

TControl vytvářím tak, že ho vytvořím s vlastníkem a na Parent mu pro jistotu ještě znovu vlastníka přiřadím.

Nicméně jsem nedošel k řešení, které by spolehlivě zobrazilo všechny prvky a pokud možno i animace.

PS: Mám XE2, Update 4 HF 1
už su z toho na prášky

Dík za každý tip

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Překreslení formuláře
« Odpověď #1 kdy: 04-12-2013, 14:18:57 »
jenom pro doplnění problému.
když jsou na ploše ty jakoby nedodělané Controly, tak stačí kliknout někam do plochy nebo odscrollovat a je vše v richtiku

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Překreslení formuláře
« Odpověď #2 kdy: 04-12-2013, 15:24:45 »
Ja som mal podobný problém vo VCL. Mal som tam nejaké komponenty LMD = tretia strana. Keď som ich nahradil komponentmi XE2, tak problém zmizol.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Překreslení formuláře
« Odpověď #3 kdy: 04-12-2013, 18:29:11 »
Jde o to, že dynamicky vytvářím na TScrollBoxu Controly a navíc v threadu. Postupným vkládáním se některé prvky ani nezobrazí a jiné jsou zobrazeny třeba jenom částečně. Zkoušel jsem různé kombinace repaint, invalidate, UpdateEffects, beginUpdate, EndUpdate atd...

UI většinou není thread-safe a lze v něm dělat změny jenom z UI threadu (resp. spíš toho, kdo ho vytvořil). To bude asi ten důvod, proč to moc nefunguje.

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Překreslení formuláře
« Odpověď #4 kdy: 04-12-2013, 19:28:59 »
UI většinou není thread-safe a lze v něm dělat změny jenom z UI threadu (resp. spíš toho, kdo ho vytvořil). To bude asi ten důvod, proč to moc nefunguje.

Já to právě vychytal přes CriticalSection, nepadá to a myslím že to je v tomto směru v pořádku.

Nicméně, pokud by tomu bylo tak, tak si myslím, že Firemonkey bude trochu ztrácet smysl.  Když budu chtít zobrazit několik údajů přes mobilní připojení, tak to nemůže vytuhnout a nakonec udělat nějakou animační parádičku. na mobilu bych takovou aplikaci poslal k šípku.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1127
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Překreslení formuláře
« Odpověď #5 kdy: 04-12-2013, 19:50:25 »
Kriticke sekce jsou na pristup do sdilene pameti, mozna se mylim, ale nemel bys pouzit synchronize?
Ztracet smysl to nebude. To nema s firemonkey nic spolecneho a ani to vytuhavat nebude - vykresli se nova kontrolka a jede to dal.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Překreslení formuláře
« Odpověď #6 kdy: 04-12-2013, 20:24:04 »
Já to právě vychytal přes CriticalSection, nepadá to a myslím že to je v tomto směru v pořádku.

Nicméně, pokud by tomu bylo tak, tak si myslím, že Firemonkey bude trochu ztrácet smysl.  Když budu chtít zobrazit několik údajů přes mobilní připojení, tak to nemůže vytuhnout a nakonec udělat nějakou animační parádičku. na mobilu bych takovou aplikaci poslal k šípku.

CriticalSection akorát řekneš, že tam nemají lézt dva thready zároveň. Jenže UI controly často chtějí, abys na ně přistupoval z UI threadu. Třeba v .Net to defautlně vyhazuje výjimky, v Delphi to myslím nehlásilo nic, ale fungovalo to špatně.

Jinak vytuhnout to nemusí, můžeš třeba data vytáhnout asynchronně a pak je jenom v updatnout UI, což je hned.

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Překreslení formuláře
« Odpověď #7 kdy: 04-12-2013, 20:42:45 »
CriticalSection (CS) používám k tomu, abych ve dvou místech současně nelezl do jednoho místa. Když dám příklad, v jednom místě jsem nastavoval text a v druhém zjišťoval jeho výšku, tak to padalo jako hrušky. Proto jsem to tam dal, teďka jsem to předělal trochu jinak, tak by k takovým případům docházet nemělo. Už to tam asi nechám, kdyby něco...


Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1127
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Překreslení formuláře
« Odpověď #8 kdy: 04-12-2013, 20:54:14 »
ty to ale nechapes ... pokud chces z vlakna pristupovat ke GUI, tak musis pouzit synchronize,
criticalsection neni na toto ;)

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Překreslení formuláře
« Odpověď #9 kdy: 04-12-2013, 21:09:01 »
ty to ale nechapes ... pokud chces z vlakna pristupovat ke GUI, tak musis pouzit synchronize,
criticalsection neni na toto ;)
Už jsem to pochopil. Funguje to geniálně.

Dík moc, máš u mě slivku