Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

Как изменит фон в ячейке 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.203 c
2-1124905795
095
2005-08-24 21:49
2005.10.09
расскажите как можно с помощью Delphi запрограмить запуск странич


4-1123039417
fmf
2005-08-03 07:23
2005.10.09
Как передать дату в чужое приложение?


1-1127222082
OldNaum
2005-09-20 17:14
2005.10.09
TPanel Vs. XPManifest


1-1126877611
Новичок1
2005-09-16 17:33
2005.10.09
Народ помогите замучился искать , исправил что-то в свойствах


14-1126872111
Kerk
2005-09-16 16:01
2005.10.09
Спам создает общественное мнение