-
sco (28.02.09 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)? как её избежать? -
имя(28.02.09 22:33) [1]Удалено модератором -
имя(01.03.09 02:20) [2]Удалено модератором -
sco (01.03.09 09:27) [3]мм удалённый пользователь, если вы хотели написать чтонибудь по делу... но гм... были удалены - faiwer@gmail.com =) не откажусь от помощи в разрешении этой проблемы.
-
> MyBox.OnPaint(self) else EnBox.OnPaint(self);
это зачем? -
sco (01.03.09 21:31) [5]без этого не прорисовывается =)
внесу ясность:
enBM,myBM: TBitMap;
MyBox,EnBox: TPaintBox; -
> sco (01.03.09 21:31) [5]
>
> без этого не прорисовывается =)
Так конечно можно делать, но все же несколько неправильно с точки зрения идеологии Windows вызывать обработчик OnPaint напрямую. Правильнее инициировать обновление области (InvalidateRect, Invalidate) и т.д. -
> type PImage = ^TBitMap;
> if boj then image:=@MyBM else image:=@EnBM;
Это все лишнее, достаточно:
var
image: TBitmap;
if boj then image:=MyBM else image:=EnBM; -
> в чём причина данной "внезапной смерти" PaintBox (ну и TImage)?
> как её избежать?
Причина вряд ли в приведенном коде.
Он что "отваливается" молча без ошибок и исключений?
Ты доп. потоки случайно не используешь?
Обмен по сети у тебя сделан с использованием каких компонентов? -
sco (02.03.09 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 (02.03.09 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 (02.03.09 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);
анализируй увиденное...
==========================
я проверил.. да, тоже самое, вот тока "анализировать увиденное" мне не удалось =) я думаю природа глюка та же самая =) -
имя(19.05.09 15:51) [12]Удалено модератором