VCL对象不是线程安全的,而且它们的属性和方法必须要从VCL主线程中进行访问或被执行,但有两种VCL对象是例外的情况,它们是线程安全的。一种是任何图形对象,另一种是TThreadList。
这意味着不必非得在主VCL线程中才能设置一个画布的画笔颜色,或画刷类型,可以在另一个线程的环境中完成一点。对于图形对象,使用Lock和UnLock,而对于ThreadList,则使用LockList和UnLockList,这些方法的行为类似于临界区,在调用它们的时候会阻止其他线程的执行。因为Lock会中断所有线程的执行,所以如果使用不正确的话,应用程序性能会有很大下降。比如:
Form1.Canvas.Lock;
For i := 0 to 10000 do
begin
Form1.Canvas.TextOut(20,20,str);
end;
Form1.Canvas.UnLock;上面这个代码中,Lock后再循环,则循环结构过于拥挤,锁定时间过长。所以应该将Lock与UnLock放在循环里面。
下面的例子,通过多线程对窗体画布进行画线。点“开始”菜单创建N个线程同时往窗体画线,点“结束”同时终止N个线程。
{主窗体代码}
unit Main;
interface
uses
Windows, Message ......
关于界面美化方面,一直是一个脑壳疼的问题!以前一直偷懒,使用的三方控件!但是在使用了一段时间之后,都或多或少的有些问题!不是我说三方控件如
何如何的不好!只是三方控件多是庞大的一个肢体,要兼顾的用户群体很多,所以同时它要考虑的问题也增加了很多,然而一个程序出现Bug是在所难免的,所以
三方控件那庞大的肢体在出了问题之后,修改就相当麻烦,首先得捋顺控件的实现过程,才能找到问题所在进而修改,所以虽然很方便,可是再有些时候也是很痛苦
的!我用过的三方皮肤控件还算比较多了,这里重点说两个很流行的,一个VCLSkin,一个BusinessSkinForm,相信多数美化爱好者,对这
两套控件都不陌生,无论使用与自己写皮肤控件时候参考,都是不可多得的好代码!为什么拿这两套控件来做说明,主要原因是这两套控件的实现原理不相同,而皮
肤美化的方法,我所知道的也就这两种方法(当然可能有其他的,不过我不知道,呵呵),先说VCLSkin,此套控件,采用的是Hook,进而子类化,然后
截获各种与界面绘制相关的消息进行控制从而达到界面美化的目的,这个实现起来,就是不必做新控件,直接Hook到窗口过程,处理掉就行,但是由于是
Hook, ......
javascript 判断文件是否存在
<title>常用下载</title>
<script type="text/javascript" >
//判断服务器上的文件(网络文件是否存在)
function getURL()
{
var objDiv=document.getElementById ("show");
var objs=objDiv.childNodes;
for(var i=0;i<objs.length;i++)
{
if(objs.tagName=="A")
{
  ......
本文主要介绍如何动态的增加、删除输入框,并获取输入框中的值~~
<html>
<head>
<title>JavaScript_动态增加/删除输入框_阿方索</title>
<script type="text/javascript">
<!--
var idNumber = 1,id="tableAFS";
function addTextBox() {
idNumber++;
//这里我们创建一个label控件
label0 = document.createElement("label");
label0.setAttribute("id","label"+idNumber);
//创建输入框
var textField = document.createElement("input");
textField.setAttribute("type","text");
textField.setAttribute("name","Title");
textField.setAttribute("id","Title"+idNumber);
label0.appendChild(textField);
//创建按钮
var textField2 = document.createElement("input");
textField2.setAttribute("type","button");
textField2.setAttribute("name","button");
textField2.setAttribute("value","删除该行");
textField2.onclick=function(){removeTextBox(this)}
label0.appendChild(textField2);
document.getElementById(id).appendChild(label0);
}
function r ......
很多情况下,我们要在发送到后台处理前,判断一下所上传的文件是不是符合大小要求,其实脚本可以很方便的帮助我们实现,代码如下
<html>
<head>
<title>JavaScript_获取文件大小_阿方索</title>
</head>
<body>
<input type="file" name="file1" id="file1" size="40" onchange="changeSrc(this)"/>
<img src="about:blank" mce_src="about:blank" id="fileChecker" alt="test" width="100" style="display:none" mce_style="display:none"
/>
<span id="showSize"></span>
</body>
</html>
<!--////以下代码放到页面最后面-->
<mce:script type="text/javascript"><!--
var oFileChecker = document.getElementById("fileChecker");
function changeSrc(filePicker)
{
oFileChecker.src = filePicker.value;//读图片
}
//判断是否完全读完
oFileChecker.onreadystatechange = function ()
{
if (oFileChecker.readyState == "complete")
{
checkSize();
}
}
function checkSize()
{
var limit = 2 * 1024 * 1024;
var show = d ......
一、什么是事件冒泡
在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事 件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对 象层次的最顶层,即document对象(有些浏览器是window)。
打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,直至到中央法院,最终使你的案件得以处理。
二、事件冒泡有什么作用
(1)事件冒泡允许多个操作被集中处理(把事件处理器添加到一个父级元素上,避免把事件处理器添加到多个子级元素上),它还可以让你在对象层的不同级别捕获事件。
【集中处理例子】
<div onclick=”eventHandle(event)” id=”outSide” style=”width:100px; height:100px; background:#000; padding:50px”>
<div id=”inSide” style=”wi ......