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

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 468
  • 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, (občas Delphi)

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 468
  • 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, (občas Delphi)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7424
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
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.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 468
  • 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, (občas Delphi)