Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Рисование на канве 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 вся ветка

Форум: "KOL";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.035 c
10-1109040291
rosl
2005-02-22 05:44
2005.12.11
строки из word


2-1132661817
Esenin
2005-11-22 15:16
2005.12.11
Помогите загрузить jpeg в TImage из TMemoryStream.


14-1132381507
Kolan
2005-11-19 09:25
2005.12.11
Поздравьте меня, я сдал на права :)


4-1129145897
Вася
2005-10-12 23:38
2005.12.11
Подскажите софтину для просмотра свойств, определения Handlов...


14-1132571747
syte_ser78
2005-11-21 14:15
2005.12.11
Как прога зовется?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский