다음 코드는 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-->