Автор: Alex Schlecht

 StringGrids / DBGrids с цветными ячейками смотрятся очень красиво, и Вы можете информировать пользователя о важных данных внутри Grid.

Совместимость: все версии Delphi

К сожалению, невозможно применить один и тот же метод к StringGrids и к DBGrids. Итак сперва рассмотрим как это сделать в StringGrid:

1. StringGrid

=============

Для раскрашивания будем использовать событие "OnDrawCell". Следующий код показывает, как сделать в Grid красный бэкраунд. Бэкграунд второй колонки будет зелёным.

 

 

Автор: Dennis Passmore

  

Поскольку свойство Cols[x] компонента TStringGrid реально является компонентом TStrings, все методы TStrings применимы также и к Cols[x].

 

Недавно в интернете я нашел реализацию расширенных функций TStringGrid:

 

 

Code:

Procedure GridRemoveColumn(StrGrid: TStringGrid; DelColumn: Integer);

Var Column: Integer;

begin

If DelColumn <= StrGrid.ColCount then

Begin

   For Column := DelColumn To StrGrid.ColCount-1 do

     StrGrid.Cols[Column-1].Assign(StrGrid.Cols[Column]);

   StrGrid.ColCount := StrGrid.ColCount-1;

End;

end;

 

Code:

procedure SGInsertRow(SG: TStringGrid; NewRow: Integer);

var

i: Integer;

begin

if NewRow < 0 then

   NewRow := 0; // либо 1, задайте нужное вам поведение

with SG do

begin

   RowCount := RowCount + 1;

   if NewRow < RowCount - 1 then

   begin

     for i := RowCount - 1 downto NewRow + 1 do

       Rows[i].Assign(Rows[i - 1]);

   end;

   Rows[NewRow].Clear;

end;

end;

 

В обработчике события OnDrawCell элемента StringGrid поместите следующий код:

 

Code:

with (Sender as TStringGrid) do

with Canvas do

begin

   {...}

   Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);

   {...}

end;

  

Используйте метод Draw() или StretchDraw() класса TCanvas. Image1 - это TImage с предварительно загруженным в него bitmap-ом.

 

Code:

Procedure GridAddColumn(StrGrid: TStringGrid; NewColumn: Integer);

Var Column: Integer;

begin

StrGrid.ColCount := StrGrid.ColCount+1;

For Column := StrGrid.ColCount-1 downto NewColumn do

   StrGrid.Cols[Column].Assign(StrGrid.Cols[Column-1]);

StrGrid.Cols[NewColumn-1].Text := '';

end;

 

Code:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Grids, StdCtrls;

 

type

TForm1 = class(TForm)

   StringGrid1: TStringGrid;

   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

     Rect: TRect; State: TGridDrawState);

   procedure FormCreate(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

 

const

cell_x = 2;

cell_y = 2;

 

var

Form1: TForm1;

CheckBox1: TCheckBox;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

var

r:trect;

begin

if(cell_x>=StringGrid1.LeftCol) and

  (cell_x<=StringGrid1.LeftCol+StringGrid1.VisibleColCount) and

  (cell_y>=StringGrid1.TopRow) and

  (cell_x<=StringGrid1.TopRow+StringGrid1.VisibleRowCount) then

    CheckBox1.Visible:=true

else

    CheckBox1.Visible:=false;

 

if (acol=cell_x) and (arow=cell_y) then

begin

  r:=stringgrid1.CellRect(cell_x,cell_y);

  r.Left:=r.left+stringgrid1.left+2;

  r.right:=r.right+stringgrid1.left+2;

  r.top:=r.top+stringgrid1.top+2;

  r.bottom:=r.bottom+stringgrid1.top+2;

  CheckBox1.BoundsRect:=r;

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

CheckBox1:=TCheckBox.Create(form1);

CheckBox1.parent:=form1;

CheckBox1.Caption:='proba';

end;

 

end.

 

 

Можно сделать наследника от TCustomGrid. А у последнего есть метод - DeleteRow.

Автор: Song

Например удаление текущей строки:

Code:

Type TFakeGrid=class(TCustomGrid);

{©Drkb v.3(2007): www.drkb.ru,

®Vit (Vitaly Nevzorov) - Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.}

 

procedure TForm1.MyDelete(Sender: TObject);

begin

TFakeGrid(Grid).DeleteRow(Grid.row);

end;

Code:

procedure TForm1.FormCreate(Sender: TObject);

begin

{Высоту combobox'а не изменишь, так что вместо combobox'а

будем изменять высоту строки grid'а !}

StringGrid1.DefaultRowHeight := ComboBox1.Height; {Спрятать combobox}

ComboBox1.Visible := False; ComboBox1.Items.Add('Delphi Kingdom');

ComboBox1.Items.Add('Королевство Дельфи');

end;

 

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

{Перебросим выбранное в значение из ComboBox в grid}

StringGrid1.Cells[StringGrid1.Col,

StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];

ComboBox1.Visible := False; StringGrid1.SetFocus;

end;

 

procedure TForm1.ComboBox1Exit(Sender: TObject);

begin

{Перебросим выбранное в значение из ComboBox в grid}

StringGrid1.Cells[StringGrid1.Col,

StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];

ComboBox1.Visible := False; StringGrid1.SetFocus;

end;

 

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,

ARow: Integer; var CanSelect: Boolean);

var

R: TRect;

begin

if ((ACol = 3) and (ARow <> 0)) then

begin

   {Ширина и положение ComboBox должно соответствовать ячейке StringGrid}

   R := StringGrid1.CellRect(ACol, ARow); R.Left := R.Left + StringGrid1.Left;

   R.Right := R.Right + StringGrid1.Left; R.Top := R.Top + StringGrid1.Top;

   R.Bottom := R.Bottom + StringGrid1.Top; ComboBox1.Left := R.Left + 1;

   ComboBox1.Top := R.Top + 1; ComboBox1.Width := (R.Right + 1) - R.Left;

   ComboBox1.Height := (R.Bottom + 1) - R.Top; {Покажем combobox}

   ComboBox1.Visible := True; ComboBox1.SetFocus;

end;

CanSelect := True;

end;

 

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

  i, k: Integer;

begin

  with StringGrid1 do

    for i := 0 to ColCount - 1 do

      for k := 0 to RowCount - 1 do

        Cells[i, k] := '';

end;

Автор: SottNick

 

Если в таблице вы используете событие OnDrawCell для помещения в ячейку рисунка, причем различного, в зависимости, например, от соответствующего значения в двумерном массиве, и вам надо, чтобы после изменения значения в массиве обновилось изображение (Refresh не подходит, т.к. будет мелькать), то измените значение у ячейки (DrawGrid не годится):

 

Code:

StringGrid1.Cells[i,j]:='';

или

Code:

StringGrid1.Cells[i,j]:=StringGrid1.Cells[i,j];

если там что-то хранится