Q&A

  • [소스첨부]canvas does not allow drawing 오류
다음 코드는 Form에다가 Icon을 배치하여 보여주고 Icon에 상태를 주기적으로 변경해주는 코드입니다.
IconResize라는 procedure가 Icon을 변경해서 refresh해주는 코드인데요..

가끔 canvas does not allow drawing 오류가 나면서 프로그램이 뻗어버립니다.
인터넷에 찾아보니 Resource문제인 듯 한데... 메모리에 할당하는 작업은 없는 듯 한데.. 생기네요..

화면에 SetBound하면 메모리에 정보가 쌓이나요? 그래픽 작업은 처음 해봐서.. 잘모르겠습니다..
아래 코드를 봐주시고 canvas does not allow drawing 오류가 날만한 코드가 있다면 지적 바랍니다.

감사합니다.





<!--CodeS-->
procedure TSessionViewFrm.IconResize;
var
  FGateway: TGatewayIcon;
  i: Integer;
  IconRowCount, IconColCount: Integer;
  NodeCount: Integer;
  ICON_WIDTH, ICON_HEIGHT: Integer;
begin

FDebug.Display.Lines.Add('IconResize....### ');
    NodeCount := 0;
    if ( rgIconMode.ItemIndex = 0 ) then
    begin
      ICON_WIDTH := ICON_SMALL_WIDTH;
      ICON_HEIGHT := ICON_SMALL_HEIGHT;
    end
    else begin
      ICON_WIDTH := ICON_BIG_WIDTH;
      ICON_HEIGHT := ICON_BIG_HEIGHT;
    end;

    // Icon size 62*38
    IconColCount := ( pnlCenter.Width div ICON_WIDTH );
    IconRowCount := FSessionDM.GetNodeTotalCount( FSessionId ) div IconColCount;

    // on-air 버튼.
    ImgOnAIR_On.Left := (pnlCenter.Width div 2) - (ImgOnAIR_On.Width div 2);
    ImgOnAIR_Off.Left := ImgOnAIR_On.Left;

    // Session status
    case ( FSessionDM.GetSession( FSessionId ).Status ) of
    BC_ACT_START :
      begin
        ImgOnAIR_On.Visible := True;
        ImgOnAIR_Off.Visible := False;
      end;
    BC_ACT_STOP :
      begin
        ImgOnAIR_On.Visible := False;
        ImgOnAIR_Off.Visible := True;
      end;
    end;

    try
    try
      Canvas.Lock;
      for i:=0 to FGatewayList.Count-1 do
      begin
        FGateway := FGatewayList.GetByIndex( i );
        with FGateway do
        begin
          if ( rgViewMode.ItemIndex = VM_ALLNODE ) then
          begin
            Visible := True;
            SetBounds(ICON_WIDTH*(NodeCount mod IconColCount), ICON_HEIGHT*(NodeCount div IconColCount), ICON_WIDTH, ICON_HEIGHT);
            Hint := Node.Equipment.EquipmentName+' ['+Node.Equipment.EquipmentIpAddress+']'+#13+ FSessionDM.GetNodeStatusString( Node.NodeStatus );
            Inc( NodeCount );
          end;

          FGateway.Repaint;

        end;  // with
      end;  // for

  //    if ( rgViewMode.ItemIndex <> VM_ALLNODE ) then
      pnlCenter.Repaint;
      pnlTop.Repaint;
    except
      on e:Exception do
        FDebug.Display.Lines.Add('TSessionViewFrm.IconResize.For_loop: '+e.Message);
    end;
    finally
      Canvas.Unlock;
    end;


  //  StatusBar1.Panels[0].Text := ' '+PLang.sNodeCount+' '+IntToStr( FGatewayList.Count );  // StatusBar
    StatusBar1.Panels[0].Text := ' '+PLang.sNodeCount+' '+IntToStr( NodeCount );  // StatusBar

end;
<!--CodeE-->
0  COMMENTS