Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 896
1

Отрисовка цветных ячеек в StringGrid

06.06.2018, 15:28. Показов 1047. Ответов 10
Метки нет (Все метки)

Делаю ИСС Кинотеатр и нужно сделать выбор места в зале. Делаю так создаю массив из 0 1 и 2. 0 - пустое пространство(белая клетка), 1-зеленая клетка(свободное место) 2 красная(занятое место). И вот я сделал это для одного зала при выборе места запоминаю и сохраняю в файл, потом из него загружаю. Вот как мне сделать так чтобы при выборе зала в DbGrid малый или большой в 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
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sButton, sEdit, DB, ADODB, Grids, DBGrids, acDBGrid,
  ExtCtrls, sPanel, sGroupBox, acImage, jpeg, DBCtrls, sLabel, Mask,
  sMaskEdit, sMemo, sDBText;
 
  const R: integer = 14;
        C: integer = 16;
 
  type
  TMatrix = array[0..14, 0..16] of integer;
  TForm5 = class(TForm)
    sGroupBox1: TsGroupBox;
    sPanel1: TsPanel;
    sDBGrid1: TsDBGrid;
    ADOQuery1: TADOQuery;
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    sGroupBox2: TsGroupBox;
    sPanel2: TsPanel;
    sDBGrid2: TsDBGrid;
    sImage1: TsImage;
    ADOQuery2: TADOQuery;
    DataSource2: TDataSource;
    sPanel3: TsPanel;
    sPanel5: TsPanel;
    sLabel1: TsLabel;
    sLabel2: TsLabel;
    sLabel3: TsLabel;
    sLabel4: TsLabel;
    sEdit1: TsEdit;
    sEdit2: TsEdit;
    sEdit3: TsEdit;
    sMaskEdit1: TsMaskEdit;
    sButton1: TsButton;
    sLabel5: TsLabel;
    sEdit4: TsEdit;
    ADOQuery3: TADOQuery;
    sPanel4: TsPanel;
    Button1: TButton;
    Shape1: TShape;
    sLabel32: TsLabel;
    Shape2: TShape;
    sLabel33: TsLabel;
    Shape3: TShape;
    sLabel34: TsLabel;
    sLabel9: TsLabel;
    sLabel8: TsLabel;
    sLabel7: TsLabel;
    sLabel6: TsLabel;
    sLabel31: TsLabel;
    sLabel30: TsLabel;
    sLabel29: TsLabel;
    sLabel28: TsLabel;
    sLabel27: TsLabel;
    sLabel26: TsLabel;
    sLabel25: TsLabel;
    sLabel24: TsLabel;
    sLabel23: TsLabel;
    sLabel22: TsLabel;
    sLabel21: TsLabel;
    sLabel18: TsLabel;
    sLabel19: TsLabel;
    sLabel20: TsLabel;
    sLabel17: TsLabel;
    sLabel16: TsLabel;
    sLabel15: TsLabel;
    sLabel14: TsLabel;
    sLabel13: TsLabel;
    sLabel12: TsLabel;
    sLabel11: TsLabel;
    sLabel10: TsLabel;
    G: TStringGrid;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormActivate(Sender: TObject);
    procedure sDBGrid1CellClick(Column: TColumn);
    procedure sButton1Click(Sender: TObject);
    procedure GDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure GDblClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure sDBGrid2CellClick(Column: TColumn);
 
 
  private
    { Private declarations }
     M: TMatrix;
    procedure FillGrid;
    procedure SaveMatrix;
    procedure Clear;
    function GetMatrix: TMatrix;
  public
    { Public declarations }
  end;
 
 const mBlank: TMatrix =((0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0),
                         (0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0),
                         (0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,0),
                         (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0));
 
 
var
  Form5: TForm5;
  id:integer;
  s: string;
 
implementation
 
uses Unit3;
 
{$R *.dfm}
 
procedure TForm5.FillGrid;
var i, j: integer;
begin
 for i := 0 to R do
  for j := 0 to C do
   G.Cells[j, i] := IntToStr(M[i, j]);
 G.Invalidate;
end;
 
 
procedure TForm5.FormActivate(Sender: TObject);
var i : integer;
begin
sImage1.Picture.LoadFromFile(sDBGrid1.Fields[3].Value);
if not FileExists('places.dat') then Clear else M := GetMatrix;
end;
 
 
procedure TForm5.GDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var i, j: integer;
    clr: TColor;
begin
 clr := clWhite;
 for i := 0 to R do
  for j := 0 to C do
   begin
    case M[i, j] of
     0 : clr := clWhite;
     1 : clr := clLime;
     2 : clr := clRed;
    end;
    G.Canvas.Brush.Color := clr;
    if (ACol = j) and (ARow = i) then  G.Canvas.FillRect(Rect);
   end;
end;
 
procedure TForm5.GDblClick(Sender: TObject);
begin
 case M[G.Row,  G.Col] of
  0 :ShowMessage('Это пустое пространство!');
  1 : M[G.Row, G.Col] := 2;
  2 : M[G.Row, G.Col] := 1;
 end;
 G.Cells[G.Col, G.Row] := IntToStr(M[G.Row, G.Col]);
 SaveMatrix;
 G.Invalidate;
end;
 
procedure TForm5.SaveMatrix;
var L: TStringList;
    i: integer;
begin
 L := TStringList.Create;
 for i := 0 to G.RowCount - 1 do
  L.Add(G.Rows[i].CommaText);
 L.SaveToFile('places.dat');
 L.Free;
end;
 
function TForm5.GetMatrix : TMatrix;
var L: TStringList;
    i, j: integer;
begin
 L := TStringList.Create;
 L.LoadFromFile('places.dat');
 for i := 0 to L.Count - 1 do
  G.Rows[i].CommaText := L.Strings[i];
 L.Free;
 for i := 0 to R do
  for j := 0 to C do
   result[i, j] := StrToInt(G.Cells[j, i]);
end;
 
procedure TForm5.Clear;
begin
 M := mBlank;
 FillGrid;
 SaveMatrix;
end;
 
 
 
procedure TForm5.Button1Click(Sender: TObject);
begin
Clear;
end;
 
 
 
 
procedure TForm5.sDBGrid2CellClick(Column: TColumn);
var
i:integer;
begin
i:=sDBGrid2.SelectedIndex;
 s :=sDBGrid2.DataSource.DataSet.Fields.Fields[i].Value;
 
end;
 
end.
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2018, 15:28
Ответы с готовыми решениями:

Экспорт цветных ячеек из Stringgrid в excel
Здравствуйте, Форумчане! Столкнулся с такой проблемой Необходимо экспортировать текст+цветные...

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

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

StringGrid, скрытие и отрисовка ячеек
Здраствуйте, хотел спросить совета у знающих людей. У меня есть StringGrid1 заполненный данными. ...

10
5027 / 3920 / 1296
Регистрация: 14.04.2014
Сообщений: 18,031
Записей в блоге: 18
06.06.2018, 16:12 2
как должно быть
Программа "Концертный зал"

а конкретно по вашему вопросу пытаюсь еще раз напомнить, что данных в гриде нет, они в датасете
и если вы каким-то образом, кликом, кнопками, мысленным приказом, встали на какую-то строку в гриде
то совершенно магическим образом в датасете выберется эта же строка. представляете, какие перспективы?!

и именно поэтому еще раз повторю и в этой теме - оставьте грид в покое
нужное вам значение УЖЕ находится в поле незнаюкакназываетсявашеполе датасета

P.S.
а у вас в кинотеатре только один сеанс??

Добавлено через 3 минуты
ах да. забыл
если вы производите одно и то же действие над разными данными. например заполняете грид
то это прямо кричит о том, что вам нужна процедура и параметр к ней. через параметр передаете данные
одни - рисует один зал
другое - другой
красота
0
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 896
06.06.2018, 16:34  [ТС] 3
krapotkin, ладно беру данные из датасет , пытался сделать чтоб передавался параметр строковый я его сравнивал и писал через if но не работало как сделать по другому я не знаю, вот и прошу помощи
0
5027 / 3920 / 1296
Регистрация: 14.04.2014
Сообщений: 18,031
Записей в блоге: 18
06.06.2018, 16:55 4
Лучший ответ Сообщение было отмечено 6elka1703 как решение

Решение

во-первых, даже если предположить что вы взяли данные из датасета в переменную S при клике по гриду
то я не вижу где те IF о которых вы говорите

если вы хотите делать что-то, вам нужно отпределить, по какому событию вы это делаете
да хоть по тому же клику
по идее в строке 222 должен быть вызов какой-то процедуры, в которую вы передаете S
где вы "рисуете зал"
но вы рисуете зал по готовой матрице M
а заполняете ее только в TForm5.Clear и TForm5.FormActivate
ну вот же
в зависимости от значения S сначала загрузите из нужного вам файла, потом рисуйте свой грид

PS
одному мне кажется странным в программе с БД
хранить самые главные данные в файлах
?
1
Продавец времени
5786 / 3193 / 734
Регистрация: 12.03.2015
Сообщений: 15,159
06.06.2018, 20:19 5
Расскажи-ка мне, ТС, за каким хреном тебе тут база данных?
0
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 896
06.06.2018, 20:30  [ТС] 6
Verevkin, мне?
0
Продавец времени
5786 / 3193 / 734
Регистрация: 12.03.2015
Сообщений: 15,159
06.06.2018, 20:32 7
Цитата Сообщение от 6elka1703 Посмотреть сообщение
мне?
Ну не мне же!
0
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 896
06.06.2018, 20:46  [ТС] 8
Verevkin, ну как бы проект называется касса кинотеатра, покупаю билеты данные о покупки заношу в бд, как и данные о фильмах сеансах и клиентах. Вот зачем мне тут бд
0
Продавец времени
5786 / 3193 / 734
Регистрация: 12.03.2015
Сообщений: 15,159
06.06.2018, 22:37 9
Цитата Сообщение от 6elka1703 Посмотреть сообщение
ну как бы проект называется касса кинотеатра, покупаю билеты данные о покупки заношу в бд, как и данные о фильмах сеансах и клиентах. Вот зачем мне тут бд
Это риторический вопрос был. Я хотел этим сказать, что отрисовка расположения мест в зале и хранение данных о купленных местах - это 2 несвязанные между собой задачи. Если они у тебя свалены в кучу, то это называется "костыль".

Вот и всё.

Отрисовка цветных ячеек в StringGrid
0
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 896
06.06.2018, 23:12  [ТС] 10
Verevkin, Что? Вы когда нибудь покупали билет в кино? При покупке билета человек место выбирает. И где это несвязанные вещи?
0
Продавец времени
5786 / 3193 / 734
Регистрация: 12.03.2015
Сообщений: 15,159
06.06.2018, 23:20 11
Цитата Сообщение от 6elka1703 Посмотреть сообщение
Что? Вы когда нибудь покупали билет в кино?
Нет, не покупал.
Цитата Сообщение от 6elka1703 Посмотреть сообщение
При покупке билета человек место выбирает.
Согласен.
Цитата Сообщение от 6elka1703 Посмотреть сообщение
И где это несвязанные вещи?
С рисованием схемы зала - нигде.

--------------
Я работаю программистом уже 17 лет. Просто поверь мне на слово: раздели одну большую задачу на подзадачи. Иначе настанет момент, когда ты бросишь недописанную программу, состоящую из костылей, и начнёшь писать её с нуля.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2018, 23:20

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

Счет цветных ячеек
Ребят, как посчитать кол-во ячеек заданного цвета. Помогите с кодом

Подсчет цветных ячеек в таблице
Подскажите пожалуйста. Вот у меня есть код, который создает таблицу и закрашивает все ячейки в...

Посчитать количество цветных ячеек
добрый день! есть 2 столбца ячейки в них закрашены 4 цветами (причем, некоторые из них...


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

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

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