StringGrid
Автор: Alex Schlecht
StringGrids / DBGrids с цветными ячейками смотрятся очень красиво, и Вы можете информировать пользователя о важных данных внутри Grid.
Совместимость: все версии Delphi
К сожалению, невозможно применить один и тот же метод к StringGrids и к DBGrids. Итак сперва рассмотрим как это сделать в StringGrid:
1. StringGrid
=============
Для раскрашивания будем использовать событие "OnDrawCell". Следующий код показывает, как сделать в Grid красный бэкраунд. Бэкграунд второй колонки будет зелёным.
- Подробности
- Родительская категория: StringGrid
- Категория: Цвета текста, ячеек, столбцов и колонок
Автор: Dennis Passmore
Поскольку свойство Cols[x] компонента TStringGrid реально является компонентом TStrings, все методы TStrings применимы также и к Cols[x].
Недавно в интернете я нашел реализацию расширенных функций TStringGrid:
- Подробности
- Родительская категория: StringGrid
- Категория: Удаление и добавление столбцов и колонок
| 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; | 
- Подробности
- Родительская категория: StringGrid
- Категория: Удаление и добавление столбцов и колонок
| 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; | 
- Подробности
- Родительская категория: StringGrid
- Категория: Удаление и добавление столбцов и колонок
В обработчике события 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-ом.
- Подробности
- Родительская категория: StringGrid
- Категория: Вставка объектов в ячейки
| 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; | 
- Подробности
- Родительская категория: StringGrid
- Категория: Удаление и добавление столбцов и колонок
| 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. 
 | 
- Подробности
- Родительская категория: StringGrid
- Категория: Вставка объектов в ячейки
Можно сделать наследника от 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; | 
- Подробности
- Родительская категория: StringGrid
- Категория: Удаление и добавление столбцов и колонок
| 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; 
 | 
- Подробности
- Родительская категория: StringGrid
- Категория: Вставка объектов в ячейки
| 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; | 
- Подробности
- Родительская категория: StringGrid
- Категория: Удаление и добавление столбцов и колонок
Автор: SottNick
Если в таблице вы используете событие OnDrawCell для помещения в ячейку рисунка, причем различного, в зависимости, например, от соответствующего значения в двумерном массиве, и вам надо, чтобы после изменения значения в массиве обновилось изображение (Refresh не подходит, т.к. будет мелькать), то измените значение у ячейки (DrawGrid не годится):
| Code: | 
| StringGrid1.Cells[i,j]:=''; | 
или
| Code: | 
| StringGrid1.Cells[i,j]:=StringGrid1.Cells[i,j]; | 
если там что-то хранится
- Подробности
- Родительская категория: StringGrid
- Категория: Вставка объектов в ячейки
Страница 5 из 6
