4 / 4 / 2
Регистрация: 29.11.2012
Сообщений: 28
1

Закрасить ячейку в Stringgrid по клику

28.04.2013, 17:15. Показов 18028. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Такая проблема - нужно, чтобы при клике на ячейку в Stringgrid она окрашивалась в определенный цвет в зависимости от того, какое в ней значение. У меня у ячеек рандомное значение -1 либо 0. При клике на ячейку -1 она должна стать красной, при клике на 0 - черной. Через процедуру SelectCell работает, но цвет ячейки показывается на секунду. А мне нужно, чтобы при единоразовом клике ячейка оставалась красной либо черной. Вот моя процедура
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.strngrd1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
 CanSelect:=true;
 if strngrd1.Cells [Acol, Arow] = '-1' then begin
   form1.strngrd1.Canvas.Brush.Color:=clBlack;
 end
 else  form1.strngrd1.Canvas.Brush.Color:=clred;
 form1.strngrd1.Canvas.FillRect(strngrd1.CellRect(ACol, ARow));
end;
Буду признательна за любую помощь, через эту процедуру либо через другую.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2013, 17:15
Ответы с готовыми решениями:

Как закрасить ячейку в StringGrid?
Мне необходимо чтобы при нажатии bitbtn закрашивались все ячейки в StringGrid в которых...

Как закрасить ячейку в StringGrid?
А как закрасить ячейку(и) в StringGrid?

Как закрасить определённую ячейку в StringGrid
Как закрасить определённую ячейку черным цветом и чтобы в нее нельзя было вводить букву. Это для...

Закрасить ячейку в Stringgrid с минимальным элементом
Доброго времени суток! Не как не могу разобраться с раскрашиванием ячеек! var ACol, ARow:...

7
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
28.04.2013, 17:46 2
Цитата Сообщение от cattyfil Посмотреть сообщение
А мне нужно, чтобы при единоразовом клике ячейка оставалась красной либо черной.
Используй события OnDrawCell
1
Эксперт Pascal/Delphi
4913 / 2782 / 853
Регистрация: 04.10.2012
Сообщений: 10,127
28.04.2013, 17:59 3
cattyfil, в помощь
2
4 / 4 / 2
Регистрация: 29.11.2012
Сообщений: 28
28.04.2013, 18:47  [ТС] 4
Спасибо, переделала через DrawCell, немного помогло=) Теперь ячейка при клике остается нужного цвета, но мне нужно, чтобы при клике на другую ячейку она тоже окрашивалась в нужный цвет, а прошлая оставляла свой цвет... Сейчас у меня так, что только одна ячейка во всей таблице закрашена, а мне нужно чтобы закрашены были все "кликнутые".
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
X: Real;
i,j:integer;
begin
   if (gdFocused in State) and (strngrd1.Cells [Acol, Arow] = '-1') then
   StrnGrd1.Canvas.Brush.Color := clBlack
   else if  (gdFocused in State) and (strngrd1.Cells [Acol, Arow] = '0') then
   strngrd1.Canvas.Brush.Color := clRed;
   strngrd1.Canvas.FillRect(Rect);
end;
Буду благодарна если кто-то мне втолкует, чего Делфи от меня хочет)))

Добавлено через 36 минут
Всё, вопрос снят, нашла ошибку сама
0
Почетный модератор
12269 / 5334 / 268
Регистрация: 05.04.2011
Сообщений: 14,086
Записей в блоге: 2
28.04.2013, 18:53 5
cattyfil, отпишитесь, пожалуйста, в чем ошибка была - это может кому-то пригодиться
1
13106 / 5887 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
28.04.2013, 18:56 6
1. По щелчку левой кнопки мыши закрасить ячейку, по щелчку правой кнопки мыши - сбросить цвет ячейки: Меняем цвет ячеек стрингрида
2. Пометить цветом те ячейки, которые подверглись редактированию: https://www.cyberforum.ru/delp... ost2372272
3. Раскраска TStringGrid: Раскраска stringgrid
2
4 / 4 / 2
Регистрация: 29.11.2012
Сообщений: 28
29.04.2013, 18:20  [ТС] 7
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Цитата Сообщение от Taatshi Посмотреть сообщение
cattyfil, отпишитесь, пожалуйста, в чем ошибка была - это может кому-то пригодиться
В 7 строке кода не нужно прописывать условие
Delphi
1
if (gdFocused in State)
В таком случае закрашивается только выбранная ячейка. Лучше завести массив типа boolean, и придавать значение true элементу с теми же индексами, что и кликнутая ячейка. Потом сделать проверку на true, т.е была ли кликнута эта ячейка. Остальной код прежний.
0
13106 / 5887 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
30.04.2013, 09:47 8
Цитата Сообщение от cattyfil Посмотреть сообщение
Лучше завести массив типа boolean
Так можно сделать, но при этом потребуется отслеживать случаи изменения размеров таблицы - чтобы соответствующим образом изменить размер массива. И случаи очистки таблицы или части таблицы тоже придётся отслеживать.
Самый удобный способ - это хранить флаг закраски прямо в данных, связанных с ячейкой. Такой способ применяется в примерах:
1. По щелчку левой кнопки мыши закрасить ячейку, по щелчку правой кнопки мыши - сбросить цвет ячейки: Меняем цвет ячеек стрингрида
2. Пометить цветом те ячейки, которые подверглись редактированию: https://www.cyberforum.ru/delp... ost2372272

Идея здесь заключается в следующем. Строки и столбцы таблицы типа TStringGrid - это потомки класса TStrings. А каждый элемент TStrings представляет собой пару: <строка>-<объект>. Таким образом каждой ячейке таблицы типа TStringGrid соответствует пара: <строка>-<объект>. И вот под видом объекта можно присоединять любые данные. В нашем случае флаг можно хранить прямо в виде значения указателя на объект:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Обработчик, который вызывается при щелчке мышью в области таблицы.
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  Sg : TStringGrid;
  Col, Row : Integer;
begin
  Sg := Sender as TStringGrid;
  //Определяем координаты ячейки, на которой произошёл щелчок мыши.
  Sg.MouseToCell(X, Y, Col, Row);
  //Если произошёл щелчок левой кнопкой мыши - устанавливаем флаг.
  if Button = mbLeft then begin
    //Под видом указателя на объект, который связан с ячейкой, записываем
    //значение флага. Значение флага, равное 1, означает, что цвет ячейки изменён.
    Sg.Rows[Row].Objects[Col] := TObject(1); //Или: := Pointer(1);
  //Если произошёл щелчок правой кнопкой мыши - сбрасываем флаг.
  end else if Button = mbRight then begin
    Sg.Rows[Row].Objects[Col] := TObject(0); //Или: := Pointer(0);
  end;
end;
При перерисовке ячейки мы этот флаг считываем и в зависимости от его значения решаем - следует ли закрасить ячейку:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//Обработчик, который вызывается при перерисовке ячейки.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
type
  TSave = record
    FontColor : TColor;
    FontStyle : TFontStyles;
    BrColor : TColor;
  end;
var
  Sg : TStringGrid;
  Save : TSave;
  Flag : Integer;
begin
  Sg := Sender as TStringGrid;
  //Читаем значение флага, которое записано под видом указателя на объект.
  Flag := Integer(Sg.Rows[ARow].Objects[ACol]);
  //Если флаг не равен 1 - выходим.
  if Flag <> 1 then Exit;
  //В противном случае, изменяем цвет ячейки.
  with Sg.Canvas, Save do begin
    //Запоминаем параметры шрифта и кисти.
    FontColor := Font.Color;
    FontStyle := Font.Style;
    BrColor := Brush.Color;
 
    //Устанавливаем новые парметры.
 
    //Цвет шрифта - белый.
    Font.Color := RGB(255, 255, 255);
    //Стиль шрифта - жирный.
    Font.Style := Font.Style + [fsBold];
    //Цвет кисти - коричневый.
    Brush.Color := RGB(180, 90, 30);
 
    //Прорисовываем ячейку.
 
    //Заливаем квадрат ячейки цветом кисти.
    FillRect(Rect);
    //Прорисовываем в ячейке текст. Здесь +2 - так мы задаём ширину полей в ячейке.
    TextOut(Rect.Left + 2, Rect.Top + 2, Sg.Cells[ACol, ARow]);
 
    //Восстанавливаем прежние параметры канвы.
    Font.Color := FontColor;
    Font.Style := FontStyle;
    Brush.Color := BrColor;
  end;
end;
2
30.04.2013, 09:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2013, 09:47
Помогаю со студенческими работами здесь

Закрасить определенную ячейку StringGrid-а другим цветом
возможно ли сделать так: чтобы с помощью ТОЛЬКО кнопки (потомучто у меня есть цикл где копирует в...

Как закрасить ячейку в Stringgrid, в которой есть "*"
Всем привет! Подскажите мне пожалуйста, как закрасить ячейки Stringgrid в которой есть &quot;*&quot;?

StringGrid закрасить ячейку
Помогите пожалуйста, неодходимо чтобы при нажатии на какую либо ячейку стрингграда она...

Закрасить ячейку StringGrid
Нужно закрасить ячейки по диагонали. Но закрашивает не полностью. В чём дело? procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru