Autor Téma: Zmena gradientu v runtime  (Přečteno 416 krát)

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: FPC :D
Zmena gradientu v runtime
« kdy: 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
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Zmena gradientu v runtime
« Odpověď #1 kdy: 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.  
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5917
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Zmena gradientu v runtime
« Odpověď #2 kdy: 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í
  • človek si vyjasní o čom to vlastne je
  • uvoľníš sa, zlikviduješ blok, a tým dáš mozgu šancu problém spracovať
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.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Zmena gradientu v runtime
« Odpověď #3 kdy: 04-08-2021, 19:30:04 »
Jop
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux