Forum Delphi.cz

Delphi => Firemonkey => Téma založeno: raul 04-08-2021, 18:48:04

Název: Zmena gradientu v runtime
Přispěvatel: raul 04-08-2021, 18:48:04
Zdarec,
narazil jsem na takovou zapeklitost. Mam na jedne tShape gradient s 5 body. De facto tim gradientem vybarvuji onu tShape, s tim, ze ve vysledku se nejedna o gradient, ale dva pruhy pres onen tShape. Problem je, ze pri prirazeni offset danemu tGradientPoint dojde k serazeni pointu Gradientu, ktery se pak rozhodi.

Kód: Delphi [Vybrat]
  1.    
  2.    var old_off1 := Obsah.Fill.Gradient.Points[1].Offset;
  3.    var old_off2 := Obsah.Fill.Gradient.Points[2].Offset;
  4.    var old_off3 := Obsah.Fill.Gradient.Points[3].Offset;
  5.    var old_off4 := Obsah.Fill.Gradient.Points[4].Offset;
  6.  
  7.    var off1 := KolikBudemeMit-0.003;
  8.    var off2 := KolikBudemeMit-0.002;
  9.    var off3 := KolikMame-0.001;
  10.    var off4 := KolikMame;
  11.  
  12.    Obsah.Fill.Gradient.Points[1].Offset := off1;
  13.    Obsah.Fill.Gradient.Points[2].Offset := off2;
  14.  
  15.    Obsah.Fill.Gradient.Points[3].Offset := off3;
  16.    Obsah.Fill.Gradient.Points[4].Offset := off4;
  17.  
  18.    var new_off1 := Obsah.Fill.Gradient.Points[1].Offset;
  19.    var new_off2 := Obsah.Fill.Gradient.Points[2].Offset;
  20.    var new_off3 := Obsah.Fill.Gradient.Points[3].Offset;
  21.    var new_off4 := Obsah.Fill.Gradient.Points[4].Offset;
  22.  

Hodnoty off<x> jsou v poradku; new_off<x> uz v poradku nejsou, neb v prirazeni dojde k serazeni toho pole, ktere je v teto chvili lokalne neplatne. Jasne, mohu resit, jestli mam hodnotu mensi ci vetsi nez predchozi a dalsi hodnotu, ale...

Metoda setOffset u gradientPoint:
Kód: Delphi [Vybrat]
  1.  
  2. if not SameValue(FOffset, Value, Single.Epsilon) then
  3.   begin
  4.     FOffset := Value;
  5.     Changed(False);
  6.   end;
  7.  

Problem je v Changed, ktere kdyz obsahuje false, seradi seznam pointu. Bohuzel je setOffset privatni (misto protected), tudiz nejde pretizit.

Da se s tim nejak hnout, nebo se da treba lokalne provest jaky begin/end update a nastavit offsety bez serazovani ?

Diky
Název: Re:Zmena gradientu v runtime
Přispěvatel: raul 04-08-2021, 18:51:17
Sakra,
proc to cloveku dojde hned, jak napise dotaz?

Kód: Delphi [Vybrat]
  1.    
  2.    Obsah.fill.Gradient.Points.BeginUpdate;
  3.    Obsah.Fill.Gradient.Points[1].Offset := off1;
  4.    Obsah.Fill.Gradient.Points[2].Offset := off2;
  5.    Obsah.Fill.Gradient.Points[3].Offset := off3;
  6.    Obsah.Fill.Gradient.Points[4].Offset := off4;
  7.    Obsah.fill.Gradient.Points.EndUpdate;
  8.  
Název: Re:Zmena gradientu v runtime
Přispěvatel: Stanislav Hruška 04-08-2021, 19:16:22
Sakra,
proc to cloveku dojde hned, jak napise dotaz?
Lebo napísaním a odoslaním otázky sa stane niekoľko vecí
Mne sa to stáva bežne. Preto si niektoré otázky najprv napíšem, ale neodošlem. Pokiaľ mi nič nenapadne, tak to pošlem.
Název: Re:Zmena gradientu v runtime
Přispěvatel: raul 04-08-2021, 19:30:04
Jop