Forum Delphi.cz

Delphi => Obecné => Téma založeno: František 05-08-2019, 22:53:51

Název: Vytvorenie TPanel zabehu
Přispěvatel: František 05-08-2019, 22:53:51
Kód: Delphi [Vybrat]
  1. var      panImporterX: Tpanel;
  2. begin
  3.      panImporterX := Tpanel.Create(nil);
  4.      panImporterX.Parent := mc2.panel1;

mc2 je hlavny formular
panel1 je Tpanel na nom

na tom poslednom prikaze mi to rachá, kde mám chybu?
Název: Re:Vytvorenie TPanel zabehu
Přispěvatel: Radek Červinka 05-08-2019, 23:07:05
racha je Access Violation?

Není mc2 nebo mc2.panel1 = nil?
Dej místo nil jako parametr konstruktoru mc2.
Název: Re:Vytvorenie TPanel zabehu
Přispěvatel: František 05-08-2019, 23:38:47
aby som to upresnil:
vytváram to v konštruktore ktory volam v AnonymousThread

v podstate mám triedu ktorá sťahuje súbor z netu (funkčnú) a chcel by som zobraziť progressbar so stavom sťahovania ..
beží ich naraz 8 vo vláknach

ps. mc2 nepomohlo
Název: Re:Vytvorenie TPanel zabehu
Přispěvatel: pf1957 06-08-2019, 08:18:08
vytváram to v konštruktore ktory volam v AnonymousThread
Ty nesmis ze threadu sahat v podstate po cemkoli v UI, jedine pres Synchronize(), ktere ta volani deleguje na hlavni thread a nebo to delegovat sam asynchronnim PostMessage
Název: Re:Vytvorenie TPanel zabehu
Přispěvatel: František 06-08-2019, 08:53:55
takže by bolo asi správnejšie vytvoriť panel ešte pred spustením threadu, či?
Název: Re:Vytvorenie TPanel zabehu
Přispěvatel: pf1957 06-08-2019, 12:04:57
takže by bolo asi správnejšie vytvoriť panel ešte pred spustením threadu, či?
Kdy ho vytvoris je jedna vec = to muzes dost pravdepodobne udelat tesne pred tim, nez ten thread vytvoris a spustits. Ale druha vec je, ze na tom panelu budes chtit asi prubezne neco zobrazovat a to taky nesmis delat primo. Bud pres metodu Synchronize nebo Queue (nebude cekat na UI) nebo si nadefinovat nejakou windows message a tu plivat spolus s wParam+lParam treba na Application.MainForm.Handle (ma top vyhodu, ze je to anonymni - nemusis vedet, kde je MainForm, jak se jmenuji jeho metody, widgety na nem apod. a cele zobrazeni je jen v rezii MainForm.
Název: Re:Vytvorenie TPanel zabehu
Přispěvatel: František 09-08-2019, 10:45:04
vyriešil som to takto:

1. vytvoril som si formulár s komponentami (to čo som potrebovan na TPanel)
2. vytvoril som si potomka z toho formu a doplnil potrebne metody, injektol podľa https://delphi.cz/post/Nahrazeni-frames-za-vlozene-formulare.aspx (https://delphi.cz/post/Nahrazeni-frames-za-vlozene-formulare.aspx) a vytvoril zoznam do TDictionary
3. v hlavnom vlákne ovládam vlastnosti komponent cez zoznam vytvorených objektov/formulárov v TDictionary
4. časovacom kontrolujem či vlákno dokončilo prácu  - ak áno, tak ten formulár uvoľním

šlape to, ale je to košer?