Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизКак изменит фон в ячейке StringGrid ? Найти похожие ветки
← →
kyn66 © (2005-08-29 11:37) [0]Уважаемые мастера, есть сетка 10х10, заполненная цифрами 1..100. Как мне в определенный момент времени изменить фон в определенной ячейке, содержащее определенное число? Спасибо.
← →
Юрий Зотов © (2005-08-29 11:55) [1]См. в справке событие OnDrawCell.
← →
kyn66 © (2005-08-29 12:44) [2]Этот обработчик постоянно генерится, а мне нужно в конкретный момент времени, на уже заполненной ячейке изменить фон.
← →
Shopot © (2005-08-29 12:58) [3]
procedure StringGrid.OnDrawCell ()
begin
// а здесь оределяем какая ячейка рисуется в данный момент
// и если это наша ячейка, то...
if (ARow = ...) and (ACol = ...)
begin
StringGrid.Canvas.Brush.Color := clRed;
StringGrid.Canvas.Brush ...;
end else
begin
StringGrid.Canvas.Brush.Color := clWindow;
... // возвращаем измененные свойства Brush на место
end;
end;
← →
Leonid Troyanovsky © (2005-08-29 12:58) [4]
> kyn66 © (29.08.05 12:44) [2]
> Этот обработчик постоянно генерится, а мне нужно в конкретный
> момент времени, на уже заполненной ячейке изменить фон.
У TCustomGrid есть метод InvalidateCell.
--
Regards, LVT.
← →
kyn66 © (2005-08-29 14:50) [5]>> Shopot
А конкретно к Cells можно применить?
← →
Юрий Зотов © (2005-08-29 14:55) [6]> kyn66 © (29.08.05 12:44) [2]
> Этот обработчик постоянно генерится
Не постоянно, а тогда, когда требуется перерисовать ячейку.
> мне нужно в конкретный момент времени, на уже заполненной
> ячейке изменить фон.
Перерисовка не бывает "в конкретный момент времени", это не разовое событие. Например, проведите по своей форме другим окном - вот и нужна перерисовка. И никто не мешает отрисовать любую ячейку так, как нужно (см. [3]).
← →
Leonid Troyanovsky © (2005-08-29 15:02) [7]
> Юрий Зотов © (29.08.05 14:55) [6]
> Перерисовка не бывает "в конкретный момент времени", это
> не разовое событие. Например, проведите по своей форме другим
> окном - вот и нужна перерисовка. И никто не мешает отрисовать
> любую ячейку так, как нужно (см. [3]).
Не [3], а [1] и [4].
А цвет надо брать, например, из массива Objects.
--
Regards, LVT.
← →
kyn66 © (2005-08-29 16:35) [8]А можно конкретнее на примере, как в [3]. А то это так образно для меня 8-(
← →
Leonid Troyanovsky © (2005-08-29 16:48) [9]
> kyn66 © (29.08.05 16:35) [8]
> А можно конкретнее на примере, как в [3]. А то это так образно
> для меня 8-(
By Peter Below (TeamB)
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/de01c9ce4c903cff
--
Regards, LVT.
← →
kyn66 © (2005-08-29 17:22) [10]>> Leonid Troyanovsky
За пример спасибо. Однако там идет явное выделение мышкой. А мен нужно, чтобы эта сетка была как-бы просто информационная. Я в Едит1 ввожу число, нажимаю кнопку, а в сетке, должна закраситься та ячейка, которая имеет этот номер, который я ввел в Едит1. Во как нуно. Может это вааще проблематично извоять?
← →
Юрий Зотов © (2005-08-29 18:45) [11]> kyn66 © (29.08.05 17:22) [10]
unit Unit1;
interface
uses
Windows, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid: TStringGrid;
ColComboBox: TComboBox;
RowComboBox: TComboBox;
ColorButton: TButton;
ColorDialog: TColorDialog;
procedure FormCreate(Sender: TObject);
procedure Apply(Sender: TObject);
procedure StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure ColorButtonClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
procedure FillComboBox(ComboBox: TComboBox; FixedCount, Count: integer);
var
i: integer;
begin
for i := FixedCount to Count - 1 do
ComboBox.Items.Add(IntToStr(i));
ComboBox.ItemIndex := 0
end;
var
i, j: integer;
begin
with StringGrid do
begin
ColorDialog.Color := Color;
FillComboBox(ColComboBox, FixedCols, ColCount);
FillComboBox(RowComboBox, FixedRows, RowCount);
for i := 0 to FixedCols - 1 do
for j := 1 to RowCount - 1 do
Cells[i, j] := IntToStr(j);
for i := 0 to FixedRows - 1 do
for j := 1 to ColCount - 1 do
Cells[j, i] := IntToStr(j);
for i := FixedCols to ColCount - 1 do
for j := FixedRows to RowCount - 1 do
Cells[i, j] := Format("%d%d", [i, j])
end
end;
procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if not (gdFixed in State) then
with StringGrid, Canvas do
begin
if (ACol = ColComboBox.ItemIndex + FixedCols) and (ARow = RowComboBox.ItemIndex + FixedRows) then
Brush.Color := ColorDialog.Color
else
Brush.Color := Color;
FillRect(Rect);
Font.Color := StringGrid.Font.Color;
with Rect do
TextRect(Rect, Left + 2, (Bottom + Top - TextHeight(Cells[ACol, ARow])) div 2, Cells[ACol, ARow])
end
end;
procedure TForm1.Apply(Sender: TObject);
begin
StringGrid.Invalidate
end;
procedure TForm1.ColorButtonClick(Sender: TObject);
begin
if ColorDialog.Execute then
Apply(ColorDialog)
end;
end.
И файл DFM этой формы:
object Form1: TForm1
Left = 300
Top = 273
Width = 446
Height = 167
Caption = "Нужно лишь чуть-чуть подумать САМОМУ..."
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
DesignSize = (
438
138)
PixelsPerInch = 120
TextHeight = 16
object StringGrid: TStringGrid
Left = 0
Top = 0
Width = 340
Height = 137
Anchors = [akLeft, akTop, akRight, akBottom]
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing]
TabOrder = 0
OnDrawCell = StringGridDrawCell
end
object ColComboBox: TComboBox
Left = 354
Top = 12
Width = 75
Height = 24
Style = csDropDownList
Anchors = [akTop, akRight]
ItemHeight = 16
TabOrder = 1
OnChange = Apply
end
object RowComboBox: TComboBox
Left = 354
Top = 48
Width = 75
Height = 24
Style = csDropDownList
Anchors = [akTop, akRight]
ItemHeight = 16
TabOrder = 2
OnChange = Apply
end
object ColorButton: TButton
Left = 354
Top = 105
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = "Color..."
TabOrder = 3
OnClick = ColorButtonClick
end
object ColorDialog: TColorDialog
Left = 172
Top = 76
end
end
← →
Германн © (2005-08-30 01:27) [12]Юра и Лёня!
Объедините Ваши усилия и предложите вариант, который будет отрисовывать как у Юрия, но и тогда как у ЛТ.
← →
kyn66 © (2005-08-30 10:21) [13]Уже ближе, но еще не то. Здесь в примере, при смене ячейки закрашивается новая, а старая цвет теряет. Мне нужно, чтобы он оставался. Чтобы было понятнее, знаете игру Ваше лото, так вот там на экране закрашивают квадраты при каждом новом ходе, т.е., показывая тем самым, сколько ходов уже сделано и сколько и каких пустых осталось. Вот типа этого мне нужно.
← →
Alexander Panov © (2005-08-30 11:15) [14]kyn66 © (30.08.05 10:21) [13]
А подумать немного?
Вот пример, но его нужно дорабатывать. Дерзай.procedure TForm1.sgSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
sg.Objects[ARow,ACol] := Pointer(1);
sg.Invalidate;
end;
procedure TForm1.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if sg.Objects[ARow,ACol]<>nil then
begin
sg.Canvas.Brush.Color := clGreen;
end
else
begin
sg.Canvas.Brush.Color := clWhite;
end;
sg.Canvas.FillRect(Rect);
sg.Canvas.TextOut(Rect.Left+1,Rect.Top+1,sg.Cells[ACol,ARow]);
end;
← →
kyn66 © (2005-08-30 11:40) [15]Т.е. из этого следует, что сначала нужно принудительно вызвать событие SelectCell и через объект вставить в ячейку некую метку, а затем через стандартный обработчик ее проверять? Неплохо. Нужно развить мысль.
← →
kyn66 © (2005-08-30 12:06) [16]>> Alexander Panov
Все, заработало! Огромное спасибо за толчок! То что доктор прописал !
← →
Leonid Troyanovsky © (2005-08-30 13:00) [17]
> kyn66 © (29.08.05 17:22) [10]
> >> Leonid Troyanovsky
> За пример спасибо. Однако там идет явное выделение мышкой.
> А мен нужно, чтобы эта
Ну, ты, брат, и ленив - Peter Below все ж разжевал.
Выкинул бы то, что не нужно.
Ну, ладно, чайникам надо помогать.
type
THackGrid = class(TCustomGrid);
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
const
Colors: Array [Boolean] of TColor = (clWhite , clBlue);
begin
with Sender as TStringGrid, Canvas do
if not (gdFixed in State) then
begin
Brush.Color := Colors[Assigned(Objects[ACol, ARow])];
FillRect(Rect);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
x: Longint;
begin
x := Longint(StringGrid1.Objects[1,1]);
StringGrid1.Objects[1,1] := TObject((x+1) mod 2);
THackGrid(StringGrid1).InvalidateCell(1,1);
end;
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.014 c