Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

Рисование на канве mdwXLGrid   Найти похожие ветки 

 
Dimaxx ©   (2005-04-10 22:09) [0]

Собссно сабж, господа мастера!

Как отрисовать на его канве линии, а то при любом выводе на канву вызывается перерисовка ячеек и все нарисованное исчезает? А на VCL"овском можно было рисовать без проблем.

Автору вопрос отправил, но он пока молчит...


 
<Falcon>   (2005-04-11 12:54) [1]

Можно попробовать рисовать на битмапе и выводить его в onDrawCell
в ячейках.


 
Dimaxx ©   (2005-04-11 21:57) [2]

Рисовать сначала на битмапе, а потом кусками выводить в ячейки не катит.


 
<Falcon>   (2005-04-12 11:39) [3]

Как вариант:
Рисуй на канве грида, а для тех ячеек которые не должны перерисовываться - в onDrawCell установить  Access:=True и рисуй наздоровье. Вот так например:

if (ACol<3) and(ARow<3) then
   begin
     Access:=True;
     with ACanvas^ do
       begin
         Pen.Color:=clRed;
         Pen.PenStyle:=psSolid;
         Brush.Color:=clLime;
         Brush.BrushStyle:=bsSolid;
         FillRect(makerect(0,0,150,70));
         MoveTo(10,10);
         LineTo(50,50);
         Font.Color:=clBlack;
         TextOut(70,30,"Test");
       end;
   end
 else Access:=False;

Недостаток - отрисовка "художеств" будет вызываться для каждой ячейки. Так что если рисование навороченное то может и притормаживать будет.


 
mdw ©   (2005-04-12 18:25) [4]

<Falcon> правильно говорит. Торможения быть не должно, т.к. рисуются не все, а только видимые ячейки.


 
Dimaxx ©   (2005-04-12 23:07) [5]

Спасибо, попробую. А то я сначала и не понял для чего этот Access нужен...


 
Dimaxx ©   (2005-04-14 01:12) [6]

Проверил... Нифига не работает!

Может для отдельной ячейки прокатит, но в моем случае не катит. Мне нужно соединять центры разных ячеек. Можно до рисования на кнве сделать BeginUpdate, а к конце рисования EndUpdate, но канва постоянно перерисовывается и получается мерцание.


 
<Falcon>   (2005-04-14 10:53) [7]

Тогда вычисляй ячейки через которые будут проходить линии (а не только те, центры которых соединяешь) и для них объявляй Access:=True. И всего делов.
Только у меня вот сомнения, а нужно ли для таких вещей таблицу использовать? Может разграфи себе битмэпчик и на нем твори? Хотя я не знаю твою задачу...
Если рисуешь в  onDrawCell, то  BeginUpdate - EndUpdate смысла не вижу. А насчет мерцания, попробцй с DoubleBuffered поиграться.


 
Dimaxx ©   (2005-04-14 23:30) [8]

C DoubleBuffered играл - мерцание все равно есть, но меньше. Я уже думал насчет битмапа, но мне нужно двойным щелчком вызывать свойства "кубика", а также выделять их группами (удаление, изменение отдельных свойств). Поэтому городить код собственного выбора групп не имеет смысла - слишком громоздко и неудобно. Хотя если решения не найдется - придется рисовать самому.

mdw обещал посмотреть код VCL"овского грида - там нормально можно рисовать.


 
Dimaxx ©   (2005-04-14 23:33) [9]

Забыл добавить...

Я для эксперимента ВСЕ ячейки объявлял Access:=True. При отрисовке линий соединения они (линии) появлялись на долю секунды, а потом затирались. Хотя я рисую линии в OnDrawCell и по идее после перерисовки все должно опять отрисоваться. Но этого не происходит.


 
ECM ©   (2005-04-15 10:56) [10]

Для того чтобы побороть моргания и лишние перерисовки ...ИМХО..
(без DoubleBuffered особенно) нужно еще перекрыть обработку WM_ERASEBKGND... Можно попробовать там вообще ничего не рисовать, либо отрисовывать полностью тоже самое что и в WM_PAINT (вынести всю отрисовку в отд. процедуру например).


 
thaddy   (2005-04-15 11:17) [11]

If the cells are not in the cliprect, don&#39;t update?
I use the canvas.cliprect wherever I can since it was added.


 
thaddy   (2005-04-15 11:18) [12]

If the cells are not in the cliprect, don&#39;t update?
I use the canvas.cliprect wherever I can since it was added.


 
<Falcon>   (2005-04-16 18:59) [13]

У меня все работает. ;-))
Вот код, если нужно, могу выслать демо-проект
Клацаем в первую ячейку, затем нажимаем контрол и клацаем по следующим ячейкам. Соединяем все линией. Отпускаем контрол - выбираем первую точку в следуюжей линии.

{ KOL MCK } // Do not remove this line!
{$DEFINE KOL_MCK}
unit test;

interface

{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL, KOLmdvXLGrid {$IFNDEF KOL_MCK}, mirror, Classes, Controls, mckControls, mckObjs, Graphics,
 MCKmdvXLGrid {$ENDIF};
{$ELSE}
{$I uses.inc}
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;
{$ENDIF}

type
 TSelCells = packed record
   FirstCell: TPoint;
   SndCell :  TPoint;
 end;

 {$IFDEF KOL_MCK}
 {$I MCKfakeClasses.inc}
 {$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
 {$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
   Form: PControl;
 {$ELSE not_KOL_MCK}
 TForm1 = class(TForm)
 {$ENDIF KOL_MCK}
   KOLProject1: TKOLProject;
   KOLForm1: TKOLForm;
   Grid1: TKOLmdvXLGrid;
   procedure KOLForm1FormCreate(Sender: PObj);
   procedure Grid1KeyDown(Sender: PControl; var Key: Integer;
     Shift: Cardinal);
   procedure Grid1MouseDown(Sender: PControl;
     var Mouse: TMouseEventData);
   procedure Grid1MouseUp(Sender: PControl;
     var Mouse: TMouseEventData);
   procedure Grid1DrawCell(Sender: PControl; ACol, ARow: Integer;
     ACell: PmdvXLCell; ACanvas: PCanvas; ARect: TRect; ASelected,
     AFocused: Boolean; var Access: Boolean);
 private
   { Private declarations }
 public
   Pic : array of TSelCells;
   temp : TSelCells;
   { Public declarations }
 end;

var
 Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}

implementation

{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}

{$IFDEF KOL_MCK}
{$I test_1.inc}
{$ENDIF}

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
 SetLength(Pic,1);
end;

procedure TForm1.Grid1KeyDown(Sender: PControl; var Key: Integer;
 Shift: Cardinal);
 var
 ARect: TRect;
begin
 if Key = VK_CONTROL then
   begin
     ARect:=Grid1.CelltoRect(Grid1.Position.X,Grid1.Position.Y);
     temp.FirstCell:=makepoint((ARect.Left + ARect.Right) div 2,(ARect.Top + ARect.Bottom) div 2);
   end;
end;

procedure TForm1.Grid1MouseDown(Sender: PControl;
 var Mouse: TMouseEventData);
 var
 ARect: TRect;
begin
 if (GetKeyState(VK_LCONTROL)<0) AND (mouse.Button = mbLeft)then
   begin
     ARect:=Grid1.CelltoRect(Grid1.MouseToCell(mouse.X,mouse.Y).X,Grid1.MouseToCell(mouse.X,mouse.Y).Y);
     temp.SndCell:=makepoint((ARect.Left + ARect.Right) div 2,(ARect.Top + ARect.Bottom) div 2);
     SetLength(Pic,Length(Pic)+1);
     Pic[High(Pic)].FirstCell:=Temp.FirstCell;
     Pic[High(Pic)].SndCell:=Temp.SndCell;
   end;
end;

procedure TForm1.Grid1MouseUp(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 if (GetKeyState(VK_LCONTROL)<0) AND (mouse.Button = mbLeft)then

end;

procedure TForm1.Grid1DrawCell(Sender: PControl; ACol, ARow: Integer;
 ACell: PmdvXLCell; ACanvas: PCanvas; ARect: TRect; ASelected,
 AFocused: Boolean; var Access: Boolean);
var
i: integer;
begin
 Access:=true;
 With ACanvas^ do
   begin
     if ASelected  then ACanvas.Brush.Color:= Grid1.SelectedColor
      else ACanvas.Brush.Color:=ACell.Color;
    ACanvas.Brush.BrushStyle:= bsSolid;
    ACanvas.Pen.PenWidth:= 1;
    ACanvas.Pen.PenMode:= pmCopy;
    ACanvas.Pen.Color:= Grid1.LineColor;
    ACanvas.Rectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
    ACanvas.FillRect(ARect);
    Pen.Color:=clBlack;
    Pen.PenWidth:=2;
    for i:=0 to High(Pic) do
     begin
       MoveTo(Pic[i].FirstCell.X, Pic[i].FirstCell.Y);
       LineTo(Pic[i].SndCell.X, Pic[i].SndCell.Y);
     end;
   end;

end;

end.


 
<Falcon>   (2005-04-16 19:09) [14]

И никакого мерцания, все нормально. D7,KOL 2.07
2 Dimaxx
А какая версия сетки? Текущая 1.15 кажется.
И если раскапаешь, в чем трабл был - напиши, уже просто интересно.


 
Dimaxx ©   (2005-04-17 21:23) [15]

У меня последняя версия сетка - 1.14. На сайте автора - аналогично. Демо на мыло, плиз... Вместо с откомпиленным экзешником. Я попробую его, пото откомпилю у себя и проверю...


 
mdw ©   (2005-04-18 11:09) [16]

Выложил на сайт автора версию 1.15. В v1.14 с отрисовкой возникли проблемы после какого-то обновления KOL, в 1.15 это исправлено.


 
<Falcon>   (2005-04-18 19:16) [17]

ОК. Лови дему с экзешником. Но я использовал сетку 1.15, может поэтому у меня и все нормально с отрисовкой.


 
Vladimyr ©   (2005-04-18 21:07) [18]

mdw: А можно ссылку на 1.15?
А то что-то не найду никак...


 
Dimaxx ©   (2005-04-18 23:46) [19]

http://www.mdvkol.narod.ru/


 
Dimaxx ©   (2005-04-19 23:14) [20]

2 <Falcon>:

Попробовал - нифига не выходит! Твой код пашет - мой мерцает! Двадцать раз оба кода пересмотрел. И вот ведь идиотизм! И как я не заметил сразу! Оказывается, я рисовал "кубики" используя локальную ACanvas, а линии рисовал, используя XLGrid1.Canvas!!!!! Поменял в рисовании линий XLGrid1.Canvas на ACanvas и все заработало!!

Всем спасибо! Все свободны! :-)



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.044 c
2-1132703422
SergP
2005-11-23 02:50
2005.12.11
Update одной таблицы из другой.


2-1132763349
floxi
2005-11-23 19:29
2005.12.11
RichEdit-ы


6-1121692051
Соловьев
2005-07-18 17:07
2005.12.11
IMAP - тип папки на сервере


6-1125037197
Windows
2005-08-26 10:19
2005.12.11
Проблема с функцие определения подключения к интернету


4-1128583835
greg123
2005-10-06 11:30
2005.12.11
Запись информации в свойства файла