📄 025.htm
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI专题--控件应用-->Delphi 3 图形VCL中Bug修改方案</TITLE>
<META NAME="keywords" CONTENT=" DELPHI专题--控件应用 Delphi 3 图形VCL中Bug修改方案">
<META NAME="description" CONTENT=" - DELPHI专题--控件应用 - Delphi 3 图形VCL中Bug修改方案">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<a href="index.html">返回</a>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">Delphi 3 图形VCL中Bug修改方案</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p><span style="font-size: 9pt"> 所有用Delphi 3的TJpegImage开发过Web
ISAPI程序的人都知道:刚开始程序运行是正确的,但是运行不出几次,程序就会出问题:Web
Server产生页面错误!
但是仔细检查自己的程序,发现还是没有问题,到底为什么? <br>
经仔细检查Delphi 3 VCL
的源程序,发现实际上错误发生在Delphi 3的图形处理文件Graphics中,Borland公司的开发人员锁住了BitmapCanvasList但是未解锁,使得程序在多线程的程序中会产生错误。
</span></p>
<p><span style="font-size: 9pt"> 具体如下:(下面的程序在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> </span></p>
<p><span style="font-size: 9pt"> ... </span></p>
<p><span style="font-size: 9pt"><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>
在以上的程序中红色为补充的程序,桔红色为发生错误的程序。 </span></p>
<p><span style="font-size: 9pt">
修改的方法为修改以上的程序,然后编译生成DCU文件,覆盖在Lib中的DCU文件,重新编译你所有用到图形的程序。
<br>
</span></p>
<hr color="#EE9B73" size="1" width="94%">
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -