Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Внизрисование на StringGrid Найти похожие ветки
← →
Dush (2005-11-01 12:23) [0]Доброго времени суток!
при движении мыши у меня закрашиваютсь ячейки над которыми проходит курсор. Но при быстром движении курсора некоторые ячейки не закрашиваются. Как сдлеать так чтоб они закрашивались?
← →
SaF22 (2005-11-01 13:30) [1]Покажи код процедуры в которой ты закрашиваешь ячейки.
← →
Dush (2005-11-01 13:34) [2]Пожалуйста:
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;
← →
Dush (2005-11-01 13:41) [3]CrossArr - масив размерностью [0..RowCount-1,0..ColCount-1] в который заносятся "1" если нажата левая кнопка мыши.
← →
SaF22 (2005-11-01 13:41) [4]Я так понимаю, что есть еще и процедура вычисляющая полет курсора над стрингом?
← →
SaF22 (2005-11-01 13:43) [5]Так ты с нажатой кнопкой мыши закрашиваешь или без?
← →
Dush (2005-11-01 13:46) [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;
← →
Dush (2005-11-01 13:53) [7]С нажатой. А это принципиально?
← →
SaF22 (2005-11-01 14:02) [8]Короче, насколько я понял ты хочешь чтобы выделенные ячейки закрашивались красным цветом? тогда вот:
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 14:37) [9]Не совсем так. когда я нажимаю левую кнопку мыши то в массив CrossArr в место, которое соответствует ячейке грида где нажата кнопка, заносится 1.
При перерисовке грида (OnDrawCell) берется значение из массива и если 1 то закрашиваем.
видимо при быстром перемещении курсора в нажатом состоянии числа не успевают заносится. в сзвязи с этим получаются пробела при закрашивании ячейки.
От этого мне и надо избавится :(
← →
SaF22 (2005-11-01 14:51) [10]Тогда попбробуй сделать следующее:
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-02 10:35) [11]Спасибо большое SaF22 за ответы! но так как ничего не получилось (все равно прорисовывает с пропусками), решил попробовать с отрисовкой на канве формы. Еще раз большое спасибо :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c