Jako ono to +- funguje, akorat ze i pres begin/end update se obcas proste labely prekreslujou pres sebe a pomuze jen resize okna formulare.S opici nedelam, ale ve VCL bylo obvykle, ze Begin/End update jen zamezovalo propagovani zmeny dat dal tj. prekreslovani, generovani udalosti apod., ale netykalo se exkluzivniho pristupu.
Diky, me slo prave o praci s taskem (tzn jak rozumne ukoncovat apod), a parametry pro prenos mezi synchronize a prave v FMX. Zkousel jsem to napsat ve VCL a tam to chodilo o dost rychleji a o dost lepe (kod komplet zkopirovan a jen upraven pro kompatibilitu s vcl.Ani s tasky jsem v Delphi nic podstatnejsiho nedelal, v C# ma konstruktor parametr CancelationToken, ktery jsem mu predaval a kterym lze tasku signalizovat, ze to ma zabalit. Jestli ma neco podobneho TTask nevim.
[...]Podle Helpu bych to v Delphi zrejme delal pres ITask, ktere ma metody Cancel a CheckCanceled
v C# ma konstruktor parametr CancelationToken, ktery jsem mu predaval a kterym lze tasku signalizovat, ze to ma zabalit. Jestli ma neco podobneho TTask nevim.
ze sice ja ho cancelnu, ale EndUpdate prekresli ty data, coCancel jen nastavi priznak, ze se na to ma vybodnout, takze ty bys ho mel testnout nejpozdeji pred BeginUpdate a to by ti melo poslouzit misto toho sekvencniho cisla - u toho reseni spis jde o to, co pro tebe bude snazsi, jestli distribuovat do vsech tasku jedno cislo nebo si pamatovat iTask pro vsechny rozebehnute tasky. Ale princip je stejny: nevstupovat do UI operaci nebo nechat na Synchronize, ze ti zajistit serializaci aktualizaci UI z jednotlivych tasku. Jakmile se ta aktualizace rozebehne, uz to bude delat vizualni "bordel"
Ja bych to udelal nejak takto:Kód: Delphi [Vybrat]Pripadne jeste test uvnitr while...
SQL.OPEN; synchronize ( if task.Status in [TTaskStatus.Canceled,...] then exit; flow.beginuprade; WHILE not sql.eof ( ... SQL.Next; ) flow.endupdate; // ten se provede pro jiz vytvorene polozky i kdyz se jedna o cancel, a de facto to uz vykreslovat ani nemusi. )