Avatar billede iver25 Nybegynder
29. oktober 2001 - 19:16 Der er 14 kommentarer og
1 løsning

Farve celle i stringgrid

Jeg har læst de andre spørgsmål om at farvelægge en celle i en stringgrid. Mit problem er at jeg laver min grid i formshow, ud fra en tabel i en ACCESS database, så jeg kan ikke bruge DrawCell ligesom i de andre løsninger, for så ryger jeg ind i en uendelig løkke.
Jeg laver en løkke for hver celle i min formshow. Kan jeg ikke her sætte farven på cellen?
Avatar billede zardic Nybegynder
29. oktober 2001 - 19:38 #1
Hent HyperGrid I den kan du sette faver i et felt

http://www.pablop.demon.co.uk/marley/thypergrid.htm

Zardic
Avatar billede morten_s Nybegynder
29. oktober 2001 - 19:51 #2
Hej iver

sådan her farver jeg i et dbGrid når et nr = 14, håber du kan bruge det til lidt inspiration

procedure TFrameLog.DBGridLogDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);

  var
    x : Integer;
    OldFont : TFont;
    str : String;
    Bfarve : TColor;
    Ffarve : TColor;

begin
  with (Sender as TDBGrid).Canvas do
  begin
    OldFont:=Font;
    if gdSelected in State then
    begin
      Bfarve:=clNavy;
      Font.Color:=clWhite;
    end
    else
    begin
      if DM.DataSourceLog.DataSet.FieldByName(\'AlType\').AsInteger = 14 then
      begin
        BFarve := $00C7EEF3;
        Font.Color:=clRed;
      end
      else
      begin
        Bfarve:=clWhite;
        Font.Color:=clBlack;
      end;
    end;
    DBGridLog.Canvas.Brush.Color:=Bfarve;
    DBGridLog.Canvas.Fillrect(Rect);
    DBGridLog.Canvas.Textout(Rect.Left+5,Rect.Top+2,Str);
    Font:=OldFont;
    DBGridLog.DefaultDrawDataCell(Rect,Column.Field,State);
  end;
end;
Avatar billede morten_s Nybegynder
29. oktober 2001 - 19:57 #3
Ellers fandt jeg lige en artikel om dit issue på

http://www.delphi3000.com/articles/article_1435.asp

du er nok nødt til at oprette dig som bruger hvis du vil læse den, derfor har jeg lige lavet et dump til dig




Answer:


Unfortunately you can\'t use the same method for coloring StringGrids and DBGrids. So first let\'s have a look to the StringGrid:


1. StringGrid
=============
Use the \"OnDrawCell\"-event to make your StringGrids colorful! The following Code shows how to give your Grid a red background color. The second column will be colored with green background.


procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

Const  //define your color here. Of course you
        //can use default colors too.
  clPaleGreen = TColor($CCFFCC);
  clPaleRed =  TColor($CCCCFF);

begin

//Does the cell have the focus you have to paint it with other colors
if (gdFocused in State) then begin   
  StringGrid1.Canvas.Brush.Color := clBlack;
  StringGrid1.Canvas.Font.Color := clWhite;
end
else  //Does the cell have NOT the focus you can use
      //your personal colors here

  if ACol = 2  //the second Column should be
                //green, the other cells red
    then StringGrid1.Canvas.Brush.color := clPaleGreen
    else StringGrid1.canvas.brush.Color := clPaleRed;

//Now Paint the cells, but only, if the cell isn\'t the Title- Row/Column
//This of course depends whether you have title-Row/Columns or not.

If (ACol > 0) and (ARow>0) then
  begin
      //Painting the Background
    StringGrid1.canvas.fillRect(Rect);

      //Painting the Text. Here you can improve the code with
      // using alignment and so on.
    StringGrid1.canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
  end;
end;



If you want to colorize your cells depending on values in the cells you can replace the 3 lines (if Acol = 2 ......) with something like this

  if StringGrid1.Cells[ACol,ARow] = \'highlight it\'
    then StringGrid1.Canvas.Brush.color := clPalered
    else StringGrid1.canvas.brush.Color := clwhite;



But now lets coloring DBGrids:

2. DBGrid
=========
It\'s much easier to give color to DBGrids. Here you have to use the \"OnDrawColumnCell\"-Event. The following example is coloring the Cells of Column \"Status\" when the value is not \"a\".
If you want to color the whole line you only have to delete the \"If...\" statement (see below)



procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
                                      DataCol: Integer; Column: TColumn;
                                      State: TGridDrawState);
const
  clPaleGreen = TColor($CCFFCC);
  clPaleRed =  TColor($CCCCFF);
begin

If Column.FieldName = \'Status\' then  //Remove this line, if you want
                                    //to highlight the whole line

If Column.Field.Dataset.FieldbyName(\'Status\').AsString <> \'a\'
  then
  If (gdFocused in State) //does the cell have the focus?
    then dbgrid1.canvas.brush.color := clBlack          //focused
    else dbgrid1.canvas.brush.color := clPaleGreen;  //not focused

//Now let\'s paint the cell using a Default-Method:
dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State)
end;




That\'s all. Doesn\'t it look nice?
Avatar billede iver25 Nybegynder
29. oktober 2001 - 21:54 #4
Jeg har prøvet at hente THyperGrid som Zardic foreslog. Er der nogen der har et eksempel på hvordan man farvelægger en enkelt celle?
Avatar billede morten_s Nybegynder
29. oktober 2001 - 21:58 #5
Prøv at se det jeg har sendt til dig


If you want to colorize your cells depending on values in the cells you can replace the 3 lines (if Acol = 2 ......) with something like this

  if StringGrid1.Cells[ACol,ARow] = \'highlight it\'
    then StringGrid1.Canvas.Brush.color := clPalered
    else StringGrid1.canvas.brush.Color := clwhite;

Avatar billede iver25 Nybegynder
29. oktober 2001 - 22:03 #6
Mine celler indeholder ingenting, så jeg har ikke noget jeg kan sætte farven ud fra. Jeg er ved at lave en kalender, hvor jeg ud fra en tabel med dato, starttid, sluttid og den ansattes farve, vil lave hver celle.
Avatar billede morten_s Nybegynder
29. oktober 2001 - 22:17 #7


Hvorfor tegner du ikke selv nogle TShape i rektangel facon på dit canvas, så bestemmer du da selv højde og kulør ?
Avatar billede morten_s Nybegynder
29. oktober 2001 - 22:23 #8
Og så er det nemt, nedenstående kode giver et rektangel med citronblåstriber

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Rektangel : TShape;
begin
  Rektangel := TShape.Create(Form1);
  Rektangel.Parent  := Form1;
  Rektangel.Height := 100;
  Rektangel.Width := 20;
  Rektangel.Left := 150;
  Rektangel.Top := 150;
  Rektangel.Brush.Color := clBlue;
  Rektangel.Brush.Style :=  bsFDiagonal;
  Rektangel.Visible := True;

end;

Håber di kan bruge det (var lige hvad jeg kunne ryste ud af ærmet)

/Morten
Avatar billede morten_s Nybegynder
29. oktober 2001 - 22:27 #9
så kan du jo selv variere højde og placering + farver på de forskellige parametre Hegiht, width, top, left, brush.color og med og uden striber på brush.style
Avatar billede iver25 Nybegynder
29. oktober 2001 - 22:27 #10
Jeg kunne godt tænke mig at bruge stringgrid. Jeg skal kunne dobbeltklikke på en celle, og derefter ændre i den ansattes mødetid.

På denne side har jeg læst at man kan ændre farve i en enkelt celle med en event handler:
http://www.pablop.demon.co.uk/marley/thypergrid_details.htm

Problemet er at jeg ikke ved hvad en event handler er, og hvordan man bruger den.
Avatar billede morten_s Nybegynder
29. oktober 2001 - 22:29 #11
og husk at sæt shape til
rektangel.shape := strectangel
Avatar billede morten_s Nybegynder
30. oktober 2001 - 08:01 #12
Ja men hvad med at tilføje et OnClick event til dit rektangel, byg en ny komponent
udfra TShape og tilføj onclik eventet sådan her


unit MyShape;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, ExtCtrls;

type
  TMyShape = class(TShape)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  property OnClick;
end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(\'Samples\', [TMyTimeRecktangel]);
end;

end.



Derefter tester du hvad der sker når nogen clikker på dit recktangel sådan her


procedure TForm1.Button1Click(Sender: TObject);
var
  Rektangel : TMyShape;
begin
  Rektangel := TMyShape.Create(Form1);
  Rektangel.Parent  := Form1;
  Rektangel.Height := 100;
  Rektangel.Width := 20;
  Rektangel.Left := 150;
  Rektangel.Top := 150;
  Rektangel.Brush.Color := clBlue;
  Rektangel.Brush.Style :=  bsFDiagonal;
  Rektangel.Visible := True;
  end;

procedure TForm1.MyShape1Click(Sender: TObject);
begin
  ShowMessage(\'Nogen har cliket på mig\');
  //Her indsætter du din kode for hvad der skal ske når nogen klikker på recktanglet
end;
Avatar billede morten_s Nybegynder
30. oktober 2001 - 08:22 #13
Jeg har lavet et lille eksempel med et rektangel, med et OnClick event
hvor du kan ændre farve højde og rykke rundt på rektanglet såvidt
jeg kan se lige hvad du har behv for, du kan selv sætte din egen kode ind
når nogen klikker på rektanglet

Jeg sender det til dig hvis du ligger din mail adr
Avatar billede iver25 Nybegynder
30. oktober 2001 - 09:06 #14
Det lyder godt.

Min mail er: mail@henrikiversen.dk

Jeg ville nu gerne have haft muligheden for at farvelægge en celle, for jeg skal have en kalender for hver dag i en måned. Det bliver til ret mange firkanter, så det ville være smart hvis man kunne scrolle ligesom i en stringgrid.
Avatar billede hreiff Nybegynder
30. oktober 2001 - 20:18 #15
Prøv at se på dette, som indsætter farvede felter i stringgrid:
(Jeg har testet - og det virker)


type
  ColorArrType = array[0..3] of TColor; {kan udvides til flere farver}

const
  ColorArray: ColorArrType = (clWhite,clBlue,clGreen,ClRed);


procedure TSkriftForm.StringGridDrawCell(Sender: TObject;
            Col, Row: Longint; Rect: TRect; State: TGridDrawState);
begin
  { Udvælg baggrundsfarve }
  if gdSelected in State then     
    StringGrid.Canvas.Brush.Color := clHighlight
  else if gdFixed in State then
    StringGrid.Canvas.Brush.Color := clBtnFace
  else    {normal}
    StringGrid.Canvas.Brush.Color :=
          ColorArray[StrToInt(StringGrid.Cells[Col, Row])];

  { Udskriv tomme - hvis den udelades går noget galt}
  StringGrid.Canvas.TextRect(Rect, Rect.Left, Rect.Top,\' \');
end;

procedure TSkriftForm.FormCreate(Sender: TObject);
var
  I, J: Integer;
begin
  { Fylder ud med 0\'er }
  for I := 0 to StringGrid.ColCount - 1 do
    for J:= 0 to StringGrid.RowCount - 1 do
      StringGrid.Cells[I, J] := \'0\';

  StringGrid.Cells[1, 3] := \'1\'; {blå i hht ColorArray}
  StringGrid.Cells[2, 2] := \'2\'; {grøn i hht ColorArray}
  StringGrid.Cells[0, 2] := \'3\'; {rød i hht ColorArray}
end;

Kan naturligvis også ændres i runtime:
  StringGrid.Cells[x,y] := ord(farvenummer)

//hreiff
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester