Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Tdrawgrid


Автор: svarogik 25.7.2006, 22:13
у меня в с помощью объекта TdrawGrid и матрицы прорисовывается карта, но при прокрутке объекта начинает глючить, и не рисует то что за экраном, вместо нужных картинок вообще ничего не прорисовывает. прорисовка на событии onDrawcell

Добавлено @ 22:15 
 alexeis1 надеюсь на твою помощь, ты помнишь, что ты мне советовал?

Добавлено @ 22:16 
вот первый том 

Автор: svarogik 25.7.2006, 22:17
вот второй, прокручивайте и увидите ошибку 

Автор: Snowy 25.7.2006, 23:04
А он и не должен рисовать "за экраном"
Рисуется только видимая в данный момент область. 

Автор: svarogik 25.7.2006, 23:07
ты скачай и посмотри, я понимаю что за экраном не должен, но когда я прокручиваю в область которая невидима, она становится видимой, но на ней все равно ничего не рисуется 

Автор: Snowy 25.7.2006, 23:22
Код отрисовки давай.
Видимо что-то напутано с координатами. 

Автор: svarogik 26.7.2006, 10:14
Код

procedure TEditor.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var r : Trect;
begin
  {r := DrawGrid1.CellRect(ACol, ARow);}

  {DrawGrid1.Canvas.brush.color := matrix[ACol, ARow];}

   if netprs then
   begin;
   p1:=ACol;
   p2:=ARow;
   end else
   begin
   p1:=0;
   p2:=0;
   END;

   if not zoom then
   ImageList2.Draw(DrawGrid1.Canvas,(ACol*drawgrid1.DefaultColWidth+p1), ARow*drawgrid1.DefaultRowHeight+p2,matrix[Acol,Arow])
   else
     ImageList3.Draw(DrawGrid1.Canvas,(ACol*drawgrid1.DefaultColWidth+p1), ARow*drawgrid1.DefaultRowHeight+p2,matrix[Acol,Arow]);


   {DrawGrid1.Canvas.FillRect(r);}


  {DrawGrid1.Canvas.FillRect(r);}


end;


во, переменные netprs,p1,p2 нужны для того чтоб при прорисовке учитывалась ширина и длина сетки

Добавлено @ 10:20 
Код

procedure TEditor.DrawGrid1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);

  begin
if mousepressed {and(}  then
begin
  if ((x<  DrawGrid1.ColCount*drawgrid1.DefaultColWidth+p1)and (x>0)){DrawGrid1.left)} and
 ((y<DrawGrid1.rowCount*drawgrid1.DefaultrowHeight+p2) and (y>0)){DrawGrid1.top)} then
 begin
  drawgrid1.MouseToCell(X, Y, Col, Row);
  matrix[Col, Row] := brusch;
  end;


  end;

  
end;

еще вот 

Автор: Alexeis 26.7.2006, 10:29
svarogik, я и без кода вижу, что не возникает события onDrawCell
при прокрутке, а это уже какой-то баг в компоненте. 

Автор: svarogik 26.7.2006, 10:35
я это тоже вижу, но мне бы хотелось чтоб возникал, что нибудь сделать можно? 

Автор: Alexeis 26.7.2006, 10:44
Я ошибся это ошибка где-то в коде прорисовки smile 
Вот простой пример, который отлично работает при прокрутке, и при этом ничего не стирается, а прокрученные ячейки нормально обновляются
Код

procedure TForm1.drwgrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var r : Trect;
begin
  r := drwgrd1.CellRect(ACol, ARow);
  drwgrd1.Canvas.brush.color := clGreen;
  drwgrd1.Canvas.FillRect(drwgrd1.CellRect(ACol, ARow));
end;


Добавлено @ 10:47 
В чем смысл?
Код

  if netprs then
   begin;
   p1:=ACol;
   p2:=ARow;
   end else
   begin
   p1:=0;
   p2:=0;
   END;


Добавлено @ 10:49 
Цитата(svarogik @  26.7.2006,  10:14 Найти цитируемый пост)
(ACol*drawgrid1.DefaultColWidth+p1)

Зачем таким жутким образом считать координаты точки! Есть же значения r.Top и значение r.Left?
 

Автор: svarogik 26.7.2006, 10:52
я знаю про все это, пока просто не исправил, тут дело в другом, у тебя рисуются просто квадратики цветные, а у меня картинки

Добавлено @ 10:55 
Код

drwgrd1.Canvas.FillRect(drwgrd1.CellRect(ACol, ARow));


Зачем?
Код

drwgrd1.Canvas.FillRect(r);



вот так нельзя? 

Автор: Snowy 26.7.2006, 11:01
Не имеет значения, что рисовать.
Ты просто неправильно считаешь координаты.
И не так считаешь.
И незачем их вообще считать - тебе уже всё дано. 

Автор: svarogik 26.7.2006, 11:01
Код

r := drwgrd1.CellRect(ACol, ARow);


а можно чтоб было так, и в этот квадратик рисовалась картинка из ImageList?

Добавлено @ 11:09 
Код

ImageList2.Draw(DrawGrid1.Canvas,(r.left+p1), r.top+p2,matrix[Acol,Arow]);

я вот так сделал, но из-за того что сеточка обладает собственной шириной у меня чем дальше от верхнего левого угла, тем дальше в каждой клеточке рисуется картинка  

Автор: Alexeis 26.7.2006, 11:20
Вот и с рисунком
Код

procedure TForm1.drwgrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var r : Trect;
begin
  r := drwgrd1.CellRect(ACol, ARow);
  iL1.Draw(drwgrd1.Canvas, r.Left, r.Top,0);
end;
 

Автор: svarogik 26.7.2006, 11:32
круто, спасибо 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)