⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtgraph.html

📁 对于学习很有帮助
💻 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>&nbsp;&nbsp;&nbsp; 所有用Delphi 3的TJpegImage开发过Web ISAPI程序的人都知道:刚开始程序运行是正确的,但是运行不出几次,程序就会出问题:Web
Server产生页面错误! 但是仔细检查自己的程序,发现还是没有问题,到底为什么?
<br>&nbsp;&nbsp;&nbsp; 经仔细检查Delphi 3 VCL 的源程序,发现实际上错误发生在Delphi
3的图形处理文件Graphics中,Borland公司的开发人员锁住了BitmapCanvasList但是未解锁,使得程序在多线程的程序中会产生错误。

<p>&nbsp;&nbsp;&nbsp; 具体如下:(下面的程序在Delphi 3\Source\VCL\Graphics.pas中)
<br><b>procedure</b> FreeMemoryContexts;
<br><b>var</b>
<br>&nbsp;&nbsp;&nbsp; I: Integer;
<br><b>begin</b>
<br>&nbsp;&nbsp;&nbsp; <b>with</b> <font COLOR="#FF6600">BitmapCanvasList.LockList</font>
<b>do</b>
<br><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><font COLOR="#FF0000">try</font></b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>for</b>
I := Count-1 <b>downto</b> 0 <b>do</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>with</b>
TBitmapCanvas(Items[I]) <b>do</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if TryLock then
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b>try</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
FreeContext;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b>finally</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Unlock;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b>end</b>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><font COLOR="#FF0000">finally</font></b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font COLOR="#FF0000">BitmapCanvasList.UnLockList;</font>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><font COLOR="#FF0000">end</font></b>
<br>&nbsp;&nbsp;&nbsp; <b>end;</b>
<br><b>end;</b>

<p>&nbsp;&nbsp;&nbsp;&nbsp; ...

<p><b>procedure</b> DeselectBitmap(AHandle: HBITMAP);
<br><b>var</b>
<br>&nbsp;&nbsp;&nbsp; I: Integer;
<br><b>begin</b>
<br>&nbsp;&nbsp;&nbsp; <b>if</b> AHandle = 0 <b>then</b> Exit;
<br>&nbsp;&nbsp;&nbsp; <b>with</b> <font COLOR="#FF6600">BitmapCanvasList.LockList</font>
<b>do</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><font COLOR="#FF0000">try</font></b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>for</b> I := Count
- 1 <b>downto</b> 0 <b>do</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>with</b>
TBitmapCanvas(Items[I]) <b>do</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b>if</b> (FBitmap &lt;&gt; nil) <b>and</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(FBitmap.FImage.FHandle = AHandle) <b>then</b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
FreeContext;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><font COLOR="#FF0000">finally</font></b>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font COLOR="#FF0000">BitmapCanvasList.UnLockList;</font>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><font COLOR="#FF0000">end</font></b>
<br><b>end;</b>
<br>&nbsp;
<br>&nbsp;&nbsp;&nbsp; 在以上的程序中红色为补充的程序,桔红色为发生错误的程序。

<p>&nbsp;&nbsp;&nbsp; 修改的方法为修改以上的程序,然后编译生成DCU文件,覆盖在Lib中的DCU文件,重新编译你所有用到图形的程序。
<br>&nbsp;

<p>本页版主:傅贵,最后修改日期:98.2.20
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -