狂甩400整,吐血大送分!(100分)

  • 主题发起人 主题发起人 wwwwww
  • 开始时间 开始时间
W

wwwwww

Unregistered / Unconfirmed
GUEST, unregistred user!
机会难得,集中多说几个问题,多送大家点分!
1、(送您价值150分)
有关动态显示图像问题,讨论过类似问题,我也查阅过,
但似乎没有说明白。
以下是我的一段程序,请大家斧正!
bmp:=Tbitmap.create;
bmp.pixelformat:=pf4bit;
bmp.width:=2000;
bmp.height:=2000;
//尚不知具体BMP有多宽,随便定义一个相当大的数,但似乎
//超过3000*3000就会出错,而且会出现汉字提示“参数错误”
//汉字提示不是我的程序给出,也绝不是西文的DELPHI给出,
//那一定是中文PWIN98给出的,奇怪!难道调用了底层API?
//请接着看......
memo_to_bmp (Myform.mymemo, bmp);
//该函数将MEMO内容用Bmp.canvas.textout写到bmp中
//不要说该函数是废话,说白了,它就是打印预览函数
bmp.width:=fact_width;
//得到实际的宽度
bmp.height:=fact_height;//得到实际的高度
myform.image1.picture.bitmap:=bmp;
bmp.free;
以上这段程序在运行一、两次尚无大碍,但7、8次后系统会
因为资源不足而错误,甚至崩溃!如何解救???
2、(价值50分)
哪里能买到有关WIN API的详细资料,书店里卖的书我都翻过,
什么《WINDOWS编程指南》一类,都不对胃口,我要的是全部API
函数、消息、内部常量、变量的详细说明和大量实例。
说明要采用PASCAL格式,不要C格式,C语法让人头疼。
哪有卖的?什么书名?
3、(价值70分)
重复前几天的问题:如何暂停或终止打印机的打印,用程序实现,
而不是通过点击右下角的打印机图标。
用PRINTER.ENDDOC;
PRINTER.ABORTDOC;
用API的ABORT(PRINTER.HANDLE)似乎都不行。
4、(价值130分)
有关自动适应屏幕分辩率的问题,已是老生长谈。但我还要重申,
据我搜集的资料,都是东一榔头,西一棒子,没有说清楚,也没有完
全解决。
再次归纳如下:在800*600大字体下开发的程序,如何适应
640*480大小字体、800*600小字体、1024*768大小字体、安全模式
等的变化。
包括:①窗口大小自动调整 ②控件位置自动调整
③控件尺寸自动调整 ④控件字体自动调整

 
1.你现在写的这段程序没有memory leak,程序的其他部分有没有?
你可以搞一相关的工具去测试你的程序中有没有没有释放的内存
深度历险上有很多
2.没有//或者不知道 :-)
3.Printer.abort 100%可以
if printer.printing then
begin
Printer.abort;
showmessage('Print Aborted....');
end;
4.你自己程序执行之前强行设定...呵呵
还是听别人说吧
 
<a href="http://www.nidlink.com/~astoyanov/memp0933.zip">这里</a>有检查内存使用情况的东东...
 
1、我的内存没有问题,这是程序中的一部分,去掉该段就没有问题了,
说明还是资源释放问题
2、我是北京的,如有,可没告诉我在云南书店有售
3、明天上班去试试,似乎已试过了
4、强行设定别人的分辩率,恐怕不妥吧?这好像在强家于人?还是想想其它办法吧
 
2.PASCAL 类型的API说明恐怕是少而又少,其实C和PASCAL语法差不了多少的 :-)
MSDN里面最全了,可惜又是E文,不过清华早期的几本书(黄皮,忘记名字了)
对于API说的还较详细,大概是两年前看见有卖。不过都是MSDN里的翻译,还是VC
里的
 
1.你的程序有几个问题:
(1):
>bmp.width:=fact_width;
//得到实际的宽度
>bmp.height:=fact_height;//得到实际的高度
如果fact_width!=bmp.width or bmp.height!=fact_height,则
这两句话执行之后,bmp将被清除(用背景色填充整个图象).我每
天都在使用TImage/TBitmap,相信不会搞错的.不知你这样做如何
能够实现你想要的功能?
(2):
>myform.image1.picture.bitmap:=bmp;
既然目的是为了画到TImage中,为何不直接画到myform.image1.picture.bitmap
而要舍近求远的先画到另一个TBitmap中?
(3):
>myform.image1.picture.bitmap:=bmp;
如果有资源泄漏,将是这句产生的.因为myform.image1.picture.bitmap
并没有被释放,而成为无主对象.
(4):替换办法1:
>myform.image1.picture.bitmap:=bmp;
改成
myform.image1.picture.bitmap.Assign(bmp);
当然这不是好方法,前面关于(1)的问题也要改.
(5):替换办法2:
myform.image1.picture.bitmap.width := fact_width;
myform.image1.picture.bitmap.height := fact_height;
memo_to_bmp (Myform.mymemo, myform.image1.picture.bitmap);
(6):这个问题应该放到"图形图象"版,不应该在这里.
(7):150分,你打算怎么给? :) //haha
 
> bmp:=Tbitmap.create;
> bmp.pixelformat:=pf4bit;
> bmp.width:=2000;
> bmp.height:=2000;
>//尚不知具体BMP有多宽,随便定义一个相当大的数,但似乎
>//超过3000*3000就会出错,而且会出现汉字提示“参数错误”
>//汉字提示不是我的程序给出,也绝不是西文的DELPHI给出,
>//那一定是中文PWIN98给出的,奇怪!难道调用了底层API?
的确调用了底层api, 当你设置TBitmap.width和height时, delphi先释放原先的bitmap(如
果有的话), 然后调用CreateBitmap建立一幅内存印象(这就是api), 当然还需要设置很多其他
东西, 这个你看看CreateBitmap的帮助就知道了.

>//请接着看......
> memo_to_bmp (Myform.mymemo, bmp);
>//该函数将MEMO内容用Bmp.canvas.textout写到bmp中
>//不要说该函数是废话,说白了,它就是打印预览函数
> bmp.width:=fact_width;
//得到实际的宽度
> bmp.height:=fact_height;//得到实际的高度
此处delphi将释放原先申请的bitmap(即你已经textout了内容的那个), 然后按fact_width
和fact_height重新申请一幅新的bitmap(如果fact_width或fact_height有一个与原先
bmp不同的话).
因此你的mem_to_bmp在做无用功.
> myform.image1.picture.bitmap:=bmp;
> bmp.free;
> 以上这段程序在运行一、两次尚无大碍,但7、8次后系统会
>因为资源不足而错误,甚至崩溃!如何解救???
你在用delphi3吧? d3的Bitmap在释放上存在bug. 尽管myform...bitmap := bmp实际
上就是内部调用了myform....bitmap.assign(bmp). 最好还是不要这样用. 建议使用
myform....bitmap.canvas.copyrect
>2、(价值50分)
> 哪里能买到有关WIN API的详细资料,书店里卖的书我都翻过,
>什么《WINDOWS编程指南》一类,都不对胃口,我要的是全部API
>函数、消息、内部常量、变量的详细说明和大量实例。
当然有详细资料, 60元, 你不会没听说过Visual studio 6吧? 6张盗版光盘....
> 说明要采用PASCAL格式,不要C格式,C语法让人头疼。
>哪有卖的?什么书名?
这个要求不太可能, 除非你自己写?
>3、(价值70分)
> 重复前几天的问题:如何暂停或终止打印机的打印,用程序实现,
>而不是通过点击右下角的打印机图标。
> 用PRINTER.ENDDOC;
PRINTER.ABORTDOC;
> 用API的ABORT(PRINTER.HANDLE)似乎都不行。
如果只是希望程序终止打印那很容易, 最简单的是往lpt1写一堆垃圾, 肯定停止打印(因为你的系
统死锁了) 开个玩笑. 不过我觉得可以从这上面考虑考虑. 往并口写个打印终止符.
windows好象并不禁止多次打开一个设备并写入. (从mirc中得到的启发与证实, mirc有个小小
的bug, 它生成的log文件名就是chat用户的nick, 而且它并不检查nick是否合法, 因此如果
你和某个nick叫做com1, com2, lpt1,...的人聊天并打开了log, 结果只有一个: 死机,
而且死得很惨, 系统资源耗尽而亡, 有人因此而重装过win95, 题外话了).
瞎想瞎想.
 
2、WIN32 API 指南(名字记不清楚了,是MS出的5本,很厚,可以当手册,兰色)
我只买到4本:-( MSDN 不错
4、如果要求高只好自己算了。
实际上可以用 Scale 解决,可以,最麻烦的是字体,那个 TRESIZE 我没用过
不知道是否解决了此问题。实际上,我以前写过 BC 程序,好象也在改变字体
时出问题
 
1、我程序的核心是动态生存一幅bitmap,只不过该图像上
没有画像,而是预览的文字而已。三种canvas,我到底
应用哪个:
①myform.image1.canvas
困惑:书上讲,该法实际上是与②是一致
②myform.image1.picture.bitmap.canvas
困惑:在的picture属性赋值之前,picture属性是否
=nil,不分配内存能直接用吗?
③所以有了我的程序想法,先动态申请Tbitmap,再用:
bmp:=Tbitmap.create;
myform.image1.picture.bitmap:=bmp;
TO LHZ:后改变BMP的高*宽属性似乎不会导致图像丢失吧。
正如问题所言,我还照此法用了7、8次,能显示,只是导致
资源不足。
我怀疑是不是后来的高*宽<原来的200*2000,才导致
内存漏洞,资源释放不全。
2、打印机的AbortDoc查HELP
Abort terminates the printing of a print job,
dropping all unprinted data.
procedure Abort;
Description
Use Abort to terminate the print job before it completes;
otherwise, use the EndDoc method.
When Abort is called, the device is then
set for the next
print job.
也就是说:在打印中才有作用,我的意思是在打印机呲啦呲啦、
咣叽、咣叽时能否终止打印作业,而不是如下
begin
doc;
for i:=1 to countdo
begin
...
abort;
...
end;
enddoc;
3、由于该论坛速度“快”得令人佩服,心烦之中,分数不知怎么成为
了区区100分。没关系,总400大分,绝不食言!
 
喀嚓的时候结束?好象要和系统打教导了
你能给一道题400:-)
 
首先感谢各位!
1、关于BMP的问题,最为紧迫!快快救命!谁能系统地给我讲讲,并解决问
题,增加奖金33%=200分。
2、API的资料,如果实在没有也就算了,看HELP吧。
3、终止打印的问题,只想用一个BUTTON即可STOP打印,以方面我周围那些
又懒又笨不知用“清空打印作用”来终止的家伙。还是那句老话,人家
OFFICE97都没做到的事,我等之辈也就认命吧!
4、该问题其实对大家都有用,我也有过研究,用SCALEBY一类的都适过,
总体感觉窗口大小可随机应变,但控件位置、尺寸变得不好,大小字体
适应就更难了。曾DOWN过一个ResolutionFix控件,也不好使。
但人家640*480小字体,强行置成800*600大字体,千万不要往这条道
上想。编软件是向用户服务,适应用户,而不是让用户适应自己,各位
大虾米,您说对吗?
 
1.
(1):关于TImage/TPicture/TBitmap
TImage是显示图象的控件,它可以显示任何DELPHI支持的图象格式.
TPicture是图象的一个抽象.它有几个关键属性:Bitmap,Icon,Metafile
和Graphics;Bitmap对应BMP位图,如果TPicture装载的是BMP,则这个
对象将包含装载的BMP;Icon和Metafile与此类似;而Graphics是一个
抽象的图象文件对象,如果TPicture装载的是Bitmap,Icon或Metafile,
则Graphics是指向装载对象的指针;如果TPicture装载的是其它DELPHI
支持的格式,则Graphcis是实在的对象,该对象的类型根据装载的文件的
类型而定,如装载的是JPEG,则Graphics是TJPEGImage之类的类型.
(2):TImage.Canvas/Picture.Canvas/Picture.Bitmap.Canvas
这3个Canvas其实是同一个Canvas.DELPHI的TImage的实现只支持在BMP
上画图,所以这三个Canvas是同一个.TImage.Canvas/Picture.Canvas
都是指向Picture.Bitmap.Canvas的指针.如果Picture.Bitmap是空的,
则往任何一个Canvas画的信息都将丢失.
(3):TImage.Width/Picture.Width/Picture.Bitmap.Width
TImage.Width是显示时使用的宽度,与文件的宽度无关,与TImage.Canvas
的宽度无关.Picture.Bitmap.Width是BMP的宽度,是实际图象的宽度.
Picture.Width是Picture中实际加载对象的宽度.如果加载的是BMP,
则Picture.Width与Picture.Bitmap.Width是同一个.
Height与此类似.
(4):
>后改变BMP的高*宽属性似乎不会导致图像丢失吧。
如果真的没有丢失,肯定是有问题.因为我就用这种办法清除BMP的内容.
猜想:是不是由于你的图象太大,在改变Width/Height时系统处理不过来,
所以COPY了一份,再将它的小的一部分COPY回来,但望了FREE它自己COPY
的一份?
(5):
我认为我给出的两种方案中有可行的,你何不试试?又不复杂.
 
我想听听有关大小字体是怎么解决的。
 
TImage.Canvas/Picture.Canvas/Picture.Bitmap.Canvas这3个Canvas其实是
同一个Canvas?
好象不完全是这样。
self.Image2.Canvas.CopyRect(self.Image1.ClientRect,
self.Image1.Picture.Bitmap.Canvas,Self.Image1.ClientRect);

self.Image2.Picture.Bitmap.Canvas.CopyRect(self.Image1.ClientRect,
self.Image1.Picture.Bitmap.Canvas,Self.Image1.ClientRect);
的效果并不相同!
 
RedCat:
你没有完全明白我的意思.
>TImage.Canvas/Picture.Canvas/Picture.Bitmap.Canvas
>这3个Canvas其实是同一个Canvas
这句话是有条件的.至于要甚麽条件,你可以去测试一下,
可以发现很多有趣的现象.
 
4.我也遇到了字体的问题,将FROM的SCALED设为FALSE,OK!
 
有个控件TResizer可以让你得控件在窗体上自动随窗体变化。
在好多网站上都有得。
 
4、ftp://194.226.30.40/perfectsizevcl%20form%20sizing%20control%20v2.2%20%28with%20source%29/
 
TResize,不能修改字体,在大字体,小字体的变化中,也会出问题,TRESIZE只是
你不能实质CLIENT,TOP,BOTTPM。LEFT,RIGHT,他根据FORM的大小自动调整
各个控件的大小,效果不那么好,我用了以后,就不在用了,还是自己在FORM的
RESIZE时自己计算,设立这样的FORM,以后的FORM都从这个FORM继承,挺方便的
 
后退
顶部