Schimbarea culorii celulelor din tabel, atunci când umplerea stringgrid

Schimbarea culorii celulelor din tabel, atunci când umplerea StringGrid

Deduc soluția problemelor sale în StringGrid. Ai nevoie pentru a picta o anumită culoare la soluția optimă a celulei. Aceasta este, într-o singură linie, doar o singură celulă trebuie să fie vopsit.

Cum să pună în aplicare acest lucru?

precum și un eveniment cu un buton pentru a lega?

> Și ca un eveniment cu un buton pentru a lega?

Eveniment (OnDrawCell pentru StringGrid) trebuie să fie stabilite în Object Inspector (du-te la tab-ul „Evenimente“ și acolo faceți dublu clic pe butonul stâng al mouse-ului pe eveniment adecvat pentru un handler să-l).

Și ce se întâmplă când este apăsată o tastă? Dacă numai după presare trebuie să picteze StringGrid, trebuie doar să creați variabile colorate = false, și atribuiți un manipulator cheie adevărat. Și OnDrawCell verifica dacă colorat = true, apoi picta.

și, astfel, este necesar să se utilizeze StringGrid.Repaint.

Procedura TForm1.StringGrid1DrawCell (Expeditor: TObject; AcOI, Arow: Integer;
# XA0; Dreptunghi: TRect; Stat: TGridDrawState);
începe
# XA0; dacă AcOI = 0 atunci # XA0; // vopsea prima celulă din rândul
# XA0; începe
# XA0; # XA0; stringGrid1.Canvas.Brush.Color: = clGray;
# XA0; # XA0; stringGrid1.Canvas.FillRect (RECT);
# XA0; end;

StringGrid.Repaint în orice caz!

> Și astfel, este necesar să se utilizeze StringGrid.Repaint.

Dacă anterior nu a pictat masă și acum (de exemplu, după ce faceți clic pe butonul), v-ați decis că ar trebui să înceapă să picteze (colorat = true), probabil nu doare pentru a apela Refresh, altfel masa poate fi redesenat numai atunci când este necesar. Dar atunci nici Refresh Revopsiți orice cauză nu va fi necesar (în special în OnDrawCell) - tabel va atrage în sine pe după cum este necesar.

Într-un fel pictat pe toată masa, iar textul nu este vizibil:

Procedura Tmain.stDrawCell (Expeditor: TObject; AcOI, Arow: Integer;
# XA0; Dreptunghi: TRect; Stat: TGridDrawState);
începe
în cazul în care culoarea = true atunci
începe
st.Canvas.Brush.Color: = clGreen;
st.Canvas.FillRect (RECT);
se încheie;
se încheie;

Procedura Tmain.Button9Click (Expeditor: TObject);
i var, j: integer;
începe
colorat: = false;
pentru i: = 0 până la st.RowCount-1 do
pentru j: = 0 până la st.ColCount-1 do
începe
# XA0; colorat: = false;
# XA0; dacă (j = opt [i]), apoi colorată: = true;
# XA0; st.Cells [j, i]: = floattostr (reshc [i, j]) + "" + floattostr (Rasht [i, j]);
# XA0; st.Refresh;
se încheie;
se încheie;

nenarisovannogo text și nu ar trebui să fie văzut

Ursul purcel
și mai mult?

Condiția atunci când aveți nevoie pentru a picta celulă și atunci când nu este nevoie de a pune în OnDrawCell. Iată un exemplu:

Procedura TForm1.Button1Click (Expeditor: TObject);
începe
# XA0; colorat: = true;
# XA0; st.Refresh;
se încheie;

Procedura TForm1.stDrawCell (Expeditor: TObject; AcOI, Arow: Integer;
# XA0; Dreptunghi: TRect; Stat: TGridDrawState);
începe
# XA0; dacă (colorate) și (AcOI mod 2 = Arow mod 2)
# XA0; apoi st.Canvas.Brush.Color: = clWhite
# XA0; st.Canvas.Brush.Color altceva: = clBlack;

Unde altundeva ceva mai mult?
textul nu este desenată.
ceea ce ar trebui să fie văzut în același timp?

Paul I.
Mi se pare modul în care este, cu excepția pentru această afecțiune (AcOI mod 2 = Arow mod 2)

Apoi, el umple șah

Ursul LMC
dar prin apăsarea tastelor de la mine, după masa de umplut

și ce?
tu (tabelul) nu poți vedea?

Ursul LMC
Văd dar celulele goale (verzi) în ele, deși am adăuga text


> Basilisk # XA0; (05.04.11 14:12) [10]
>
> Ursul purcel
> Și mai mult?

Detaliile sunt în ajutor și profesorul.

> Basilisk # XA0; (05.04.11 14:19) [14]
>
> Ursul LMC
> Dar prin apăsarea tastelor de la mine, după masa de umplut

Completarea unui tabel și desen propriile tranzacții sunt diferite și independente.

> Mi se pare modul în care este, cu excepția pentru această afecțiune (AcOI MoD
> 2 = Arow mod 2)
>
> Apoi, el umple șah

In schimb, se introduce starea dumneavoastră: "dacă (j = opt [i])". acum este în Button9Click, dar ar trebui să fie în stDrawCell. În primul rând efectuate Button9Click și seturi colorate la true. Apoi, dacă este necesar, se efectuează redesenare stDrawCell, în care trebuie să verifice dacă este necesară celula pentru a decora și decora.

Văd dar celulele goale (verzi) în ele, deși am adăuga text

Tot desenată - vezi.
Toate lucrurile pe care nu trage - nu poți vedea.
Cel puțin nu ar trebui să vadă în starea normală de conștiință.

> Celulă goală (verde), cu toate că am adăuga text

Aici, cu încheierea textului:

Procedura TForm1.Button1Click (Expeditor: TObject);
începe
# XA0; st.Cells [1, 1]: = "aaa";
# XA0; colorat: = true;
# XA0; st.Refresh;
se încheie;

Procedura TForm1.stDrawCell (Expeditor: TObject; AcOI, Arow: Integer;
# XA0; Dreptunghi: TRect; Stat: TGridDrawState);
începe
# XA0; dacă (colorate) și (AcOI mod 2 = Arow mod 2)
# XA0; apoi st.Canvas.Brush.Color: = clWhite
# XA0; st.Canvas.Brush.Color altceva: = clBlack;

# XA0; st.Canvas.FillRect (Dreptunghi);
# XA0; st.Canvas.TextRect (Rect, Rect.Left, Rect.Top, st.Cells [AcOI, Arow]);
se încheie;

Chiar și posibil fără „st.Canvas.FillRect (Dreptunghi);“, deoarece proprii TextRect fundal atrage.

Procedura Tmain.stDrawCell (Expeditor: TObject; AcOI, Arow: Integer;
# XA0; Dreptunghi: TRect; Stat: TGridDrawState);
i var, j: integer;
începe
pentru i: = 0 până la st.RowCount-1 do
pentru j: = 0 până la st.ColCount-1 do
începe
dacă (colorat = true) și (j = opt [i]), atunci # XA0; st.Canvas.Brush.Color: = clGreen
st.Canvas.Brush.Color altceva: = clWhite;
st.Canvas.FillRect (Rect);
st.Canvas.TextRect (Rect, Rect.Left, Rect.Top, st.Cells [AcOI, Arow]);
se încheie;
se încheie;

Procedura Tmain.Button9Click (Expeditor: TObject);
i var, j: integer;
începe
pentru i: = 0 până la st.RowCount-1 do
pentru j: = 0 până la st.ColCount-1 do
începe
# XA0; st.Cells [j, i]: = floattostr (reshc [i, j]) + "" + floattostr (Rasht [i, j]);
# XA0; colorat: = true;
# XA0; st.Refresh;
se încheie;

Textul este vizibil, dar celulele sunt încă toate vopselele

> Pentru i: = 0 până la st.RowCount-1 do
> Pentru j: = 0 până la st.ColCount-1 do

Acest ciclu nu stDrawCell necesar. stDrawCell pentru fiecare celulă se numește, coordonatele celulei pentru care a fost numit stDrawCell puteți afla citind parametrii și AcOI Arow. Ie în interiorul stDrawCell nevoie pentru a decora doar o singură celulă - cu coordonatele [AcOI; Arow]:

dacă (colorat = true) și (AcOI = opt [i]), atunci # XA0; st.Canvas.Brush.Color: = clGreen
st.Canvas.Brush.Color altceva: = clWhite;
st.Canvas.FillRect (Rect);
st.Canvas.TextRect (Rect, Rect.Left, Rect.Top, st.Cells [AcOI, Arow]);

De ce această dublă buclă moronic în interiorul evenimentului de vopsea?

dacă (colorat = true) și (AcOI = opt [i]), atunci # XA0; st.Canvas.Brush.Color: = clGreen

Va multumesc tuturor))))

articole similare