📄 dtgraph.html
字号:
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<meta NAME="Author" CONTENT="FuGui">
<meta NAME="GENERATOR" CONTENT="Mozilla/4.04 [en] (Win95; I) [Netscape]">
<title>修改Delphi 3图形处理中的错误</title>
</head>
<body BACKGROUND="Tapete.gif" tppabs="http://www.nease.net/~borland/bgimage/Tapete.gif" NOSAVE>
<h1>
Delphi 3 图形VCL中Bug修改方案:</h1>
<p> 所有用Delphi 3的TJpegImage开发过Web ISAPI程序的人都知道:刚开始程序运行是正确的,但是运行不出几次,程序就会出问题:Web
Server产生页面错误! 但是仔细检查自己的程序,发现还是没有问题,到底为什么?
<br> 经仔细检查Delphi 3 VCL 的源程序,发现实际上错误发生在Delphi
3的图形处理文件Graphics中,Borland公司的开发人员锁住了BitmapCanvasList但是未解锁,使得程序在多线程的程序中会产生错误。
<p> 具体如下:(下面的程序在Delphi 3\Source\VCL\Graphics.pas中)
<br><b>procedure</b> FreeMemoryContexts;
<br><b>var</b>
<br> I: Integer;
<br><b>begin</b>
<br> <b>with</b> <font COLOR="#FF6600">BitmapCanvasList.LockList</font>
<b>do</b>
<br><b> begin</b>
<br> <b><font COLOR="#FF0000">try</font></b>
<br> <b>for</b>
I := Count-1 <b>downto</b> 0 <b>do</b>
<br> <b>with</b>
TBitmapCanvas(Items[I]) <b>do</b>
<br>
if TryLock then
<br>
<b>try</b>
<br>
FreeContext;
<br>
<b>finally</b>
<br>
Unlock;
<br>
<b>end</b>;
<br> <b><font COLOR="#FF0000">finally</font></b>
<br> <font COLOR="#FF0000">BitmapCanvasList.UnLockList;</font>
<br> <b><font COLOR="#FF0000">end</font></b>
<br> <b>end;</b>
<br><b>end;</b>
<p> ...
<p><b>procedure</b> DeselectBitmap(AHandle: HBITMAP);
<br><b>var</b>
<br> I: Integer;
<br><b>begin</b>
<br> <b>if</b> AHandle = 0 <b>then</b> Exit;
<br> <b>with</b> <font COLOR="#FF6600">BitmapCanvasList.LockList</font>
<b>do</b>
<br> <b><font COLOR="#FF0000">try</font></b>
<br> <b>for</b> I := Count
- 1 <b>downto</b> 0 <b>do</b>
<br> <b>with</b>
TBitmapCanvas(Items[I]) <b>do</b>
<br>
<b>if</b> (FBitmap <> nil) <b>and</b>
<br>
(FBitmap.FImage.FHandle = AHandle) <b>then</b>
<br>
FreeContext;
<br> <b><font COLOR="#FF0000">finally</font></b>
<br> <font COLOR="#FF0000">BitmapCanvasList.UnLockList;</font>
<br> <b><font COLOR="#FF0000">end</font></b>
<br><b>end;</b>
<br>
<br> 在以上的程序中红色为补充的程序,桔红色为发生错误的程序。
<p> 修改的方法为修改以上的程序,然后编译生成DCU文件,覆盖在Lib中的DCU文件,重新编译你所有用到图形的程序。
<br>
<p>本页版主:傅贵,最后修改日期:98.2.20
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -