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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2013, 09:01   #1
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию OnDrawCell событие StringGrid

подскажите пожалуйста, можно ли сделать так, чтобы событие ondrawcell выполнялось только при нажатии кнопки?
Sv. вне форума Ответить с цитированием
Старый 11.07.2013, 09:25   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

извините, что влезаю в вашу тему, но жутко любопытно:
а зачем Вам такое?!! событие onDrawwCell выполняется, когда грид нужно прорисовать (перерисовать). Причём независимо от вашей кнопки!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.07.2013, 09:32   #3
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

Код:
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
  int xa,ya, i, j;

xa=Rect.left+(Rect.Width()-StringGrid1->Canvas->TextWidth(StringGrid1->Cells[ACol][ARow]))/2;
ya=Rect.top+(Rect.Height()-StringGrid1->Canvas->TextHeight(StringGrid1->Cells[ACol][ARow]))/2;

for (j = 0; j < m ; j++){
int max=ptr[0][0];
for (i = 0; i < n ; i++)
{
			if(ptr[i][j]>max)
			{
				max = ptr[i][j];
                                max_col=j;
                                max_row=i;
			}
		}


if(ACol==max_col && ARow==max_row) { StringGrid1->Canvas->Brush->Color=ColorBox1->Selected;
StringGrid1->Canvas->FillRect(Rect);
}
if(ACol==max_col && ARow==max_row) { StringGrid1->Canvas->Font->Color = ColorBox2->Selected ;
StringGrid1->Canvas->TextOut(xa,ya,StringGrid1->Cells[ACol][ARow]); } }
if(flag)
{StringGrid1->Canvas->Brush->Color=clWindow;
StringGrid1->Canvas->FillRect(Rect);}

}
закрашивает ячейки с максимальными элементами в столбцах, но когда нажимаю кнопку сброс, то массив удаляется и вылазит ошибка, потому что пытается перерисовать, но здесь
Код:
int max=ptr[0][0];
нет никакого значения

Последний раз редактировалось Sv.; 11.07.2013 в 09:34.
Sv. вне форума Ответить с цитированием
Старый 11.07.2013, 12:51   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

вариант 1.
Как Вы "сбросываете массив" ? Возможно ли получить размер (длину) сброшенного массива?
что-нибудь типа if ( ptr != null) ....
или if ( ptr.size() != 0 ) ...

вариант 2.
Если, допустим, Вы не знаете, как получить длину/размер массива, тогда можно решить задачу через использование флага (семафора).
Заведите переменную - isMassivExist типа bool (или int и значения 0 и 1)
когда массив заполнен, присваивайте ей isMassivExist = true, когда сбрасываете массив - тогда isMassivExist = false;

ну и в обработчике onDrawCell пишете:
Код:
if (isMassivExist)
{
    тут весь ваш код по поиску и закраске максимальных значений
}
впрочем, эта идея не должна для Вас быть неожиданной. Ведь Вы какой-то flag уже используете в коде обработчика!


вариант 3. Вы когда массив сбрасываете - StringGrid очищаете?
Можно это и проверять в onDrawCell...

надеюсь, моя идея решения в целом понятна?...

Последний раз редактировалось Serge_Bliznykov; 11.07.2013 в 12:54.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StringGrid — событие после изменения содержимого ячейки Alex11223 Общие вопросы Delphi 23 30.05.2014 15:24
onDrawCell C++ Builder Multiman Помощь студентам 0 11.04.2012 11:27
Событие OnSelectCell в StringGrid Екатерина_21 C++ Builder 0 09.10.2011 20:53
StringGrid(событие) + Array + Memo ? Tenebor Компоненты Delphi 10 03.05.2011 13:37
StringGrid и событие OnMouseMove XTasy Помощь студентам 1 04.04.2009 16:02