Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
14-1127306421
oldman
2005-09-21 16:40
2005.10.09
У кого стоит 1С? Проблемку поймал...


14-1126678248
Ega23
2005-09-14 10:10
2005.10.09
Wanted!!! "Уездный город N"


4-1123768084
chili
2005-08-11 17:48
2005.10.09
Kак мне из dll запустить внешнию программу?


5-1102427218
main
2004-12-07 16:46
2005.10.09
Компонент TStringGrid


2-1125050572
oradb
2005-08-26 14:02
2005.10.09
Привязать объект к item-у listbox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский