![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
рисование на StringGrid [D6]
Dush © (2005-11-01 12:23:00)Доброго времени суток!
при движении мыши у меня закрашиваютсь ячейки над которыми проходит курсор. Но при быстром движении курсора некоторые ячейки не закрашиваются. Как сдлеать так чтоб они закрашивались?
Dush (2005-11-02 10:35:00) [1]Спасибо большое SaF22 за ответы! но так как ничего не получилось (все равно прорисовывает с пропусками), решил попробовать с отрисовкой на канве формы. Еще раз большое спасибо :)
SaF22 (2005-11-01 14:51:00) [2]Тогда попбробуй сделать следующее:
procedure TMDIChild.Draw(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State:TGridDrawState);
begin
stringgrid1.Canvas.Brush.Color:=clRed;
if (gdselected in state) or (CrossArr[ARow,ACol]=1)
then
begin
StringGrid1.Canvas.FillRect(rect);
CrossArr[ARow,ACol]=1;
end;
end;
В коде могут быть ошибки, не проверял.
Короче идея такая: при первом выделении ячеек у тебя заполняется массив, приследующем закрашиваются новые ячейки плюс те которые в массиве. Идея понятна?
Просто я хотел тебе показать другой способ заполнения массива, в самой процедуре прорисовки Грида.
Dush (2005-11-01 14:37:00) [3]Не совсем так. когда я нажимаю левую кнопку мыши то в массив CrossArr в место, которое соответствует ячейке грида где нажата кнопка, заносится 1.
При перерисовке грида (OnDrawCell) берется значение из массива и если 1 то закрашиваем.
видимо при быстром перемещении курсора в нажатом состоянии числа не успевают заносится. в сзвязи с этим получаются пробела при закрашивании ячейки.
От этого мне и надо избавится :(
SaF22 (2005-11-01 14:02:00) [4]Короче, насколько я понял ты хочешь чтобы выделенные ячейки закрашивались красным цветом? тогда вот:
Unit...
interface
uses
....
type
TDrawCellEvent=procedure (Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState) of object;
....
procedure Draw(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State:TGridDrawState);
....
implementation
{$R *.dfm}
.....
procedure TMDIChild.Draw(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State:TGridDrawState);
begin
stringgrid1.Canvas.Brush.Color:=clRed;
if gdselected in state then StringGrid1.Canvas.FillRect(rect);
end;
и эту процедуру назначешь на событие OnDrawCell в свойствах stringGrid
Если что не так, то пиши
Dush (2005-11-01 13:53:00) [5]С нажатой. А это принципиально?
Dush (2005-11-01 13:46:00) [6]Прошу прощения что сразу не показал ее. Вот она:
Procedure DrawArr(X,Y:integer);
var CellCoord:TGridCoord;
begin
try
CellCoord:=SgCross.MouseCoord(X,Y);
MyCol:=CellCoord.X;
MyRow:=CellCoord.Y;
if (Pressed) then
begin
if MButton=mbLeft then CrossArr[MyRow,MyCol]:=1
else CrossArr[MyRow,MyCol]:=0;
end;
SgCross.Col:=CellCoord.x;
SgCross.Row:=CellCoord.y;
SgCross.Invalidate;
except
end;
end;
SaF22 (2005-11-01 13:43:00) [7]Так ты с нажатой кнопкой мыши закрашиваешь или без?
Dush (2005-11-01 13:41:00) [8]CrossArr - масив размерностью [0..RowCount-1,0..ColCount-1] в который заносятся "1" если нажата левая кнопка мыши.
SaF22 (2005-11-01 13:41:00) [9]Я так понимаю, что есть еще и процедура вычисляющая полет курсора над стрингом?
Dush (2005-11-01 13:34:00) [10]Пожалуйста:
procedure TMDIChild.sgCrossDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
{Заливка ячеек}
if (ACol>=0) and (ARow>=0) then
begin
IF (CrossArr[ARow,ACol]=1) Then sgCross.Canvas.Brush.Color:= clRed;
sgCross.Canvas.FillRect(Rect);
end;
end;
SaF22 (2005-11-01 13:30:00) [11]Покажи код процедуры в которой ты закрашиваешь ячейки.