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

Вниз

TCanvas и отрисовка #2 =)   Найти похожие ветки 

 
sco   (2009-02-28 18:16) [0]

Старую тему закрыли, т.к. я по своей глупости задал её ещё и в разделе новичков =) а енто не подходит под правила.

в общем по сабжу: игра морской бой (лаба по сокетам), отрисовку делаю через PaintBox (2 штуко) => Form.Canvas;

по принципу (Draw - процедура в которой я указываю клетку поля, и индекс того изображение которое я должен в неё загрузить):

procedure TMainF.Draw(x,y: byte; figure: byte);
type PImage = ^TBitMap;
var image: Pimage;

procedure DrawImage(fromA: TPicture; toA: Tcanvas; x,y: integer);
begin
 DrawRect.Left:=x;
 DrawRect.Top:=y;
 DrawRect.Right:=x+FromA.Width;
 DrawRect.Bottom:=x+FromA.Height;
 BitBlt(toA.Handle,x,y,fromA.Width,fromA.Bitmap.Height,fromA.Bitmap.Canvas.Handle ,0,0,srcCopy)
end;
begin
if boj then image:=@MyBM else image:=@EnBM;
case figure of
 ... : DrawImage(im[figure],image.Canvas,x,y);
end;
if obj then MyBox.OnPaint(self) else EnBox.OnPaint(self);
end;

где
im[x] - array[1..27] of TPicture; который создаётся и удаляется по ходу работы программы (onFormCreate, onnFormClose);
вот прорисовка отдельно взятого PaintBox-а:
procedure TMainF.EnBoxPaint(Sender: TObject);
begin
BitBlt(canvas.Handle,DrawRect.Left+MyBox.Width,DrawRect.Top,DrawRect.Right,DrawRect.Bottom,
 EnBM.Canvas.Handle,DrawRect.Left,DrawRect.Top,srcCopy);
end;

вот прорисовка формы:

procedure TMainF.FormPaint(Sender: TObject);
begin
BitBlt(canvas.Handle,0,0,MyBM.Width,MyBM.Height,MyBM.Canvas.Handle,0,0,srcCopy);
BitBlt(canvas.Handle,MyBox.Width,0,EnBM.Width,EnBM.Height,EnBM.Canvas.Handle,0,0 ,srcCopy);
end;


После непродолжительной работы программы (идёт расчёт на минут 10-30 а дохнет она за 1-2 xD) происходит примерно вот ето:
_http://s52.radikal.ru/i136/0902/cf/e6caa534a6bd.jpg
Грубо говоря PaintBox просто отваливается... причём не всегда етот (бывает и тот что левее). И перестаёт что-либо рисовать. Ранее я пробовал вместо PaintBox-ов TImage-ы, но с ними была та же байда.

в чём причина данной "внезапной смерти" PaintBox (ну и TImage)? как её избежать?


 
имя   (2009-02-28 22:33) [1]

Удалено модератором


 
имя   (2009-03-01 02:20) [2]

Удалено модератором


 
sco   (2009-03-01 09:27) [3]

мм удалённый пользователь, если вы хотели написать чтонибудь по делу... но гм... были удалены - faiwer@gmail.com =) не откажусь от помощи в разрешении этой проблемы.


 
DVM ©   (2009-03-01 20:44) [4]


> MyBox.OnPaint(self) else EnBox.OnPaint(self);

это зачем?


 
sco   (2009-03-01 21:31) [5]

без этого не прорисовывается =)
внесу ясность:
enBM,myBM: TBitMap;
MyBox,EnBox: TPaintBox;


 
DVM ©   (2009-03-02 00:44) [6]


> sco   (01.03.09 21:31) [5]
>
> без этого не прорисовывается =)

Так конечно можно делать, но все же несколько неправильно с точки зрения идеологии Windows вызывать обработчик OnPaint напрямую. Правильнее инициировать обновление области (InvalidateRect, Invalidate) и т.д.


 
DVM ©   (2009-03-02 00:48) [7]


> type PImage = ^TBitMap;


> if boj then image:=@MyBM else image:=@EnBM;

Это все лишнее, достаточно:

var
 image: TBitmap;

if boj then image:=MyBM else image:=EnBM;


 
DVM ©   (2009-03-02 00:52) [8]


> в чём причина данной "внезапной смерти" PaintBox (ну и TImage)?
>  как её избежать?

Причина вряд ли в приведенном коде.

Он что "отваливается" молча без ошибок и исключений?

Ты доп. потоки случайно не используешь?
Обмен по сети у тебя сделан с использованием каких компонентов?


 
sco   (2009-03-02 04:26) [9]

да без ошибок и исключений... и всегда при разных обстоятельствах
дополнительный поток использую:

========================
TSeaWarsServer = class(TThread) // íèòü ñåðâåðà
protected
 procedure Execute; override;
public
 clientrdy: boolean;
 serverrdy: boolean;
 client_address: sockaddr_in;
 client_address_size: integer;
 close: boolean;
 intbuf: byte;
 procedure disconnect;
 procedure StartGame;
 procedure send(i: byte); overload;
 procedure Play;
end;

TSeaWarsClient = class(TThread) // íèòü êëèåíòà
private
protected
 procedure Execute; override;
public
 server_address: sockaddr_in;
 server_address_size: integer;
 intbuf: byte;
 close: boolean;
 procedure disconnect;
 procedure StartGame;
 procedure send(i: byte); overload;
 procedure play;
end;
========================

один из вышеописанных потоков всегда (при соединении) включён. выключается при дисконнекте, подключается при соединении =)

>> Обмен по сети у тебя сделан с использованием каких компонентов?
вручную, по WinAPI, так требует препод =)


 
sco   (2009-03-02 04:31) [10]

вот так я их тушу

=======================
procedure TSeaWarsClient.disconnect;
begin
 ...
 close:=true;
 WSACleanUp; // âûõîäèì
 Destroy;
end;

procedure TSeaWarsClient.Execute;
begin
...
while (connected) and (not close) do
 t:=recvfrom....
 if close then exit;
...
end;  
end;
=======================

вот так включаю - Server:=TSeaWarsServer.Create(false);


 
sco   (2009-03-02 04:34) [11]

как мне показалось (не уверен), данный глюк стал появляться реже после того как я перестал использовать TIcon и стал использовать только TBitMap

в старой теме Brother (C) выложил это:
==========================
для эксперимента:
кинь два Timage рядом друг с другом и button,
во 2 Timage загрузи картинку (желательно не меньше 640х480),
на кнопку такой код:
image1.Picture.Bitmap.Canvas.Draw(0,0, image2.Picture.Bitmap );
form1.Canvas.Draw(0,0, image2.Picture.Bitmap);
анализируй увиденное...
==========================
я проверил.. да, тоже самое, вот тока "анализировать увиденное" мне не удалось =) я думаю природа глюка та же самая =)


 
имя   (2009-05-19 15:51) [12]

Удалено модератором



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

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

Наверх




Память: 0.5 MB
Время: 0.005 c
2-1443892079
QAZ
2015-10-03 20:07
2017.06.18
несуществующий файл каторый существует


8-1235834183
sco
2009-02-28 18:16
2017.06.18
TCanvas и отрисовка #2 =)


2-1444135290
lewka
2015-10-06 15:41
2017.06.18
Формат ячейки в Excel


2-1443954338
Валя
2015-10-04 13:25
2017.06.18
рисование линий


1-1351429903
artyoms
2012-10-28 17:11
2017.06.18
Помогите переделать маленький код с паскаля на делфи