为什么win9x可以执行,NT却通不过?? 急!! 300分(300分)

C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
下列CGI程序语句(使用了gifimage控件)
var
bmp:tbitmap;
gif:tgifimage;
r:TResourceStream;
begin
r:=TResourceStream.Create(HInstance, 'SAMPLE', 'GIF');
gif:=tgifimage.create;
gif.LoadFromStream(r);
bmp:=tbitmap.Create;
try
bmp.Assign(gif);
为什么在win98上可以通过,在NT下却不行??? 返回错误信息:
"Bitmap image is not valid"

注: 这个用法我用过很长时间了,一直没有问题,今天突然不行了. :-[[[
 
是那句出错?

可能是NT与Win98的资源格式不同,在NT下重新编译一下程序吧。
 
最后一句出错,出错信息是"Bitmap image is not valid"

这个方法以前我在NT上一直使用,没有问题,但是今天下午突然不行了.
问题是gif的确读出来了(比如可以保存成*.gif),bmp也的确创建了(比如
可以在上面draw),但是bmp.assign(gif)就是不行!

我都要封了!
 
看看原代码:
procedure TBitmap.Assign(Source: TPersistent);
var
DIB: TDIBSection;
begin
if (Source = nil) or (Source is TBitmap) then
begin
EnterCriticalSection(BitmapImageLock);
try
if Source <> nil then
begin
TBitmap(Source).FImage.Reference;
FImage.Release;
FImage := TBitmap(Source).FImage;
FTransparent := TBitmap(Source).FTransparent;
FTransparentColor := TBitmap(Source).FTransparentColor;
FTransparentMode := TBitmap(Source).FTransparentMode;
end
else
begin
FillChar(DIB, Sizeof(DIB), 0);
NewImage(0, 0, DIB, False);
end;
finally
LeaveCriticalSection(BitmapImageLock);
end;
PaletteModified := Palette <> 0;
Changed(Self);
end
else inherited Assign(Source); //这里是不是你的程序出错的地方。
end;
 
TGifImage?什么东西?
直接CANVAS.COPYRECT成不成?
 
我认为代码不会有问题的,因为这个CGI程序我一直在使用,快半年了,
这几天为了增加点新功能,修改了一下,结果就不行了.
win9x下可以的.
 
你的Tbitmap也是gifimage控件吗?
 
GifImage,这么有名的控件你不知道? 生成gif图片的,做CGI经常用到.
不能用copyrect吧? 好像不支持gifimage.

其实我的程序就是想干这个:
生成一副统计图,这个图片上又一些固定的内容,比如坐标系,版权标志,
背景等,我不想每次生成图片都要画这些东西,所以做了一个现成的gif
图片,包括这些固定内容,然后保存到res里面,以后CGI生成图片是,直接
掉出来再上面画就可以了
 
你们怎么啦?
tbitmap就是TBitmap呀!
 
那你的程序有应该发生异常。

procedure TBitmap.Assign(Source: TPersistent);
begin
if (Source = nil) or (Source is TBitmap) then
begin
{...}
end
else inherited Assign(Source);// 这里将异常AssignError(Source: TPersistent);
end;
 
如果uses gifimage就不会异常,原理和bmp.assign(jpg)一样.

另外,这个程序我用了半年了一直没问题,即使现在,在win9x上业没问题的.
 
我想你的这个TBitmap肯定不是Delphi自己的Tbitmap.

你能不能将GifImage邮给我. shenqw@21cn.com

BTW:
NT下有没有将所有的东西都从新编译一次。
 
Sorry
》我想你的这个TBitmap肯定不是Delphi自己的Tbitmap.
这句话错误。
 
你到cakk.126.com可以下载到gifimage

我没有在NT下面重新编译,因为以前不用的.

>>我想你的这个TBitmap肯定不是Delphi自己的Tbitmap.
怎么可能???
 
我先睡了,明天键.
 
cAkk:
搞定了。在GIFImage.pas文件中的头部加上一句:

{$DEFINE VER120}



//**************************************************

原因是GIFImage.pas不认识Delphi5,他默认编译器是Delphi3.
从这里看出:
// Unknown compiler version - assume D3 compatible
{$IFNDEF VER9x}
{$IFNDEF VER10x}
{$DEFINE VER10x}
{$ENDIF}
{$ENDIF}

我改为{$DEFINE VER120},是告诉他我的编译器是与Delphi4兼容,Hehe.我现在运行
示例都正常了。

//***************************************************************

呵呵....还是那句话,如果正确,分全归我。(如果你认为我这么辛苦,再加分我也不反对)
{B-)))
 
我试一试吧! 555555~~~~~~~~~~~~

我今天早上把代码全改了,不要资源文件了,出图时候临时画上去的....
 
试过了,还是不行 :-[

我觉得不是代码的问题,因为我一直这么使用的,但是昨天下午突然就不灵了.
我感觉和NT的什么有关系,似乎NT有时候处理bitmap和9x不大一样,这里有一个
问题和我<font color=red>可能</font>是同一个原因:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=138075
 
首先声明:我已经在NT4+SP6+Delphi5+Pack1上测试通过。

这样吧,你先运行GifImage自己带的Demos/Resource/的示例,先不加{$DEFINE VER120}
运行,肯定出现Bitmap image is not valid,再在GifImage.Pas的顶部加入
{$DEFINE VER120},<font color=red>运行酒会出现动画,一个文件在不断移动。</font>
他的方法方法与你完全相似,你看看他的代码吧。我还用你的代码

var
bmp:tbitmap;
gif:tgifimage;
r:TResourceStream;
begin
r:=TResourceStream.Create(HInstance, 'SAMPLE', 'GIF');
gif:=tgifimage.create;
gif.LoadFromStream(r);
bmp:=tbitmap.Create;
try
bmp.Assign(gif);
finally
gif.free;
bmp.free;
end;
end;

也没出现异常。

BTW:
你有没有Rebuild All Projects???有没有将你的GifImage.Pas拷贝到你工程文件
目录下并加入你的工程文件???

<font color=red>还有,如果继续讨论,请另开一个0分的问题,题目一样,我Proxy现在老是timeout.</font>
 
突然不行了,仔细想想在突然之前都干了什么,或许有帮助?
 
顶部