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

Вниз

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 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.001 c
2-1443954338
Валя
2015-10-04 13:25
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-1443892079
QAZ
2015-10-03 20:07
2017.06.18
несуществующий файл каторый существует


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский