Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2009, 02:46   #1
VSemV
 
Регистрация: 18.07.2008
Сообщений: 5
По умолчанию Проблема с отрисовкой в PaintBox Делфи

Идея такая -- отрисовываю всё что надо в BitMap и вывожу его на PaintBox. Всё что надо -- это фон и круги, с координатами из БД. Если добавлять записи в БД, добавляются круги. А если, допустим, удалить все записи из базы, то круги всё-равно останутся(надо, чтоб удалялись!)..
Понятно, что что-то как-то надо очищать, но вроде всё и так должно перерисовываться.. Как я понял, OnPaint перерисовывает PaintBox каждый раз заново.

Код:
var
  map: TBitMap;
  mapbmp: TBitMap;  // грузится из файла
.....

procedure TForm1.PaintBox1Paint(Sender: TObject);
var i: integer;
begin
//собственно всё рисую в map.. фон
  map:=mapbmp;  //есть подозрения, что что-то не так здесь:)

//из бд в map рисуются круги..
  if Nodes.Active then  
    if Nodes.RecordCount>0 then
      for i:=0 to Nodes.RecordCount do begin
        Nodes.RecNo:=i;
        map.Canvas.Ellipse(Nodes['Коорд_X']-2,Nodes['Коорд_Y']-2,Nodes['Коорд_X']+2,Nodes['Коорд_Y']+2);
      end;


  dRect:=Bounds(0,0,PaintBox1.Width,PaintBox1.Height);
  sRect:=Rect(mappos.x,mappos.y,mappos.x+PaintBox1.Width,mappos.y+PaintBox1.Height);

//map на PaintBox
  PaintBox1.Canvas.CopyRect(dRect,map.Canvas,sRect);
end;

Последний раз редактировалось VSemV; 26.05.2009 в 02:54.
VSemV вне форума Ответить с цитированием
Старый 26.05.2009, 09:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попробуй вставить
Код:
PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
В начало обработчика.
Вот в нагрузку пример:
Код:
var    ax,ay:integer;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
 PaintBox1.Canvas.Ellipse(ax-10,ay-10,ax+10,ay+10);
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 ax:=x;ay:=y;
 PaintBox1.Repaint;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2009, 11:14   #3
VSemV
 
Регистрация: 18.07.2008
Сообщений: 5
По умолчанию

Не.. Всё так же, только ещё мельтешение появилось при промотке изображения.. помоему тут как-то надо очищать map..

Код:
map:=mapbmp;

ака

bitmap:=bitmap;
что делает? копирует изображение или копирует адрес на изображение?


ps если отрисовывать прямо на paintBox -- всё нормально только мельтешение, даже если DoubleBuffered:= True; прописать..

Последний раз редактировалось VSemV; 26.05.2009 в 11:17.
VSemV вне форума Ответить с цитированием
Старый 26.05.2009, 11:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Скорее копирует все а не олько изображение.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2009, 11:33   #5
VSemV
 
Регистрация: 18.07.2008
Сообщений: 5
По умолчанию

Ну эт понятно.. просто никаких других вариантов не могу придумать) А если бы они после присвоения стали бы ссылаться на один и тот же диапазон памяти, всё стало бы просто и понятно и можно было бы с чистой совестью идти искать другие способы А так, пара строчек кода, а не работает..
VSemV вне форума Ответить с цитированием
Старый 26.05.2009, 11:38   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Помоему ты просто запарился...
Почему обязательно все отрисовывать на промежуточном битмапе, а не сразу на Паинтбоксе?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2009, 11:53   #7
VSemV
 
Регистрация: 18.07.2008
Сообщений: 5
По умолчанию

Цитата:
Сообщение от VSemV Посмотреть сообщение
ps если отрисовывать прямо на paintBox -- всё нормально только мельтешение, даже если DoubleBuffered:= True; прописать..
просто это будет типа векторная карта.. и узлы грузятся из БД.. Если узлов будет >1к? всё будет ну очень некрасиво мигать при перерисовке.. щас попробую всё отрисовать в левый paintBox и оттуда копировать если и это не прокатит, будет грустно
VSemV вне форума Ответить с цитированием
Старый 26.05.2009, 13:32   #8
VSemV
 
Регистрация: 18.07.2008
Сообщений: 5
По умолчанию

Вобщем решил тем, что рисую в имейдж, потом вывожу в paintbox.. причем, если рисовать сразу из того bitmap'a, который грузится из файла, то выводится криво присваиваю его другому bitmap'y и рисую из него -- всё нормально.. Бред.. но теперь работает
VSemV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с отрисовкой заголовка кросс-отчета FastReport4 madmech Общие вопросы Delphi 3 06.05.2009 17:54
Проблема с отрисовкой дочрних областей. DJ_Rain Win Api 0 30.04.2009 18:31
Проблема в Делфи Лунатик222 Помощь студентам 2 02.02.2009 20:04
VS .NET MFC, непонятки с отрисовкой в CDC oto_aki Visual C++ 1 08.12.2007 14:45
HELP!!! Проблема с отрисовкой frai Общие вопросы Delphi 1 11.05.2007 21:17