void __fastcall TMainForm::VPoleDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if(Pole->IsBusy(ARow,ACol))
VPole->Canvas->Brush->Color = clGreen;
else
VPole->Canvas->Brush->Color = clWhite;
VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol));
}
Маштабирование DrawGrid
Пишу игру "Жизнь", полем является DrawGrid, ячейки которого заполняются одним или другим цветом с помощью FillRect в OnDrawCell, при маштабировании DawGrid с помощью изменения свойств DrawGrid (DefaultRowHeight и DefaultColWidth) и обновлении DrawGrid местами появляются сбои. Подскажите, пожалуйста, как их избежать. Заранее благодарен.
Что за сбои? Поясни, пожайлуста. И код неплохо бы приводить, например у меня при изменении вышеуказанных св-в все ок. У тебя DefaultDrawing == true?
DefaultDrawing был false, с ним все работало, кроме увеличения и уменьшения (при них некоторые ячейки разваливались на прямоугольники или
наоборот соединялись в большие квадраты и прямоуголиники), после того как поставил DefaultDrawing в true увеличение и уменьшение работает, но после
клика на ячейки квадрат не всегда меняет цвет, а только после увеличения
или уменьшения, попробывал поставить refresh в DrawCell, как будто прога зависает. Вообщем подскажи если можешь.:confused:
Код:
Клик обрабатываю с помощью OnMouseUp.
Код:
void __fastcall TMainForm::VPoleMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
int i,j;
VPole->MouseToCell(X,Y,i,j);
if (Pole->IsEmpty(i,j))
{
Pole->SetBusy(i,j);
VPole->Canvas->Brush->Color = clGreen;
}else{
Pole->SetEmpty(i,j);
VPole->Canvas->Brush->Color = clWhite;
}
VPole->Canvas->FillRect(VPole->CellRect(i,j));
TMouseButton Button, TShiftState Shift, int X, int Y)
int i,j;
VPole->MouseToCell(X,Y,i,j);
if (Pole->IsEmpty(i,j))
{
Pole->SetBusy(i,j);
VPole->Canvas->Brush->Color = clGreen;
}else{
Pole->SetEmpty(i,j);
VPole->Canvas->Brush->Color = clWhite;
}
VPole->Canvas->FillRect(VPole->CellRect(i,j));
Ну естественно, у тебя бесконечная рекурсия получается:
<выдержка из help-а>
void __fastcall Refresh(void);
Description
Call Refresh method to repaint the control immediately.
</выдержка из help-а>
:)
Поставь Refresh() в VPoleMouseUp(...) посде FillRect(...) и все будет хорошо.
на другой клетке, старая снова мигает зеленым, как будто она прорисовывается зеленым, а затем снова белым.
Едва ли это изменит картину, но оптимизирует:
в DrawCell
Код:
замени
VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol));
на
VPole->Canvas->FillRect(Rect);
VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol));
на
VPole->Canvas->FillRect(Rect);
он же тебе в параметрах передается.
P.S.: странно, такую же методику использовал ранее (специально нашел старую программку) все прекрасно работало...
Едва ли это изменит картину, но оптимизирует:
в DrawCell
Код:
замени
VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol));
на
VPole->Canvas->FillRect(Rect);
VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol));
на
VPole->Canvas->FillRect(Rect);
он же тебе в параметрах передается.
P.S.: странно, такую же методику использовал ранее (специально нашел старую программку) все прекрасно работало...[/QUOTE]
Не совсем тебя понял, если имел ввиду закомментировать FillRect в OnMouseUp и поставить там Refresh, то это ничего не дало все также, мигало. А вот после того как в параметрах заменил VPole->Canvas->FillRect(VPole->CellRect(ARow,ACol)); на VPole->Canvas->FillRect(Rect); пропало мигание! все клетки стали работать как надо (закрашиваться по нажатию то одним то другим цветом) но теперь закрашивается не клетка на которою нажал, а клетка симметричная ее относительно главной диагонали!:o Вообщем полтергейст какой-то.
Если есть время могу выслать исходники посмотреть.
Кстати Refresh все-таки помог без него не выделяется.
Спасибо, все работает, я извиняюсь, сам виноват в DrawCel при проверки на занятость поля перепутал местами ARow и ACol, сколько ни смотрел не замечал.