Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2008, 13:44   #1
Albert2008
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 26
По умолчанию Stringgrid, cells[m,n] и двумерные массивы.(#002) Очередной вопрос начинающего.

Вопрос первый (не подготовленный, а потому кратко и по сути).
Есть такой компонент Stringgrid (ещё есть drawgrid, но стрин наверное лучше и проще).
У него есть такое явление cells[столбец,строка]
А ещё бывают двумерные массивы mas1: array[1..n,1..m] of integer;
где n,m - заранее заданные константы.
(Есть ещи и какие-то динамические - здесь на форуме прочитал. Но доходчиво- простым человеческим языком с простыми примерами этого тут никто не объяснял).
Так вот.
Вопрос:
1. Как задать цвет отдельной ячейке (или 2 группе ячеек заданных массивом в котором заранее неизвестно ни m ни n (они будут формирвться в процессе нажимания пользователем кнопочек) ???
Есть идея:
Stringgrid1.Cells[столбец,строка].brush.color := red ; // Указывается компонент,его элемент, свойство элемент := присваивается значение. Чего же тут не логично ?
Stringgrid1.Cells[столбец,строка из массива].brush.color := red ;
Однако Delphi такую лексику не распознает как логическую.
Хелп к дельфи доходчивых ответов мне не показал.

Прошу написать несколько простых примеров с пояснениями к каждой строчке. Для того чтобы я мог лучше разобораться.
С уважением к Вам и Вашему времени. Альберт.
Albert2008 вне форума Ответить с цитированием
Старый 28.07.2008, 14:11   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

На обработчике события OnDrawCell для StringGrid напишите примерно следующее:
Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ACol = 1) and (ARow = 1) then
  begin
    StringGrid1.Canvas.Brush.Color := clRed;
    StringGrid1.Canvas.FillRect (Rect);
    StringGrid1.Canvas.TextRect (Rect, Rect.Left + 2, Rect.Top + 2, StringGrid1.Cells[ACol,ARow]);
  end; {if}
end;
Т.е. в данном примере мы закрашиваем ячейку в позиции 1,1 красным цветом.
Arigato вне форума Ответить с цитированием
Старый 28.07.2008, 16:40   #3
Albert2008
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 26
Счастье

Простой, а главное показательный пример.
Но в нём все же не освещенно применение двумерного (а лучше динамического) массива с перечнем ячеек.

Кроме того:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (ACol = 1) and (ARow = 1) then // Чем отличается Acol,Arow От Col, Row ??? можноли написать Acol = mas1[n,m] ??? Если да, то где лучше задать эот массив (цыклы for)
begin
StringGrid1.Canvas.Brush.Color := clRed;//Кисти присовили красный цвет.
StringGrid1.Canvas.FillRect (Rect); //Что такое Fillrect и для чего он нужен ?
StringGrid1.Canvas.TextRect (Rect, Rect.Left + 2, Rect.Top + 2, StringGrid1.Cells[ACol,ARow]); //Вообще не ясно что здесь происходит.
9. end; {if}
10. end;
Albert2008 вне форума Ответить с цитированием
Старый 28.07.2008, 17:14   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Чем отличается Acol,Arow От Col, Row ???
Тем что Row показывает текущую строку а ARow передает в процедуру отрисовки строку отрисовать в которой процедура намылилась. А поскольку эта процедура вызывается фактически столько раз сколько ячеек видно на экране, то и ARow ACol соответственно меняются указывая всякий раз на ячейку которую срочно понадобилось проге перерисовать.
Цитата:
можноли написать Acol = mas1[n,m] ???
Зависит от задачи-твоя пока слабо понятна.
Цитата:
//Кисти присовили красный цвет.
ну да )
Цитата:
//Что такое Fillrect и для чего он нужен ?
Это процедура заливки прямоуголньой области - в данном случае эта область описана переменкой Rect
Цитата:
//Вообще не ясно что здесь происходит.
Ну сам подумай: в перерисовке ячейка заливается другим цветом, при этом все что в ней написано заливается. отсюда вывод - надо написанное перенаписать в ячейке заново (ну не совсем в ячейке а на экране в ее координатах) тому и применяется TextRect которая рисует текст поверх заливки, чего и добиваемся. Внимательно читай хелп про этот метод.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2008, 19:02   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Вот сейчас глянул свой пример...
Можно и без этого: StringGrid1.Canvas.FillRect (Rect);
Т.к. TextRect все равно закрасит тот же самый прямоугольник.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с многомерными массивами в функции. Очередной вопос начинающего (#005) Albert2008 Компоненты Delphi 14 13.08.2008 22:03
Stringgrid, Procedure, cells[m,n]:=DynMas[a,b]. Очередной вопрос начинающего (#003) Albert2008 Компоненты Delphi 4 04.08.2008 12:00
Procedure,function,Stringgrid (#004) Очередной вопрос начинающего. Albert2008 Компоненты Delphi 4 01.08.2008 21:30
Видимо очередной вопрос по БД... Amaranth Помощь студентам 1 16.12.2007 00:56