1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 88
1

Как закрасить определённую ячейку в StringGrid

01.09.2013, 11:09. Показов 4102. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как закрасить определённую ячейку черным цветом и чтобы в нее нельзя было вводить букву. Это для создания кроссворда )))
В тексте ниже закрашивается все ячейки..
Кликните здесь для просмотра всего текста

begin
StringGrid1.Canvas.Brush.Color:=clRed;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[Acol,Arow]);
end;

Подскажите пожалуйста!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2013, 11:09
Ответы с готовыми решениями:

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

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

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

Закрасить ячейку в Stringgrid по клику
Такая проблема - нужно, чтобы при клике на ячейку в Stringgrid она окрашивалась в определенный цвет...

14
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.09.2013, 11:39 2
Делать закраску в событии OnDrawCell грида. Это событие перерисовки ячейки. Где-то в массиве хранить координаты ячеек, которые нужно закрасить чёрным. В событии преверять, если перерисовывается ячейка, которую нужно закрасить чёрным - выполняй. Иначе выход - сама покрасит стандартно. Вообще на форуме много тем по закраске ячеек грида.
А чтобы нельзя ячейку было выбрать и заполнять, используй событие OnSelectCell. Тоже в нём проверяй можно ли эту ячейку выбрать, и, соответственно устанавливай значение CanSelect (почитай Help по событиям компонента).
0
Почетный модератор
64287 / 47586 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
01.09.2013, 12:49 3
Цитата Сообщение от Одиночка Посмотреть сообщение
Где-то в массиве хранить координаты ячеек,
Думаю размеры не более 256х256, поэтому мне кажется 2 множества будет лучше, легче обращаться.
1
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.09.2013, 12:51 4
А как с помощью множеств задать координаты определённых ячеек?
0
Почетный модератор
64287 / 47586 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
01.09.2013, 12:53 5
Не подумал...
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 88
01.09.2013, 13:04  [ТС] 6
Я подумал лучше через Edit-ы сделаю ))))) Всем спасибо!

Добавлено через 54 секунды
Лучше подскажите как текст "Memo1" убрать в свойствах нет ни Caption ни Text ????
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.09.2013, 13:06 7
Lines открывай.
0
Почетный модератор
64287 / 47586 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
01.09.2013, 13:11 8
Цитата Сообщение от shkolarosh Посмотреть сообщение
в свойствах нет ни Caption ни Text ????
Почему?
Delphi
1
2
3
memo1.Text:='1111'
...............
memo1.Text:=''
1
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.09.2013, 13:16 9
Я подумал, что нужно в Design Time убрать текст из поля Memo.

Вот так можно для StringGrid-а (по исходному вопросу).
Можно для каждой строки задать множество нужных ячеек.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Type
  TSetOfByte = Set Of Byte;
Var
  ArrNoActive : Array[1..15] Of TSetOfByte =
  ([1,5,8],[2,3,12],[5,7,8,10],[1,5,8],[2,3,12],
   [5,7,8,10],[1,5,8],[2,3,12],[5,7,8,10],[1,5,8],
   [2,3,12],[5,7,8,10],[1,5,8],[2,3,12],[5,7,8,10]);
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  If ACol In ArrNoActive[ARow] Then
  begin
    StringGrid1.Canvas.Brush.Color := clBlack;
    StringGrid1.Canvas.FillRect(Rect);
  end;
end;
 
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  CanSelect:=Not (ACol In ArrNoActive[ARow]);
end;
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 88
01.09.2013, 13:21  [ТС] 10
Цитата Сообщение от Одиночка Посмотреть сообщение
Я подумал, что нужно в Design Time убрать текст из поля Memo.

Вот так можно для StringGrid-а (по исходному вопросу).
Можно для каждой строки задать множество нужных ячеек.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Type
  TSetOfByte = Set Of Byte;
Var
  ArrNoActive : Array[1..15] Of TSetOfByte =
  ([1,5,8],[2,3,12],[5,7,8,10],[1,5,8],[2,3,12],
   [5,7,8,10],[1,5,8],[2,3,12],[5,7,8,10],[1,5,8],
   [2,3,12],[5,7,8,10],[1,5,8],[2,3,12],[5,7,8,10]);
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  If ACol In ArrNoActive[ARow] Then
  begin
    StringGrid1.Canvas.Brush.Color := clBlack;
    StringGrid1.Canvas.FillRect(Rect);
  end;
end;
 
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  CanSelect:=Not (ACol In ArrNoActive[ARow]);
end;
Можно поподробнее что за числа в квадратных скобках, что они означают?
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.09.2013, 13:26 11
Можно поподробнее что за числа в квадратных скобках, что они означают?
Это множество столбцов в каждой из строк грида. Я взял строк от 1 до 15. Правда, немного слукавил. Если не будешь использовать фиксированные столбцы и строки, тогда нужно номеровать с ноля.
Delphi
1
ArrNoActive : Array[0..14] Of TSetOfByte =
И для каждой строки в квадратных скобках перечисляешь ячейки, которые нужно закрасить чёрным (и они же не должны выбираться для правки). Нумерация тоже с ноля.
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.09.2013, 13:32 12
Вот пример, что получилось из приведенных данных:
Миниатюры
Как закрасить определённую ячейку в StringGrid  
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.09.2013, 13:48 13
Кстати. Предполагаю, что кроссворды будут разные и, соответственно, закраска ячеек может меняться, в зависимости от загружаемого кроссворда. Для динамического изменения данных в этом массиве используй команды работы с множествами: Include.
Например, чтобы очистить множество для какой-то строки (i например):
Delphi
1
ArrNoActive[i]:=[];
Добавить какой-то номер:
Delphi
1
Include(ArrNoActive[i],Num); //Num - добавляемый номер ячейки в строке
Естественно i может быть переменной цикла.
1
Заблокирован
01.09.2013, 22:24 14
А зачем вообще что-то вводить?
Тут другой подход нужен. Да и таблицу надо выбросить. Не нужна она здесь.
Игры делаются другими методами.
Но если уж взяли таблицу... ничего вводить в неё не нужно.
У вас должен быть двумерный массив игрового поля. То есть попросту условные символы означающие статус каждой клетки.
Чтобы не мучатся с вводом, а игрок - существо ленивое, нужно не бегать по клеткам. что-то вводя в них. а сделать так:
Игрок должен щёлкнуть на клетке с номером, то есть там, где начинается слово. А внизу. появится форма. Ну как в Поле чудес. Полоска с клетками по числу букв. Причём отображаются буквы. которые в этом слове уже есть.
Вот в эту форму и вводить... Причём буквы сразу появляются на игровом поле.
А можно сделать просто ввод, как в компонент edit С отображением символов на игровом поле.
Но вводить... в клетки... В принципе можно и в клетки, но нужно следить за вводом и услужливо перемещать курсор на нужное поле. Но это хуже.
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 88
02.09.2013, 20:09  [ТС] 15
Цитата Сообщение от Lirrk Посмотреть сообщение
А зачем вообще что-то вводить?
Тут другой подход нужен. Да и таблицу надо выбросить. Не нужна она здесь.
Игры делаются другими методами.
Но если уж взяли таблицу... ничего вводить в неё не нужно.
У вас должен быть двумерный массив игрового поля. То есть попросту условные символы означающие статус каждой клетки.
Чтобы не мучатся с вводом, а игрок - существо ленивое, нужно не бегать по клеткам. что-то вводя в них. а сделать так:
Игрок должен щёлкнуть на клетке с номером, то есть там, где начинается слово. А внизу. появится форма. Ну как в Поле чудес. Полоска с клетками по числу букв. Причём отображаются буквы. которые в этом слове уже есть.
Вот в эту форму и вводить... Причём буквы сразу появляются на игровом поле.
А можно сделать просто ввод, как в компонент edit С отображением символов на игровом поле.
Но вводить... в клетки... В принципе можно и в клетки, но нужно следить за вводом и услужливо перемещать курсор на нужное поле. Но это хуже.
мне очень нравится твоя идея ))) а как ее реализовать. Если можешь помочь, хотя бы 1-2 слова для примера, плиз )))
буду очень признателен.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2013, 20:09
Помогаю со студенческими работами здесь

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

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

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

Как закрасить ячейку по мере наведения в stringgrid
вобщем в MouseMove получаю ячейку int R,C; sg->MouseToCell(X,Y,C,R); TRect rec =...


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

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

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