Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Delphi - kolor panel

[es] :: Pascal / Delphi / Kylix :: Delphi - kolor panel

[ Pregleda: 1636 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

franjo_tahi2
Franjo Tahi
Zagreb

Član broj: 289851
Poruke: 43
*.adsl.net.t-com.hr.



Profil

icon Delphi - kolor panel31.01.2014. u 13:13 - pre 124 meseci
Koristim tPanel koji bojam procedurom (dolje)
Procedura lijepo oboji (gradient), ali se događa nešto čudno:

Na formi imam tEdit kontrole. Ako nakon bojanja uđem u tEdit i upisujem tekst - OK, ali ako pritisnem: strelice (gore, dolje, lijevo ili desno) ili TAB, boja se vrati na postavljenu, boju prije poziva funkcije.

Ako nakon toga pono obojim panel, više ne gubi boju.
Ako pritisnem strelicu u edit kontroli, a ankon toga obojim panel - ne gubi se boja

Znači: samo u slučaju:
1. Obojim panel
2. u edit kontroli pritisnem neku od tipki: strelice (svi smjerovi), tab

definicije:
Code:


type
  tmp = class(TPanel);
   ...
   po1: TPanel;


Poziv procedure za bojanje panela:
Code:

GradVertical(tmp(po1).Canvas, po1.ClientRect, $00FEF1B8, clBlue) ;



Code:

procedure TForm3.GradVertical(Canvas:TCanvas; Rect:TRect; FromColor, ToColor:TColor) ;
 var
   Y, x:integer;
   dr,dg,db:Extended;
   C1,C2:TColor;
   r1,r2,g1,g2,b1,b2:Byte;
   R,G,B:Byte;     
   cnt:Integer;
   mi: integer;
 begin
    C1 := FromColor;
    R1 := GetRValue(C1) ;
    G1 := GetGValue(C1) ;
    B1 := GetBValue(C1) ;
 
    C2 := ToColor;
    R2 := GetRValue(C2) ;
    G2 := GetGValue(C2) ;
    B2 := GetBValue(C2) ;

    
 
    dr := ((R2-R1) / Rect.Bottom-Rect.Top);
    dg := ((G2-G1) / Rect.Bottom-Rect.Top);
    db := ((B2-B1) / Rect.Bottom-Rect.Top);
 
    cnt := 0;
    mi := rect.Bottom div 2;

    for Y := Rect.Top to mi do
    begin
       R := R1+Ceil(dr*cnt) ;
       G := G1+Ceil(dg*cnt);
       B := B1+Ceil(db*cnt) ;
 
       Canvas.Pen.Color := RGB(R,G,B) ;
       Canvas.MoveTo(Rect.Left,Y) ;
       Canvas.LineTo(Rect.Right,Y) ;
       Inc(cnt) ;
    end;     
    
    cnt := 0;
    for Y := Rect.Bottom - 1 downto mi do
    begin
       R := R1 - Ceil(dr*cnt) ;
       G := G1 - Ceil(dg*cnt) ;
       B := B1 - Ceil(db*cnt) ;
 
       Canvas.Pen.Color := RGB(R,G,B) ;
       Canvas.MoveTo(Rect.Left,Y) ;
       Canvas.LineTo(Rect.Right,Y) ;
       Dec(cnt) ;
    end;     
end;
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Delphi - kolor panel31.01.2014. u 21:22 - pre 124 meseci
Desava se nesto cudno, zato sto i sam radis nesto cudno (sto smo svi nekad radili/radimo ;)

Koristis "hack" (tvoja tmp klasa) da bi pristupio propertiju Canvas, koji inace nije public za TPanel klasu. Nekad ovakve vratolomije mogu da prodju bez problema, ali se moze i desiti da se pojavi neka "neocekivana funkcionalnost", sto je kod tebe slucaj. Objasnjenje sta se tacno desava mozes potraziti u samoj klasi TPanel, i nacinu na koji ona interno funkcionise.

U jos jednoj situaciji ti se gubi gradijentna boja kojom si obojio panel - ako uhvatis prozor u kome je panel, i povuces ga tako da izadje van ekrana (tako da i deo panela bude van ekrana), a zatim ga vratis nazad, videces da je deo panela koji je bio van ekrana ponovio "izgubio boju", tj. vratio se na default. I to se uvek desava, bez obzira koliko puta nakon toga bojio panel, ako ga povuces van ekrana i vratis nazad, opet nema boje (taj deo sto je bio napolju).

Ovakvo ponasanje ukazuje da nije bas sve u najboljem redu sto se iscrtavanja samog panela tice (a koje se inace obavlja manje vise automatski u samoj komponenti). Kako ti na nepredvidjen nacin pristupas necemu (Canvas) i menjas ga, a da sama komponenta toga nije svesna jer koristis "zaobilazni put" (hack), kada dodje vreme da se komponenta ponovo iscrta, ona se vraca u prvobitno stanje - jer se, realno, u samoj komponenti nista nije promenilo, ti si samo nasao nacin da privremeno nesto iscrtas na Canvas panela.

Za nesto bolji pristup, koji bi trebalo da radi bez neocekivanih nuspojava, jedno od mogucih resenja je da u svojoj tmp klasi override-ujes Paint() metodu, pa da u njoj odradis sta ti treba - tako ce komponenta svaki put samu sebe da iscrta onako kako tebi odgovara, a to ce biti i u skladu sa nacinom na koji sama komponenta radi, bez potrebe za nalazenjem "alternativnih resenja" (pocetak primera ovde) :)

Naravno, ovakav pristup podrazumeva da tvoj panel onda zaista bude klase tmp. Ne znam koji Delphi koristis, ali ako ti bas treba da ostane klasa TPanel, pogledaj class helper-e, mada njihova upotreba nije za kod koji ide u produkciju. Jos jedna zanimljiva alternativa za kucnu radinost je class interceptor, primer.

Pozdrav, BugA :)



[Ovu poruku je menjao ((BugA)) dana 31.01.2014. u 22:38 GMT+1]
 
Odgovor na temu

franjo_tahi2
Franjo Tahi
Zagreb

Član broj: 289851
Poruke: 43
*.dsl.iskon.hr.



Profil

icon Re: Delphi - kolor panel01.02.2014. u 21:35 - pre 124 meseci
Zahvaljujem na odgovoru. Nije mi jasno kako i sam to nisam zaključio... logično je.
Panel ovako obojan se samo bio veće klase, mogao bih uzeti ne neku drugu, ali mi panel najviše odgovara (najmanje posla na doradi).
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Delphi - kolor panel

[ Pregleda: 1636 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.