求助:图像问题(100分)

  • 主题发起人 主题发起人 艾伦希亚
  • 开始时间 开始时间

艾伦希亚

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Image.Canves里作图时常出现错误
先是提示“参数错误”按下确定之后然后是“Canves does not allow drawing”,然后一直都是这句话,窗体内所有有用到Image的地方全部消失。
我在程序的绘图中用到了不少for,工作量可能会大了些
这东西还跟机子跟操作系统有关
我原来PII266 & Win98比较容易错,现在Duron750 & Win2k好些,这个函数多运行几次才出错。
向各位请教下是什么原因,该如何解决。
 
你的图像格式是JPEG的,换成Bmp的就没有这个问题,
因为Image.Canvas就是Image.Bitmap.Canvas,
如果你的图像格式是JPEG的那Bitmap就是空的,那Canvas也就是空的,所以就不能画,
如果Image.Bitmap为空的话,你去访问Image.Bitmap的任何属性
(比如:Image.Canvas就是Image.Bitmap.Canvas),Image就会建立一空Bitmap,
所以图像被清空。
 
我的图像是bmp格式的,使用的也是Image.Bitmap,但我更多使用的是Delphi自身的作图命令直接在Image.Canvas上作图,bmp与命令作图的比例大概是20:1,很多个for循环,点击命令按钮开始作图,在Win2k下刚开始正常,多点几次就出现“Canves does not allow drawing”错误。
 
我不知道怎么老是不能提问啊,提示我说没有进入本论坛,所以只好借个位置了
我用下面的代码动态生成圆,我想要生成的圆都在一条弧线上,怎么做啊
图形说明:http://pcwak.8u8.com/1.jpg
特急,希望老大能尽快帮忙

代码:
var
  Form1: TForm1;
  shape:Array of TShape;
  j:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
shape:Array of TShape;
i:integer;
begin
   j:=strtoint(edit1.text);
   setlength(shape,j);
   for i:=0 to j-1 do
    begin
     shape:=Tshape.Create(form1);
     with shape do
     begin
       parent:=form1;
       top:=150;
       left:=left+i*50;
       width:=8;
       height:=8;
       brush.Color:=clred;
       shape:=stcircle;
     end;
   end;
 
看看你的内存情况,是不是内存溢出,每次调用函数都回增加内存的开销,换程过程,或调用函数释放不用的资源。
 
resourcestring
SNoCanvasHandle = 'Canvas does not allow drawing';
procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
NeededState: TCanvasState;
begin
NeededState := ReqState - State;
if NeededState <> [] then
begin
if csHandleValid in NeededState then
begin
CreateHandle;
if FHandle = 0 then
raise EInvalidOperation.CreateRes(@SNoCanvasHandle);
end;
if csFontValid in NeededState then CreateFont;
if csPenValid in NeededState then CreatePen;
if csBrushValid in NeededState then CreateBrush;
State := State + NeededState;
end;
end;
报错的地方在上面的函数里边,这是TCanvas在做每一个绘图动作需要调用的函数
请求满足State的状态,如果csHandleValid in NeededState 也就是请求新的句柄那么
就会尝试创建新的句柄,如果创建失败,也就是没能创建新的句柄那么就会引发异常
procedure TCanvas.CreateHandle;
begin
end;
但是TCanvas的这个函数没做任何事情,这也就意味着
在你做每个绘图操作的时候,Image.Picture.Bitmap = nil or
Image.Picture.Bitmap.Canvas.Handle = 0 (就是Image.Picture.Bitmap.Empty = True)
因为不知道你的具体的环境,建议你仔细检查所进行的绘图操作,是否有哪一个操作会使
Image.Picture.Bitmap失效
 
多人接受答案了。
 
后退
顶部