Конференция "Media" » TCanvas и отрисовка #2 =) [D7, WinXP]
 
  • 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 =) не откажусь от помощи в разрешении этой проблемы.
  • DVM © (01.03.09 20:44) [4]

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

    это зачем?
  • sco (01.03.09 21:31) [5]
    без этого не прорисовывается =)
    внесу ясность:
    enBM,myBM: TBitMap;
    MyBox,EnBox: TPaintBox;
  • DVM © (02.03.09 00:44) [6]

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

    Так конечно можно делать, но все же несколько неправильно с точки зрения идеологии Windows вызывать обработчик OnPaint напрямую. Правильнее инициировать обновление области (InvalidateRect, Invalidate) и т.д.
  • DVM © (02.03.09 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 © (02.03.09 00:52) [8]

    > в чём причина данной "внезапной смерти" 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]
    Удалено модератором
 
Конференция "Media" » TCanvas и отрисовка #2 =) [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]