Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
1

StringGrid, скрытие и отрисовка ячеек

17.07.2012, 23:49. Показов 4460. Ответов 24
Метки нет (Все метки)

Здраствуйте, хотел спросить совета у знающих людей.
У меня есть StringGrid1 заполненный данными.
Мне нужно чтобы например вокруг ячейки с координатами 5. 5. было видно пространство на 2 ячейки в разные стороны. А все вокруг остальные были скрыты.
Т. е. например в 5. 5. ячейки стоит единица белого цвета на черном фоне. вокруг цифры которые находятся в пределах двух ячейках от неё тоже видны. А все те что стоят дальше 2х ячеек от неё были закрыты, причем после нажатия клавишы на клавиатуре мне нужно передвинуть область с видимыми цифрами на одну координату Х или У, конечно же учитывая что скрытые цифры станут открытыми и наоборот. Можно ли это как то реализовать???
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2012, 23:49
Ответы с готовыми решениями:

Отрисовка ячеек StringGrid
Приветствую! Столкнулся с проблемой при динамическом создании StringGrid-ov. Ячейки почему-то...

Отрисовка объединенных ячеек Stringgrid
Здравствуйте. Нужна помощь в рисовании ячеек Stringgrid. В фиксированной строке Stringgrid есть...

Отрисовка цветных ячеек в StringGrid
Делаю ИСС Кинотеатр и нужно сделать выбор места в зале. Делаю так создаю массив из 0 1 и 2. 0 -...

StringGrid Цвет фона пустых ячеек и ячеек с текстом
Доброго дня.. Задачка следующая: Ячейки в StringGrid'e заполняются по блоку из Timer. В...

24
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
18.07.2012, 00:55 2
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
// Переопределяй отрисовку ячейки (цвета можешь выбрать по желанию):
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const
   Range = 2; // Сколько клеток от активной нужно видеть.
begin
   with Sender as TStringGrid do
   begin
      if (Abs(ACol - Col) > Range) or (Abs(ARow - Row) > Range) then
         Canvas.Font.Color := clWhite
      else
         Canvas.Font.Color := clBlack;
 
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2,Rect.Top + 2,Cells[ACol, ARow]);
   end;
end;
 
// и событие смены активной ячейки:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
   (Sender as TStringGrid).Invalidate;
end;
- получится желаемое.
1
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
18.07.2012, 01:14  [ТС] 3
Простите просто чайник я( А как мне указать координаты ячейки от которой становится видна область вокруг и можно ли вызывать эту функцию из другого модуля?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
18.07.2012, 01:22 4
Цитата Сообщение от funyfizik Посмотреть сообщение
А как мне указать координаты ячейки от которой становится видна область вокруг
Видно 2 клетки вокруг текущей ячейки (т.е., той, которая в данный момент выбрана). И вызывать эти методы не нужно - они отработают автоматически при определенных событиях: первый - когда надо перерисовать ячейку (программа сама разберется, когда ей надо перерисовывать), а второй - когда ты, нажимая на кнопки, изменишь активную ячейку.

Цитата Сообщение от funyfizik Посмотреть сообщение
можно ли вызывать эту функцию из другого модуля?
Что значит, из другого модуля? У тебя что, есть несколько гридов на разных формах и ты хочешь на всех сделать одно и то же?
1
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
18.07.2012, 01:58  [ТС] 5
Не совсем, у меня просто программа разделена на модули для удобства. И например из Unit2 я могу вызвать эту функцию? Мне нужно чтобы видимая область передвигалась при нажатии на клавиатуру, как это сделать? и Самое важно это как раз возможность передвигать эту область из другого модуля, в этом то вся суть, чтобы функцией или процедурой из модуля 2 управлять перемещением видимой областью. Т. е. потом просто описав эту функцию или процедуру из ubit2 в главном модуле можно было перемещать область.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
18.07.2012, 10:12 6
А, тебе для удобства Да, можно вынести реализации этих методов в отдельный модуль. Скажем, вот так:

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
unit GridUnit;
 
interface
uses Types, Grids;
 
type
   TFoo = class
      class procedure GridDrawCell(Sender: TObject; ACol, ARow: Integer;
         Rect: TRect; State: TGridDrawState);
      class procedure GridSelectCell(Sender: TObject; ACol, ARow: Integer;
         var CanSelect: Boolean);
   end;
 
implementation
uses Graphics;
 
class procedure TFoo.GridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const
   Range = 2;
begin
   with Sender as TStringGrid do
   begin
      if (Abs(ACol - Col) > Range) or (Abs(ARow - Row) > Range) then
         Canvas.Font.Color := clWhite
      else
         Canvas.Font.Color := clBlack;
 
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2,Rect.Top + 2,Cells[ACol, ARow]);
   end;
end;
 
 
class procedure TFoo.GridSelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
   (Sender as TStringGrid).Invalidate;
end;
 
end.
, а при создании твоей формы вручную прописать обработчики:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Не забудь в Uses подключить GridUnit
 
procedure TForm1.FormCreate(Sender: TObject);
begin
   // ...
   StringGrid1.OnDrawCell := TFoo.GridDrawCell;
   StringGrid1.OnSelectCell := TFoo.GridSelectCell;
end;
 
// Специально для того, чтобы изначально была выбрана
// ячейка 5:5, и ты мог сразу клавиатурой перемещать область -
// сделай вот такой обработчик OnShow формы:
procedure TForm1.FormShow(Sender: TObject);
begin
   StringGrid1.Row := 5;
   StringGrid1.Col := 5;
   StringGrid1.SetFocus;
end;
Насколько я помню, в Delphi7 уже были статические методы класса, если нет - то это подходит для более новых версий Дельфи, в D7 надо будет делать немного по-другому.

Цитата Сообщение от funyfizik Посмотреть сообщение
Мне нужно чтобы видимая область передвигалась при нажатии на клавиатуру, как это сделать?
Да ты код-то вообще запускал? Все передвигается.

Еще раз: клавиатурой ты перемещаешь активную ячейку. Как только она изменилась, происходит событие SelectCell, и вызывается его обработчик. Что делает обработчик? Правильно, объявляет весь грид невалидным, чем и заставляет его полностью перерисоваться. А при перерисовке что происходит? Вызывается метод обработчик события DrawCell, который проверяет, какие ячейки видимы, а какие - нет. Так что моему решению всё равно, клавиатурой ты изменил ячейку, мышью, или телепатией...
1
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
18.07.2012, 12:53  [ТС] 7
Практически работает) только получается что куда попадает выделенная клетка там и открывается что стоит в области, а мне нужно чтобы область вокруг вся передвигалась, что бы автоматически открывались клетки
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
18.07.2012, 12:57 8
Тебе что, видео записать, что как только я передвинул выделенную клетку - вся область сразу сдвигается автоматически? Выложи-ка ты лучше свой проект, может ты чего-то недописал?
0
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
18.07.2012, 13:33  [ТС] 9
Прикрепилархив
0
Вложения
Тип файла: rar рог.rar (194.6 Кб, 14 просмотров)
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
18.07.2012, 15:16 10
Я ж говорю, что ты что-то недописал. Так и есть. У StringGrid-а кто обработчик OnSelectCell будет назначать. Он же у тебя пустой. Выбери в Object Inspector-е для этого события StringGrid1SelectCell.

И потом, как ты хочешь, чтоб у тебя что-то открывалось, если у тебя грид не заполнен ничем? Пока не будет данных - открывать нечего будет.
0
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
18.07.2012, 15:51  [ТС] 11
Практически всё как нужно, только открываются все клетки начиная от первой

Добавлено через 27 минут
Т. е. вот выбрав клетку например 20. 20 отобразятся все символы начиная с первой, а мне нужно чтобы было видно только вокруг этой 20. 20
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
18.07.2012, 15:57 12
Как надоело мне твое упорство. Что где открывается полностью, не подскажешь? Сколько плюсиков видишь в гриде?

0
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
18.07.2012, 16:15  [ТС] 13
Спасибо за понимание моего упорства) Но у меня на делфи 7 такое не прокатывает
0
421 / 351 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
18.07.2012, 16:21 14
ищи ошибку в коде. Делфи тут не причем.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
18.07.2012, 16:23 15
Я тебе уже говорил: показывай, как заполняешь грид, и что делаешь дальше. Ты прислал проект, в котором грид пуст, и ничего не должно происходить. Что ты хочешь, чтобы здесь развивали телепатические навыки?
1
421 / 351 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
18.07.2012, 16:27 16
UI, если кнопку на форме нажать тогда у него чето запоняется
0
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
18.07.2012, 20:25  [ТС] 17
Посмотри модули в проекте, модуль МАП

Добавлено через 21 минуту
Извините, я создал новый проект забил разные числа в таблицу и тут работает, где то я ошибся, буду разбираться

Добавлено через 20 минут
И тут появляется ещё вопросик, как мне разрисовать цветами текст в видимых ячейках?

Добавлено через 13 минут
Delphi
1
2
3
4
5
6
7
8
9
10
   if StringGrid1.Col-VisLong > 0 then
    if StringGrid1.Row-VisLong > 0 then
     for i:=StringGrid1.Col-VisLong to StringGrid1.Col+4 do
      for n:=StringGrid1.Row-VisLong to StringGrid1.Row+4 do
       begin
        StringGrid1.Canvas.Font.Color := Random(1000);
         StringGrid1.Canvas.FillRect(Rect);
          StringGrid1.Canvas.TextOut(Rect.Left + 2,Rect.Top + 2,Map0[i, n]);
 
          end;
так?

Добавлено через 26 секунд
VisLong - сколько нужно видеть клеток(две)

Добавлено через 2 часа 28 минут
Разобрался сам:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   with Sender as TStringGrid do
   begin
      if (Abs(ACol - Col) > VisLong) or (Abs(ARow - Row) > VisLong) then Canvas.Font.Color := clBlack  // âñå êëåòêè  êîòîðûå íå âõîäÿò â âèäèìîþ îáëàñòü
      else
      for i:=abs(Col-VisLong) to Col+Vislong*2 do
       for n:=abs(Row-VisLong) to Row+VisLong*2 do
        begin
         If Cells[ACol,ARow]='.' then Canvas.Font.Color:=ClGray;
          If Cells[ACol,ARow]='#' then Canvas.Font.Color:=ClWhite;
           If Cells[ACol,ARow]='*' then Canvas.Font.Color:=ClGreen;
            If Cells[ACol,ARow]='_' then Canvas.Font.Color:=ClBlue;
        end;
      Canvas.Brush.Color := clBlack;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2,Rect.Top + 2,Cells[ACol, ARow]);
        end;
      end;
Добавлено через 39 секунд
Разобрался сам:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   with Sender as TStringGrid do
   begin
      if (Abs(ACol - Col) > VisLong) or (Abs(ARow - Row) > VisLong) then Canvas.Font.Color := clBlack  // âñå êëåòêè  êîòîðûå íå âõîäÿò â âèäèìîþ îáëàñòü
      else
      for i:=abs(Col-VisLong) to Col+Vislong*2 do
       for n:=abs(Row-VisLong) to Row+VisLong*2 do
        begin
         If Cells[ACol,ARow]='.' then Canvas.Font.Color:=ClGray;
          If Cells[ACol,ARow]='#' then Canvas.Font.Color:=ClWhite;
           If Cells[ACol,ARow]='*' then Canvas.Font.Color:=ClGreen;
            If Cells[ACol,ARow]='_' then Canvas.Font.Color:=ClBlue;
        end;
      Canvas.Brush.Color := clBlack;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2,Rect.Top + 2,Cells[ACol, ARow]);
        end;
      end;
Добавлено через 1 минуту
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Разобрался сам:
 
[DELPHI]procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   with Sender as TStringGrid do
   begin
      if (Abs(ACol - Col) > VisLong) or (Abs(ARow - Row) > VisLong) then Canvas.Font.Color := clBlack  // âñå êëåòêè  êîòîðûå íå âõîäÿò â âèäèìîþ îáëàñòü
      else
      for i:=abs(Col-VisLong) to Col+Vislong*2 do
       for n:=abs(Row-VisLong) to Row+VisLong*2 do
        begin
         If Cells[ACol,ARow]='.' then Canvas.Font.Color:=ClGray;
          If Cells[ACol,ARow]='#' then Canvas.Font.Color:=ClWhite;
           If Cells[ACol,ARow]='*' then Canvas.Font.Color:=ClGreen;
            If Cells[ACol,ARow]='_' then Canvas.Font.Color:=ClBlue;
        end;
      Canvas.Brush.Color := clBlack;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2,Rect.Top + 2,Cells[ACol, ARow]);
        end;
      end;
[/DELPHI]

Добавлено через 16 секунд
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Разобрался сам:
 
[DELPHI]procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   with Sender as TStringGrid do
   begin
      if (Abs(ACol - Col) > VisLong) or (Abs(ARow - Row) > VisLong) then Canvas.Font.Color := clBlack  // âñå êëåòêè  êîòîðûå íå âõîäÿò â âèäèìîþ îáëàñòü
      else
      for i:=abs(Col-VisLong) to Col+Vislong*2 do
       for n:=abs(Row-VisLong) to Row+VisLong*2 do
        begin
         If Cells[ACol,ARow]='.' then Canvas.Font.Color:=ClGray;
          If Cells[ACol,ARow]='#' then Canvas.Font.Color:=ClWhite;
           If Cells[ACol,ARow]='*' then Canvas.Font.Color:=ClGreen;
            If Cells[ACol,ARow]='_' then Canvas.Font.Color:=ClBlue;
        end;
      Canvas.Brush.Color := clBlack;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2,Rect.Top + 2,Cells[ACol, ARow]);
        end;
      end;
[/DELPHI]
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
18.07.2012, 21:08 18
funyfizik, я так понимаю, у твоей машины ресурсов слишком много, и ты решил ее хоть чем-нибудь занять? Что ты хочешь добиться вот этим циклом:
Delphi
1
2
3
4
5
6
7
8
for i:=abs(Col-VisLong) to Col+Vislong*2 do
       for n:=abs(Row-VisLong) to Row+VisLong*2 do
       begin
         If Cells[ACol,ARow]='.' then Canvas.Font.Color:=ClGray;
          If Cells[ACol,ARow]='#' then Canvas.Font.Color:=ClWhite;
           If Cells[ACol,ARow]='*' then Canvas.Font.Color:=ClGreen;
            If Cells[ACol,ARow]='_' then Canvas.Font.Color:=ClBlue;
        end;
?

Ты впустую пройдешь несколько итераций, и в результате все равно останется тот цвет который выбран в одной из 4-х строк, с 4-ой по 7-ую. Причем на последней итерации. То есть, вполне можно строки 1 и 2 вообще убрать, и результат не изменится. Ну, разве только быстрее будет выполняться. А вместо четырех If-ов подряд очень хорошо использовать Case. То есть, тот же результат, что у тебя, но гораздо проще:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   with Sender as TStringGrid do
   begin
      if (Abs(ACol - Col) > Range) or (Abs(ARow - Row) > Range) then
         Canvas.Font.Color := clBlack
      else
      case Cells[ACol, ARow][1] of
         '.': Canvas.Font.Color:=ClGray;
         '#': Canvas.Font.Color:=ClWhite;
         '*': Canvas.Font.Color:=ClGreen;
         '_': Canvas.Font.Color:=ClBlue;
      end;
 
      Canvas.Brush.Color := clBlack;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2,Rect.Top + 2,Cells[ACol, ARow]);
   end;
end;
0
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
18.07.2012, 22:58  [ТС] 19
А вот и нет, прекрасно окрашивает всё что нужно в нужный цвет))) Вы тут догадались хоть что я пишу?
0
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 17
23.07.2012, 16:07  [ТС] 20
Появился ещё вопрос((( Допустим у меня в таблице единицы и нули, и вот например когда я прошёл областью которой вижу по таблице и обнаружил нули, как мне сделать чтобы они оставались видны? только другим цветом

Добавлено через 9 минут
Разобрался сам)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2012, 16:07

Возможность вручную писать данные в ячейки StringGrid и заполнение ячеек StringGrid данными из файла после нажатия кнопки
Здравствуйте! Помогите, пожалуйста. Мне необходимо сделать следующее: реализовать возможность...

Скрытие/Раскрытие ячеек
Приветствую всех! есть табличка <table border="1" cellpadding="1" id="table"> <tr> ...

TStringGrid отрисовка ячеек
добрый вечер. Есть ValueListEditor (по сути тот же StringGrid). естественно, рисуется с учетом...

Отрисовка StringGrid
procedure TForm16.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.