星期二, 十月 23, 2007
Sqlite3 3.5.1 如何读取汉字?
当进入管理界面通过.read sql.txt运行的命令或insert into插入的汉字,sqlite3认为是"合格"的
UTF-8字符串。
所以需要,使用UltraEdit之类的软件,首先把sql.text转换为标准的utf-8的编码,然后再用.read读取
在powershell读取sqlite.net的数据库代码:
1.首先需要建立一个数据库,名字叫szsk.db3,只要在sqlite3.exe 后面跟随数据库名就可以了。
sqlite3.exe szsk.db3 ,然后敲入.quit推出,就发现szsk.db3已经被建立了。
sqlite3.exe可以从www.sqlite.org下载最新的window 版本。
把System.Data.SQLite.dll文件放在当前目录下.
SQLITE.NET 2.0 下载地址: http://sourceforge.net/projects/sqlite-dotnet2
cls
$global:sdb="$pwd\szsk.db3"
$global:url="$pwd\System.Data.SQLite.dll"
$createTable=@"
CREATE TABLE IF NOT EXISTS DoubleBall (
id integer primary key AUTOINCREMENT,
_Year varchar(4),
_Month varchar(2),
_Day varchar(2),
_Term varchar(3),
_N1 varchar(2),
_N2 varchar(2),
_N3 varchar(2),
_N4 varchar(2),
_N5 varchar(2),
_N6 varchar(2),
_Blue varhcar(2)
)
"@
$dropit= "drop table doubleball"
$command="";
trap [exception]
{
write-host "Exception"
}
function initdb
{
[void][system.reflection.Assembly]::LoadFile($url)
if ((test-path $sdb) -eq $FALSE)
{
$global:conn=new-object System.Data.SQLite.SQLiteConnection("data source="+$sdb+";Version=3;New=TRUE;")
}else
{
$global:conn=new-object System.Data.SQLite.SQLiteConnection("data source="+$sdb+";Version=3;New=false;")
}
}
function getDBConnection
{
$conn=new-object System.Data.SQLite.SQLiteConnection("data source="+$sdb+";Version=3;New=false;")
}
initdb
$command=new-object System.Data.SQLite.SQLiteCommand
if($args.count -eq 0)
{
return $conn
}else
{
$sql="select * from stocklist where stockCode='" + $args[0]+".sz'"
$command.CommandText =$sql
$command.Connection=$conn
$conn.open()
$dataReader =$command.ExecuteReader()
$script:cnName=$args[0]
while($dataReader.Read() )
{
$script:cnName $dataReader.GetString(1)
}
$dataReader.close()
$conn.close()
return $cnName
}
星期五, 十月 19, 2007
Vbscript 实现 cls命令
Set WshShell = CreateObject("wscript.shell")
WshShell.SendKeys "%( )+E+P{ENTER}CLS{ENTER}{TAB}",True
Wscript.Sleep 5000
但是这个代码有一个问题就是键盘缓冲区是在当前VBS执行完成后,才被发送到当前cmd
窗口,因此是一种后script方式,不是希望在执行其他vbscript之前清空的方式。
经过努力,发现没有其他办法实现。
星期三, 十月 17, 2007
如何在vbscript/cscript 中调用.dll
必须是通过regsvr32 可以注册的dll才能在vbscript中被调用,应为createobject必须是 ActiveObject dll,如果是标准的函数库,则无法使用。必须包装成Activexobject
2..NET Dll
必须通过 regasm注册后,就可以在vbscript中使用了?
regasm System.Data.SQLite.DLL /tlb:System.Data.SQLite.tlb /codebas
星期三, 十月 10, 2007
Powershell .ps1 如何得到返回的对象?
其他命令的输出需要同管道|out-null,来回避。
比如下面:
[system.reflection.Assembly]::LoadFrom($url) |out-null
$conn=new-object System.Data.SQLite.SQLiteConnection("data source="+$sdb+";Version=3;New=TRUE;")
如果想返回一个connection object
就在ps1文件的最后一行写明
$conn就可以了。
星期一, 十月 08, 2007
PowerShell如何处理HTMLDocument Object
HTMLDocument对象。
但是速度上同同样的VBS代码比感觉差太多。所以始终想使用"HTMLFILE"来处理HTML Document.
最终通过get-member发现了 在PowerShell里使用的IHTMLDocument2_write方法可以用来初始化HTMLDocument对象内容。
如下代码,可以在POWERSHELL里使用了。
$htmlDoc= New-Object -com "HTMLFILE"
$page = "<html><body>this is a test</body></html>"
$htmlDoc.IHTMLDocument2_write($page)
$htmlDoc.close
如何在PowerShell调用Dll文件。
[system.reflection.Assembly]::LoadFrom("dll所在绝对路径");
但是传统的非.NET生成的Dll库如何使用呢?
比较复杂,基本可以按照下列语句来使用:
$dir="C:\\curl-7.16.4\\FTCTRLPRO3.dll"
$ctor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([string])
$attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dir
这只能简单载入Dll,如果想使用Dll的具体的函数,可以参看如下文章:
http://www.leeholmes.com/blog/ManagingINIFilesWithPowerShell.aspx
##############################
##
## Invoke-WindowsApi.ps1
##
## From PowerShell Cookbook (O'Reilly)
## by Lee Holmes (http://www.leeholmes.com/guide)
##
## Invoke a native Windows API
##
## ie:
##
## ## Prepare the parameter
## CreateHardLink function
## $parameterTypes = [string],
## $parameters = [string]
##
## ## Call the CreateHardLink
## $result = Invoke-WindowsApi
## $parameterTypes
##
##############################
param(
[string] $dllName,
[Type] $returnType,
[string] $methodName,
[ Type[]] $parameterTypes,
[Object[]] $parameters
)
## Begin to build the dynamic
$domain = [AppDomain]::CurrentDomain
$name = New-Object Reflection.AssemblyName 'PInvokeAssembly'
$assembly = $domain.DefineDynamicAssembly( $name, 'Run')
$type = $module.DefineType('PInvokeType', "Public,BeforeFieldInit")
## Go through all of the
## we clone the user's inputs
## the P/Invoke call.
$inputParameters = @()
$refParameters = @()
for($counter = 1; $counter -le $parameterTypes.Length; $counter++)
{
## If an item is a PSReference
## wants an [out] parameter.
if($parameterTypes[$counter - 1] -eq [Ref])
{
## Remember which parameters
$refParameters += $counter
## On the cloned array, we
## .Net reference type that
## and the value with the
$parameterTypes[ $counter - 1] =
$parameters[$counter - 1 ].Value.GetType().MakeByRefType
$inputParameters += $parameters[$counter - 1].Value
}
else
{
## Otherwise, just add their
## input array.
$inputParameters += $parameters[$counter - 1]
}
}
## Define the actual P/Invoke
## attribute for any parameters
## parameters.
$method = $type.DefineMethod( $methodName, 'Public,HideBySig,Static
$returnType, $parameterTypes )
foreach($refParameter in $refParameters)
{
}
## Apply the P/Invoke construct
$ctor = [Runtime.InteropServices.DllImportAttribute ].GetConstructor([string])
$attr = New-Object Reflection.Emit.CustomAttribute
$method.SetCustomAttribute($attr)
## Create the temporary type,
$realType = $type.CreateType()
$inputParameters)
## Finally, go through all of
## values of the PSReference
foreach($refParameter in $refParameters)
{
$parameters[$refParameter - 1].Value = $inputParameters[$refParameter - 1]
}
星期五, 十月 05, 2007
Akashic records
阿 克夏的概念起源于印度。在婆罗门教的文献中,“阿克夏”被描述为“宇宙的精神—物质”,它包括了所有的存在与发展。与之类似的“梵”(婆罗门教与印度教的 主神之一,为创造之神,亦指终生之本)在实质上通常被视作非个人的、无法识别的最高宇宙原理,万物来源于它,万物又回归于它。它非实体、非物质、非先天而 又永恒存续,无始无终。按照古老的印度学说,梵“能够穿透一切,赋予至高无上的天神或是小到极点的矿物原子以生机。”古印度秘密学说最后明确指出,“阿克 夏就是一切创造物的起源于回归之地”,阿克夏“比一切万物都更古老”,简直就是“最后的终点”。阿克夏就是世间万物的根源(荒耶宗莲竭尽全力所追求的,想 必就是这个东西了);而阿克夏记录则使得任何时刻——包括过去、现在和未来——所发生的任何事情都不致归于遗忘之中,它记录了一切的信息。
当 然在客观上,没有确切的证据能证明这样一种所谓的“宇宙记忆”确实存在,或者证明这个世界上从一开始曾经发生的一切都被记录了下来。但若仅仅因此就认为阿 克夏记录是不存在的,同样不能令人信服。即使是现代,这种现象也能得到共鸣和认同,只是换了一个完全不同的名字:形态发生场。
剑桥大学的 生化学家鲁伯特·谢尔德雷克在其著作《创造性的宇宙》中写道,形态发生场能够摆脱时间和空间发挥作用。具体地说,如果一个生物种类的成员获得了一种新的行 为,那么它自己的形态发生场会由此改变。只要这种新的行为在足够长的时间里得到了坚持,物种成员之间就会形成一种相互影响,进而影响整个物种。实际的例子 是:一只老鼠一旦学会了在一明一暗的信号下告到黄油,其他老鼠就会越来越快地掌握这个方法。直到最后,所有的老鼠——即便不是由最初的那只生出来的,也不 曾与它有过接触——都学会了这种行为。
按照谢尔德雷克的观点,自然是具有“记忆”的,我们通常视作自然法则的东西只不过是“习惯”。自然存在与“习惯”也就是“行为模式”之中。根据这一构想,自然界中的每一类事物都必须按照它那一类的“集体记忆”内容来行事,从有生命的事物到无生命的物质都是如此。
调试.NET错误工具
Dll 函数查看工具
才寻找到了一些Dll函数查看器。
都挺不错的。
DLL Export Viewer
http://www.nirsoft.net/utils/dll_export_viewer.html
国产的。
http://www.onlinedown.net/soft/17471.htm
星期四, 十月 04, 2007
在Powershell里访问Mysql 5.0 数据库
下载地址:http://www.mysql.org/downloads/connector/net/5.0.html
然后编写如下代码。
[void][system.reflection.Assembly]::LoadFrom("D:\mysql\MySQL Connector Net 5.0.8.1\Binaries\.NET 2.0\MySQL.Data.dll")
$myconnection = New-Object MySql.Data.MySqlClient.MySqlConnection
$myconnection.ConnectionString = "server=localhost;user id=root;password=root;database=mrpII;pooling=false"
$myconnection.Open()
$mycommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$mycommand.Connection = $myconnection
$mycommand.CommandText = "SELECT * from MRP_BOM"
$adapter = new-object MySql.Data.MySqlClient.MySqlDataAdapter
$adapter.SelectCommand = $mycommand
$ds = new-object System.Data.DataSet
$adapter.Fill($ds)
$myconnection.close()
$ds.Tables[0] |Format-Table #非常Cool的输出效果,如下图
真是cool毙了。
如何传递一个参数到cmdlet?
一下只写明增强版本的cmdlet程序,注册的snapin没有变化。
HelloWorld.cs
在PS下通过 get-helloworld,一个接一个输入所有名称,回车表示输入结束。
或者通过get-helloworld ("William wang","Peter Zhang","李华") 来直接得到结果.
using System;
using System.Management.Automation;
[Cmdlet(VerbsCommon.Get, "HelloWorld", SupportsShouldProcess = true)]
public class HelloWorld : PSCmdlet
{
// An array is used to support the following scenario:
[Parameter(
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true,
Mandatory = true,
HelpMessage = "恭贺的名字清单")]
[ValidateNotNullOrEmpty]
public string[] FullName
{
get { return fullName; }
set {fullName = value; }
}
private string[] fullName;
// Called when cmdlet is invoked.
protected override void BeginProcessing()
{
// You could open a database connection here for example.
base.BeginProcessing();
}
// Called when we have pipeline input.
protected override void ProcessRecord()
{
// this.Name could be null in BeginProcessing (no parameters passed)
// but could be filled when ProcessRecord gets called (parameters from pipeline)
try
{
if(this.fullName==null)
{
WriteObject("fullName is null");
}else
{
foreach (string item in this.fullName)
{
WriteObject("Hello World!"+item);
}
}
}catch(Exception)
{
WriteObject("excetpin");
}
}
// Called after every record has been processed.
protected override void EndProcessing()
{
base.EndProcessing();
}
// Called when the user hits CTRL+C
protected override void StopProcessing()
{
base.StopProcessing();
}
}
编写Powershell的HelloWorld的例子,开始编写cmdlet第一步
编译一个以C#语言编写的cmdlet需要的开发环境,可以参看:
http://msdn2.microsoft.com/en-us/library/ms714644.aspx
首先要确认安装了.NET 2.0 Framework的SDK包含csc.exe c#的命令行编译软件。
如果安装成功了.net 2.0 framework SDK,可以在一下目录发现:
C:\WINDOWS\Microsoft.NET\Framework 发现所有安装的.NET Framework的目录。
.Net framework SDK 3.0是在.NET 2.0 SDK的基础上增加了一些新的特性完成的。
所以.NET 3.0自身不带有csc.exe编译软件。
C:\WINDOWS\Microsoft.NET\Framework的典型目录如下。
<dir> v1.0.3705
<dir> v1.1.4322
<dir> v2.0.50727 csc.exe所在目录
<dir> v3.0
其次需要Powershell SDK的安装,如果安装成功可以发现如下目录。
C:\Program Files\Reference Assemblies\Microsoft 发现powershell目录
包含一些.dll 库.
C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0
2006-09-28 15:49 139,264 Microsoft.PowerShell.Commands.Management.dll
2006-09-28 15:49 294,912 Microsoft.PowerShell.Commands.Utility.dll
2006-09-28 15:49 200,704 Microsoft.PowerShell.ConsoleHost.dll
2006-09-28 15:49 65,536 Microsoft.PowerShell.Security.dll
2006-09-28 15:49 1,564,672 System.Management.Automation.dll
软后编写 用来编译C#的Powershell批处理文件,需要包含命令行编译C#代码的一些参考库
cscc.bat包含内容:
set PS_HOME="C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0"
csc.exe /reference:%PS_HOME%\Microsoft.PowerShell.Commands.Management.dll,%PS_HOME%\Microsoft.PowerShell.Commands.Utility.dll,%PS_HOME%\Microsoft.PowerShell.ConsoleHost.dll,%PS_HOME%\Microsoft.PowerShell.Security.dll,%PS_HOME%\System.Management.Automation.dll /t:library %1 %2 %3
%1 %2 %3 代表 C#的代码文件.cs文件。
编写HelloWorld的cmdlet步骤。
1.首先编写cmdlet或pscmdlet的子类:
HelloWorld.cs:
using System;
using System.Management.Automation;
[Cmdlet(VerbsCommon.Get, "HelloWorld", SupportsShouldProcess = true)]
public class HelloWorld : PSCmdlet
{
// Called when cmdlet is invoked.
protected override void BeginProcessing()
{
// You could open a database connection here for example.
base.BeginProcessing();
}
// Called when we have pipeline input.
protected override void ProcessRecord()
{
// this.Name could be null in BeginProcessing (no parameters passed)
// but could be filled when ProcessRecord gets called (parameters from pipeline)
try
{
WriteObject("Hello World!");
}catch(Exception)
{
}
}
// Called after every record has been processed.
protected override void EndProcessing()
{
base.EndProcessing();
}
// Called when the user hits CTRL+C
protected override void StopProcessing()
{
base.StopProcessing();
}
}
2.再编写一个Snapin的注册类。
HelloWorldSnapin.cs
using System;
using System.ComponentModel;
using System.Management.Automation;
[RunInstaller(true)]
public class HelloWorldSnapIn : PSSnapIn
{
public override string Name
{
get { return "HelloWorldSnapIn"; }
}
public override string Vendor
{
get { return "William Wang"; }
}
public override string Description
{
get { return "This Windows PowerShell snap-in contains the Get-HelloWorld cmdlet."; }
}
}
3.编译:
set PS_HOME="C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0"
csc.exe /reference:%PS_HOME%\Microsoft.PowerShell.Commands.Management.dll,%PS_HOME%\Microsoft.PowerShell.Commands.Utility.dll,%PS_HOME%\Microsoft.PowerShell.ConsoleHost.dll,%PS_HOME%\Microsoft.PowerShell.Security.dll,%PS_HOME%\System.Management.Automation.dll /t:library HelloWorld*.cs
得到 HelloWorld.dll文件,然后安装
InstallUtil.exe HelloWorld.dll得到如下成功message:
正在运行事务处理安装。
正在开始安装的“安装”阶段。
查看日志文件的内容以获得 C:\curl-7.16.4\helloworld.dll 程序集的进度。
该文件位于 C:\curl-7.16.4\helloworld.InstallLog。
正在安装程序集“C:\curl-7.16.4\helloworld.dll”。
受影响的参数是:
logtoconsole =
assemblypath = C:\curl-7.16.4\helloworld.dll
logfile = C:\curl-7.16.4\helloworld.InstallLog
“安装”阶段已成功完成,正在开始“提交”阶段。
查看日志文件的内容以获得 C:\curl-7.16.4\helloworld.dll 程序集的进度。
该文件位于 C:\curl-7.16.4\helloworld.InstallLog。
正在提交程序集“C:\curl-7.16.4\helloworld.dll”。
受影响的参数是:
logtoconsole =
assemblypath = C:\curl-7.16.4\helloworld.dll
logfile = C:\curl-7.16.4\helloworld.InstallLog
“提交”阶段已成功完成。
4.然后在powershell里注册这个cmdlet
add-pssnapin helloworldsnapin
如果成功,没有任何提示。
5.运行get-helloworld
得到 hello world!的提示信息。
表明最简单的Hello World cmdlet成功了。
星期四, 九月 27, 2007
如何在Powershell中解析HTMLDocument
使用标准的XMLDocument会出现语法检查错误。
必须使用mshtml.dll包含的标准HTMLDocumentClass.
标准的vbscript:代码
set htmlDoc= createobject("HTMLFILE")
page = "<html><body>this is a test</body></html>"
htmlDoc.write(page)
htmlDoc.close
对应的POWSERShell代码为:
$htmlDoc= New-Object -com "HTMLFILE"
$page = "<html><body>this is a test</body></html>"
$htmlDoc.write($page) #出错代码,出现type mismatch错误.
$htmlDoc.close
具体的原因看网络上的解释,似乎是DOM包装的时候,有些接口没有实现造成的问题。
所以目前找到的方法是使用IE控件,代码如下:
$IE= New-Object -com "InternetExplorer.Application"
$IE.navigate('about:blank')##必须的代码行
$IE.Resizable=$True
$IE.StatusBar=$True
$IE.AddressBar=$False
$IE.MenuBar=$False
$IE.Toolbar=$False
while ($IE.busy)
{
sleep -milliseconds 50
}
$page = "<html><body>this is a test</body></html>"
$IE.documetn.body.innerHTML=$page#该代码在IE7以下的IE中不能工作必须换成下面的代码
$IE.document.write( $page) #或者替换为 $oIE.document.IHTMLDocument2_write($html)
出现的错误为:
Property 'innerHTML:' cannot be found on this object; make sure it exists
and is settable.
如何得到Windows所有安装的COM控件?
1.gci HKLM:\Software\Classes -ea 0| ? {$_.PSChildName -match '^\w+\.\w+$' -and (gp "$($_.PSPath)\CLSID" -ea 0)} | ft PSChildName
2.get-wmiobject Win32_COMClass
星期三, 九月 26, 2007
PowerShell 特殊语法符号。@
| @() | 空数组 |
| $hash = @{ } | 创建空哈希表 |
| @(Get-Alias;Get-Process) | 执行其中的两条命令,然后在数组中返回结果 |
字符串常量:
@”
这是“here string”,其中可包含任意字符(包括回车和引号)。将计算表达式 $(2+2)
”@
@’
带单引号的“here string”不计算表达式。 ‘@
星期五, 九月 21, 2007
PowerShell 错误处理及查看DLL方法
可以在任何function或代码文件中申明如下语句:
trap [Exception]
{
write-host ("trapped " + $_.Exception.GetType().Name); continue;
}
星期四, 九月 20, 2007
Regular Express 表达删除一个空行(blank line)
所谓的空行就是一行只包含一些空格,制表符或其他不可见的符号的文本行。
在Vbscript的RegExp 对象,支持RegExpOption.Multiline的属性,可以轻易删除。
但其他各种语言,perl,vbscript等等,没有简单的方法。
regularE="^$"可以匹配一个只包含回车换行的空行
但通过十六进制来看很多文本往往发现很多包含000D 00 0D 00 0A之类的空行。
非常难以处理。
标准的删除一个包含很多回车换行的文本的规则表达为
regularE="[\r\n]+\s*[\r\n]+"
这里是一个详细的解释:
http://www.ultraedit.com/index.php?name=Forums&file=viewtopic&t=2777
但这种方法会删除一个所有的回车换行。
所以必须单独编写方法来出来。
星期三, 九月 19, 2007
Microsoft PowerShell 1,0 定制提示符号的简单技巧
星期一, 九月 17, 2007
如何通过VBA来让Excel显示HTML代码?
如果需要更加灵活的方式,目前只能通过把 HTML代码复制到系统粘贴板,然后再让EXCEL
粘帖来实现。
首先在Excel里 ,按下Alt+F11打开宏编写。
然后在菜单工具-->引用。。里找到 Microsoft Forms 2.0 object library ,启用之,
然后书写一下代码,则可以实现了Excel的HTML渲染。
Dim MyDataObj As New DataObject
MyDataObj.SetText "
"One Two
MyDataObj.PutInClipboard '复制到clipboard
然后再调用
ActiveSheet.Paste
则可以显示HTML效果了。
另外一种通过 HTMLProject 来完成,把HTML页面直接传送过去
ActiveWorkbook.HTMLProject.HTMLProjectItems(stockCode).Text = resl
ActiveWorkbook.HTMLProject.RefreshProject
星期五, 九月 14, 2007
几种语言如何设置跳过盗链的检查
URL url=new URL("url地址");
然后
Connection conn = url.OpenConnection();
加入下面这行:
conn.addRequestProperty("REFERER", "http://www.mydomain.com");
然后后面再用conn.readLine等就可以避免盗链检查了。
命令行curl访问一个网站避免盗链检查的方式:
curl -x 191.168.1.1:1688 -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -D cookie0001.txt --proxytunnel -o test.html -e "http://quote.地址" %1
Vbscript设置跳过盗链检查。
一个注意事项:在HTML中,设置不起作用,这可能是防止钓鱼网站的原因。
代码如下:
Set httpObj = CreateObject("Microsoft.XmlHttp")
httpObj.open "GET", url, FALSE
'跳过盗链检查
httpObj.setRequestHeader "REFERER", "http://quote.eastmoney.com"
httpObj.send ""
星期五, 八月 24, 2007
关于Javascript的this关键词的解释.
function checkme()
{
alert(this.value);
}
此时this代表 是当前聚焦的可视HTML元素(focus element).比如一个下拉框,输入框等等。
最严密的说法如下:
http://www.quirksmode.org/js/this.html
In JavaScript
this always refers to the “owner” of the function we're executing, or rather, to the object that a function is a method of. When we define our faithful function doSomething() in a page, its owner is the page, or rather, the window object (or global object) of JavaScript. An onclick property, though, is owned by the HTML element it belongs to.
星期四, 八月 09, 2007
如何编写自己的dojo widget(物件)?
包括什么使用以下方法来申明:
dojo.setModulePrefix('wang', '../wang');
dojo.registerModulePath('wang', '../wang');
dojo.widget.manager.registerWidgetPackage('wang.widget');
但会出现很多的问题和错误。
这篇文章的方法是最简单的
http://www.alexatnet.com/node/14
简单来说步骤如下:
1.建立一个目录
假设目前js目录结构如下:
/js/dojo-0.4.3-ajax
/js /wang //你自己定做的dojo widget 库
/js/wang/widget/ Memo.html, Memo.css
那么你需要建立的声明文件Menu.js保存在/js目录下.
2.建立新的widget声明文件Menu.js
Menu.js内容如下:
dojo.widget.defineWidget(
// widget name and class
"wang.widget.Memo",
// superclass
dojo.widget.HtmlWidget,
// properties and methods
{
// parameters
title: "Note",
// settings
isContainer: true,
templatePath: dojo.uri.dojoUri("../wang/widget/Memo.html"),
//注意:这个目录是相对于dojo.js所在目录的相对目录.
templateCssPath: dojo.uri.dojoUri("../wang/widget/Memo.css"),
// callbacks
onClick: function(evt){
this.destroy();
}
}
);
3.在HTML里应用声明
<script src="js/Memo.js"></script>
4.通过dojoType来使用新的widget
<div dojoType="Memo" title="你好世界">
你好吗?
</div>
效果如下:
星期三, 八月 08, 2007
Javascript的匿名函数和JSON。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
JSON建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
- object //用两个大花括号把对象数组包含起来。
- {}
{ members } - members //成员
- pair
pair , members - pair //标准的名字:值
- string : value
- array //数组用两个中括号包含起来的
- []
[ elements ] - elements
- value
value , elements - value
- string
number
object
array
true
false
null
<script>
var arr
var str="[['line 1','line 2'],['line 1','line 2']]";
eval("arr="+str);
alert(arr[0][0]);
</script>
星期二, 七月 31, 2007
如何避免JSP文件产生空格或空白行(whitespace)
所以,避免JSP文件产生空白行的办法,就是需要把所有的<%%>连起来书写,在jsp文件中减少手动的回车换行,就可以避免JSP文件产生空白行了。
比如.
<%@ page contentType="text/xml;" %><%@page import="com..dao.Mrp_Workload_Capacity_Calculate_DAO"%><%@ page import="com.sun.rowset.CachedRowSetImpl"%><%@ page import="com.util.DBUtil"%><%...%>
星期五, 七月 27, 2007
DHMTL Grid Paginal 语法.
<div id="gridbox" width="100%" height="250px" style="background-color:white;overflow:hidden"></div>//显示grid数据地方
<div id="recinfoArea" style="width:100%;"></div>//用来显示导航条的地方
<script>
mygrid = new dhtmlXGridObject('gridbox');
...
//should be called before init()
mygrid.enablePagingWT(true,10,3,"recinfoArea");
...
mygrid.init();
mygrid.setXMLAutoLoading("dynscroll.php");//如果想每次点击下一页的时候从服务器读取数据,必须要加入这一行,通过url参数rowsLoaded=N 在服务器段来获取下一页的数据
mygrid.loadXML("dynscroll.xml");//this sample uses static loading
</script>
星期三, 七月 25, 2007
Javascript匿名function(或无名unnamed)的申明
var greet=function(){....}//可以有参数,或无参数。
调用的方法:greet();如果有参数,需要再调用的时候加入参数.
对象常量 Object Literals:
var car = {myCar:(function(){return "WIlliam";}), getCar: "Honda", special: "Sales"}
调用:
document.write(car.myCar()); // WIlliam
document.write(car.getCar); // Honda
document.write(car.special); // Sales
对象常量同匿名function 组合,可以写出非常复杂的表达。
var car = {myCar:(function(){return "WIlliam";}), getCar: "Honda", special: "Sales"}
document.write(car.myCar); // WIlliam
document.write(car.getCar); // Honda
document.write(car.special); // Toyota
或另一个常用语法var Person=function(){}
Person.prototype.name="William"
Person.prototype.age=17
who=new Person();
document.write(who.name);
Javascript的匿名function 的语法主要设计到Javascript如何对面向对象的支持。
var Person=function(){}
Person.prototype = {
initialize: function(name) {
this.name = name;
},
greet: (function() {
return("Hello from " + this.name+"");
})
};
who=new Person();
who.initialize("William");
alert(who.greet());
一个比较好的地址:http://blogs.sun.com/sundararajan/entry/java_javascript_and_jython
星期五, 七月 20, 2007
dojo TabContainer Javascript控制
<div id="CalendarPart" dojoType="ContentPane" href="1.jsp" refreshOnShow="true" executeScripts="true" contentCache="false" label="<b>Calendar</b>"></div>
<div id="vocationPart" dojoType="ContentPane" href="2.jsp" refreshOnShow="true" executeScripts="true" contentCache="false" label="<b>Holiday</b>"></div>
<div id="WorkCenterPart" dojoType="ContentPane" href="3.jsp" refreshOnShow="true" executeScripts="true" contentCache="false" label="<b>Work Center</b>"></div>
</div>
每个contentPane内容的改变,典型使用以下Script
<script>
var obj =dojo.widget.byId("WorkCenterPart");
//alert(obj);
obj.setUrl("");//新的动态内容url
</script>
星期二, 七月 17, 2007
WINDOWS XP Dr Watson Log file.
c:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson\drwtsn32.log
星期日, 七月 15, 2007
飞狐 运行VBS公式出现错误处理。
"脚本引擎请求位置对象信息:"Wscript"",脚本引擎请求位置对象信息:"JSProxy"
解决方法:
进入windows目录下,再进入system32目录下,运行:
regsvr32 jscript.dll
regsvr32 vbscript.dll
再启动飞狐软件或股道软件就可以了。
星期五, 七月 13, 2007
XML CDATA,强大的万能标签。
CDATA
Everything inside a CDATA section is ignored by the parser.
If your text contains a lot of "<" or "&" characters - as program code often does - the XML element can be defined as a CDATA section.
A CDATA section starts with "<![CDATA[" and ends with "]]>":
|
In the example above, everything inside the CDATA section is ignored by the parser.
Notes on CDATA sections:
A CDATA section cannot contain the string "]]>", therefore, nested CDATA sections are not allowed.
Also make sure there are no spaces or line breaks inside the "]]>" string.
星期四, 七月 05, 2007
动态创建复杂form之二
formname.document.createElement("form");
document.body.appendChild(formname); //关键语句,否则submit()方法没有实际动作
//add other node
txtObj = document.createElement("input");
//1
txtObj.setAttribute("type","hidden");
txtObj.setAttribute("name","username");
txtObj.setAttribute("value","William");
formname.appendChild(txtObj);
//2
txtObj2 = document.createElement("input");
txtObj2.setAttribute("type","hidden");
txtObj2.setAttribute("name","actionTarget");
txtObj2.setAttribute("value","VacationSetting");
formname.appendChild(txtObj2);
formname.action = target;
formname.method="post";
formname.submit();
方法二:
var f = document.createElement(’form’);
document.body.appendChild(f); //关键语句,否则submit()方法没有实际动作
f.style.display = ‘none’; this.parentNode.appendChild(f);
var h = document.createElement(’input’);
h.type = ‘hidden’; h.name = ‘act’; h.value = ‘admin’;
f.appendChild(h);
var h2 = document.createElement(’input’);
h2.type = ‘hidden’; h2.name = ’setadmin’; h2.value = ‘delcat’;
f.appendChild(h2);
f.method = ‘POST’;
f.action = ‘index.php’;
f.submit();
return false
方法三:
function doIt()
{
formname = document.createElement("form");
document.body.appendChild(formname);
//add other node
txtObj = document.createElement("");
formname.appendChild(txtObj);
//2
txtObj2 = document.createElement("");
formname.appendChild(txtObj2);
//3
txtObj3 = document.createElement("");
formname.appendChild(txtObj3);
formname.action = target;
formname.method="POST";
formname.submit();
}
星期三, 七月 04, 2007
用Javascript和DOM完全动态建立一个Form
Form Element Interfa
1.建立一个提交的Form// Create a form
var f = document.createElement("form");
// Add it to the document body
document.body.appendChild(f);
// Add action and method attributes
f.action = "/cgi-bin/some.cgi";
f.method = "POST"
// Call the form's submit method
f.submit();
星期二, 六月 26, 2007
绝妙招数,JSP页面不能刷新
的方式来刷新jsp页面,浏览器只是从cache里调用,并没有从服务器段刷新新的页面
如何能通过Javascript来手动刷新jsp页面呢。
秘密在于要加入以下一句
window.returnValue=0;
星期一, 六月 11, 2007
星期一, 五月 14, 2007
Motorola E6 修改开机画面。
[THEME_CONFIG_TABLE]
PowerOffScreen = /usr/data_resource/animation/Moto2.gif
PowerOnScreen = /usr/data_resource/animation/Moto1.gif
WallPaper = /usr/data_resource/picture/Home_Wallpaper6.gif
这个图片是240x320 256色的大小GIF89 gif图片。
你可以把图片放到你的SD卡的某个目录上,然后修改这个文件里的目录
Motorola E6 解除手机四个按钮自定义冻结
发现:
[static]
nextEvent = 0
shortcut_1 = fc4eee73-2b5b-4ebd-b6dc-32dd62fbd490
shortcut_1_freeze = 1
shortcut_1_icon_name = Home_CMCC_Service_B.gif
shortcut_2 = 95ffa462-7e2f-49a9-9e6d-f8f63b2f3c40
shortcut_2_freeze = 1
这样就可以在设置里的主屏定义里修改快捷方式了。
Motorola E6的一些说明
在网络上找到这个公司网址及文档的说明地址:http://www.mvista.com/product_datasheets.php
不过没有关于里面系统管理的说明,图形是基于MontaVista Graphics,主要基于两个X window Management:ICEWM和 matchBox,开发UI主要是基于GTK+,
奇怪的是其Motolora的目录里包含:QTDownload的目录,
奇怪。
现在像解决的是,如何定义新的系统分类或修改。
通过USBLAN telnet方式或samba方式 \\169.254.142.2\system 的方式来访问Motorola E6 手机,也不知道修改那个文件。
有人说是修改:\\169.254.142.2\system\ezx_user\download\appwrite\am\UserMenuTree
但因为队X window的配置文件不熟悉,看起来如看天书啊
[2a58c0d6-05c6-45aa-8938-63059d41a4e9]
Items = cb839c8f-72c3-42ac-bf17-b01080cb5705;e8c83dac-db4e-4fb5-98a6-61de1998b277;b18dbbd2-503a-4442-9308-5575ee38c210;51f2cb88-3040-4f00-b66c-c4bb974e4d18;67dc1191-2928-4938-abce-1a73cb5ce490;3bb7f1b5-12bb-4b79-985b-96436e094256;48973844-3955-4323-b5a0-f69435a1dba0
[3bb7f1b5-12bb-4b79-985b-96436e094256]
Items = 5b608840-eb39-4d34-bfdb-8806436d140d;95ffa462-7e2f-49a9-9e6d-f8f63b2f3c40;9faafa35-0688-4529-8310-04f215cb2d0c;ba63e2ca-089c-4a95-8e13-81522eed47a0;fc4eee73-2b5b-4ebd-b6dc-32dd62fbd490;c4e5410b-c0fe-4889-8619-6bdce79f0e47;
[48973844-3955-4323-b5a0-f69435a1dba0]
Items = acd47a08-a135-72ed-9378-5054f598b326;
[51f2cb88-3040-4f00-b66c-c4bb974e4d18]
Items = 5af701f6-33e3-4fe6-b15e-b7ef7c986c74;0f0c629a-9524-4fc9-8429-6df7dedf394d;067a149d-00b4-4ba3-b839-11ab2dbd88c0;bacc9585-ae26-4cf9-8e72-fb520709b4b0;23723ec3-ab86-408a-86c0-f70ac6f5c153;c30158ae-e2a7-4d1c-9f6c-3b079c2f4c4e;6aff7618-c940-48d9-ad3b-3106d9a884c2;0b6c1459-2fbe-4b2e-95c9-a4f93762fa11
[67dc1191-2928-4938-abce-1a73cb5ce490]
Items = 18b62bb5-bd39-4397-9076-fe912a4b6dd0;8a2b9b37-83e7-a8d9-82cf-0bcbe2070002;8a2b9b37-83e7-a8d9-82cf-0bcbe2070001;b0fc7131-b9c1-d70c-82bb-c8893c8a78c2;b726141b-9a5c-1755-b2dd-47da885ae301;25a634e7-6fc5-d058-a2b9-3f6c70a9b430;278e9dbc-0e9b-bc69-8e44-039c62556527;;8a2b9b37-83e7-a8d9-82cf-0bcbe2070003
[b18dbbd2-503a-4442-9308-5575ee38c210]
Items = c1e0df66-11ef-4b33-bddb-0cbd13827312;5e558577-7be1-405a-a888-e65d20a2908a;4d690409-f29f-48f4-8967-48fc151b2272;6cd5ea93-d3e2-4cbd-ac46-9dad6ff62b46;5382eeae-3a6f-40ef-ac3a-6f85c4a7f87f;9667de53-e43e-47bd-96ff-89c06dc3cdbd
[cb839c8f-72c3-42ac-bf17-b01080cb5705]
Items = ce59717d-fb23-4b7c-8800-25ce613f4042;c30158ae-e2a7-4d1c-9f6c-3b079c2f4c4e;1e6b9963-24cc-41f8-bbee-a23ae761ff81;fc4eee73-2b5b-4ebd-b6dc-32dd62fbd490;5b608840-eb39-4d34-bfdb-8806436d140d;95ffa462-7e2f-49a9-9e6d-f8f63b2f3c40;ba63e2ca-089c-4a95-8e13-81522eed47a0;9faafa35-0688-4529-8310-04f215cb2d0c;c4e5410b-c0fe-4889-8619-6bdce79f0e47;9a4cdb74-34ec-415e-ba36-b8c2a35d0071;bb621a8f-c681-477f-9d15-9c4b53b37a3e;0b6c1459-2fbe-4b2e-95c9-a4f93762fa11;6aff7618-c940-48d9-ad3b-3106d9a884c2;c1e0df66-11ef-4b33-bddb-0cbd13827312;4d690409-f29f-48f4-8967-48fc151b2272;5e558577-7be1-405a-a888-e65d20a2908a;5382eeae-3a6f-40ef-ac3a-6f85c4a7f87f;5af701f6-33e3-4fe6-b15e-b7ef7c986c74;0f0c629a-9524-4fc9-8429-6df7dedf394d;9667de53-e43e-47bd-96ff-89c06dc3cdbd;067a149d-00b4-4ba3-b839-11ab2dbd88c0;bacc9585-ae26-4cf9-8e72-fb520709b4b0;23723ec3-ab86-408a-86c0-f70ac6f5c153;1758dab7-a240-4c66-bd01-0a78064c6f87;45e9c626-06be-40d0-a166-fd5b85471aa8;6cd5ea93-d3e2-4cbd-ac46-9dad6ff62b46;18b62bb5-bd39-4397-9076-fe912a4b6dd0;68aa0e99-9a59-302c-96bb-f4f08e7dd90e;474b7d54-abad-93a8-ad5a-11f9f2cc7ba0;f4fae70f-11d4-7006-8cf3-0f1bf2d6eee8;68898845-2628-5f45-9647-d819ece272a3;2c227485-1738-e3b5-94f6-4f88728cdf91;7b1c83d0-7a0c-df33-8766-21712ba02301;8daa06ee-0a83-8934-aed2-73b25af6bfe9;0869ee05-8a86-9bbc-b610-d7ee3abda81a;093e4d22-dad7-8c72-b4ed-d9e88fef9147;1178dc20-66d9-1597-a9f7-f81f8a83b1f4;13a750f6-fe43-d83a-b3b7-8a7fecebfa77;1a112744-bc68-4f43-886a-a5ed58083a6c;256120fb-a864-c6f4-a6a5-dc023e8ba313;25a634e7-6fc5-d058-a2b9-3f6c70a9b430;25af762a-dce9-9232-8a26-0864839f9b85;26022542-9c88-1ce5-8622-de6dc3823df6;2753bbbf-7530-b3c1-b01a-64b49bcdac8c;278e9dbc-0e9b-bc69-8e44-039c62556527;2864e07e-c7d3-15ef-bb78-ecf0576386a6;2cc4d208-40f8-1fba-8e3a-455d140a6be1;38c53039-21c0-d3f4-9934-00c3bfdca9f9;396b61f1-a203-dfa7-92d6-7dfea7067b9e;4c6d6a9b-920d-0ea6-9a58-d79d93afb1a6;5834b42c-7617-bc1b-bc98-c50a33af774c;62cdf98a-c79b-28e7-a958-d3f7d0caf1ab;6657920d-2c3f-c612-9285-0d0a3ccbb2f9;66fc461d-7a46-9591-997b-42d332fdf941;671dbcb5-16b5-9db3-9e78-45e9f42370bf;695c9824-e3ec-7e1b-9904-d4ef4955047a;6d1a0429-586d-ed7b-9fac-6d91b67116c5;758c8293-ad35-8a3e-8471-ceac85e362fd;78661e58-99f4-a0e7-ba8c-c9aededab5de;7b104f18-a878-dd59-b326-0389e37f086b;8ad75187-213f-dd21-8536-4e93aca03cb5;8ba4ab20-1dcb-e2b5-9f1a-e926b650f8d9;8db372ff-1b90-9239-87d6-1b9bbf4886de;96eb974f-4b54-3958-9b1f-1310189dc93b;9b9b7691-fce2-6d5e-b911-692e2236004f;9ec1bc67-7800-f7b1-aee4-30b357001f6e;a97aaa60-bf83-88a1-a7b1-33e59f73edc1;b0fc7131-b9c1-d70c-82bb-c8893c8a78c2;b5961de7-a547-3171-95a5-63a6487f5b97;b726141b-9a5c-1755-b2dd-47da885ae301;b997558a-f41b-8ce8-8e55-3b2faeed6466;bb5025f0-0079-c342-a36e-e2781257d195;c9d5d40c-bd73-482f-9fdc-15f060a20151;cefa0ab0-0dff-e12a-b497-70a399c0a512;d088d0f1-f39d-aeca-8777-acc35a80f0bc;dc9bc4ac-4482-036a-a651-d0f018889db5;de499d5a-7ffd-f091-8493-e408fc57814b;e8ac9283-7e6f-f665-81ef-78ed0d652eda;f36a0a48-5954-7063-9d55-e4aefe32211c;fb2dc9c7-2669-cbd4-a49b-a9aae2080555;acd47a08-a135-72ed-9378-5054f598b326;8a2b9b37-83e7-a8d9-82cf-0bcbe2070001;8a2b9b37-83e7-a8d9-82cf-0bcbe2070002;8a2b9b37-83e7-a8d9-82cf-0bcbe2070003
[e8c83dac-db4e-4fb5-98a6-61de1998b277]
Items = ce59717d-fb23-4b7c-8800-25ce613f4042;1e6b9963-24cc-41f8-bbee-a23ae761ff81;9a4cdb74-34ec-415e-ba36-b8c2a35d0071;1758dab7-a240-4c66-bd01-0a78064c6f87;bb621a8f-c681-477f-9d15-9c4b53b37a3e;45e9c626-06be-40d0-a166-fd5b85471aa8
星期三, 二月 07, 2007
Tips VBA office 热键的编写方法
VBA里面经常需要把一个热键(VBA里称为shortcutKey)赋予一个宏或一个菜单。
热键包括组合键盘比如ctrl或alt加上另外一个键来使用。
Ctrl在VBA里表示用^
Alt在VBA里表示用&
http://www.romanpress.com/Articles/Menus_R/Menus.htm
比如把一个热键赋予一个菜单项目.
Dim cbMainMenuBar As CommandBar
Dim iHelpMenu As Integer
Dim cbcCutomMenu As CommandBarControl
Set cbMainMenuBar = _
Application.CommandBars("Worksheet Menu Bar")
Set cbcCutomMenu = _
cbMainMenuBar.Controls.Add(Type:=msoControlPopup)
cbcCutomMenu.Caption = "&Q功能菜单" 'alt+q
星期六, 二月 03, 2007
Tips EXCEL VBA里如何增加菜单及菜单项目风格线
Sub AddMenus()
Dim cMenu1 As CommandBarControl
Dim cbMainMenuBar As CommandBar
Dim iHelpMenu As Integer
Dim cbcCutomMenu As CommandBarControl
Set cbMainMenuBar = _
Application.CommandBars("Worksheet Menu Bar")
Set cbcCutomMenu = _
cbMainMenuBar.Controls.Add(Type:=msoControlPopup)
cbcCutomMenu.Caption = "&Q功能菜单"
With cbcCutomMenu.Controls.Add(Type:=msoControlButton)
.Caption = "简约方式"
.OnAction = "forcaseGS3"
End With
With cbcCutomMenu.Controls.Add(Type:=msoControlButton)
.Caption = "简约方式MOD"
.OnAction = "forcaseGSMod3"
End With
With cbcCutomMenu.Controls.Add(Type:=msoControlButton)
.Caption = "打印机设置"
.OnAction = "printerSetup"
.BeginGroup = True '在这个菜单前产生一个分割线
End With
End Sub
Sub DeleteMenu()
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("&Q功能菜单").Delete
On Error GoTo 0
End Sub
Private Sub Workbook_Activate()
AddMenus
End Sub
Private Sub Workbook_Deactivate()
DeleteMenu
End Sub
星期二, 一月 23, 2007
星期五, 一月 19, 2007
Tips,VBA里如何扩展一个文本框TextBox的的长度,超过255限制
因为VBA里TextBox对象通过程序操作,只能复制最多256个字符。但通过UI确可以操作基本上
没限制的字符操作,真是邪门。
最终发现程序实现,无限制文本框操作技巧
Dim ctl1 As Shape
datasheetName = "Sheet1"
MyStr ="有1千个字符"
On Error Resume Next'如果不存在,删除会出错
Sheets("Sheet1").Shapes("recommend").Delete
Set ctl1 = Sheets("Sheet1").Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 200, 450, 500)
ctl1.TextFrame.Characters.Text = left(MyStr,200)
ctl1.Name = "recommend"
'注意代码,perfect
For a = 1 To WorksheetFunction.Ceiling(Len(MyStr) / 200, 1)
ctl1.TextFrame.Characters((a * 200) + 1).Insert String:=Mid(MyStr, (a * 200) + 1, 200)
Next a
For Each ctl In Sheets(datasheetName).Shapes
Debug.Print TypeName(ctl) & " " & Left(ctl.Name, 8)
Next
星期四, 十二月 21, 2006
Tips,VBA里如何扩展一个注释的的长度,超过255限制
但NoteText只能允许255个字符,这是经常不够的。
要想使用更多的字符VBA里的comment对象允许32K的字符说明。
同样,修改 上一个tips的代码如下,就可以使用最多到32K的字符了。
With Cells(1,1).AddComment
.text "说明,最多32k"
.Shape.TextFrame.AutoSize = False
.Shape.width = 400
End With
这里.AddComment是很重要的手法 。
星期三, 十二月 20, 2006
Tips,VBA里如何扩展一个注释的宽度,避免自动折行
.NoteText "我的注释啊。。。。。。。。。。。。。。"
.Comment.Shape.TextFrame.AutoSize = False
.Comment.Shape.width = 400
End With
.comment.shape.width 是关键语句
星期五, 十二月 08, 2006
Java 5 注释功能的一点小知识。
1. Target:用来指定这个注释(Annotation)是为哪种类型而定义的。比如,这个类型可能只是为method定义的。比如override,不能用@override来修饰class或者field。
2.Retention:Retention的策略可以从以下三种中选取:- RetentionPolicy.SOURCE:编译器编译之后会会从class file中除去注释(Annotation)。
- Retention.CLASS:注释(Annotation)保留在class file中,但是VM不会处理。
- RetentionPolicy.RUNTIME,:注释(Annotation)保留在class file,VM会进行处理。
请注意,如果你希望在运行时查找到这些注释在什么地方被用到,一定要在定义注释的时候,选择RetentionPolicy.RUNTIME,否则即使你用注释修饰了类变量或者方法,在运行时也没有办法获得这个信息的。
3.Documented:这个注释(Annotation)将作为public API的一部分。
4.Inherited : 假设注释(Annotation)定义的时候使用了Inherited,那么如果这个注释(Annotation)修饰某个class,这个类的子类也被这个注释(Annotation)所修饰。
J2SE的内建注释(build-in annotation)
在程序中不仅可以使用自己定义的注释,还可以使用J2SE5.0中内建的注释类型。下面我们就详细来介绍J2SE5.0提供的注释类型。J2SE 5.0中预定义了三种注释注释类型:
Override :java.lang.Override 表示当前的方法重写了父类的某个方法,如果父类的对应的方法并不存在,将会发生编译错误。
Deprecated:java.lang.Deprecated 表示 并不鼓励使用当前的方法或者域变量。
SuppressWarnings: java.lang.SuppressWarnings关闭编译器告警,这样,在编译1.5之前的代码的时候,不会出现大量不关心的无关的告警
一个最小例子:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface Copyright { String value();
}
星期二, 十一月 28, 2006
Java1.5泛型指南
JDK1.5中引入了对java语言的多种扩展,泛型(generics)即其中之一。
这个教程的目标是向您介绍java的泛型(generic)。你可能熟悉其他语言的泛型,最著名的是C++的模板(templates)。如果这样,你很快就会看到两者的相似之处和重要差异。如果你不熟悉相似的语法结构,那么更好,你可以从头开始而不需要忘记误解。
Generics允许对类型进行抽象(abstract over types)。最常见的例子是集合类型(Container types),Collection的类树中任意一个即是。
下面是那种典型用法:
List myIntList = new LinkedList();// 1
myIntList.add(new Integer(0));// 2
Integer x = (Integer) myIntList.iterator().next();// 3
第3 行的类型转换有些烦人。通常情况下,程序员知道一个特定的list里边放的是什么类型的数据。但是,这个类型转换是必须的(essential)。编译器只能保证iterator返回的是Object类型。为了保证对Integer类型变量赋值的类型安全,必须进行类型转换。
当然,这个类型转换不仅仅带来了混乱,它还可能产生一个运行时错误(run time error),因为程序员可能会犯错。
程序员如何才能明确表示他们的意图,把一个list中的内容限制为一个特定的数据类型呢?这是generics背后的核心思想。这是上面程序片断的一个泛型版本:
以下是引用片段:
List<Integer> myIntList = new LinkedList<Integer>(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = myIntList.iterator().next(); // 3
注意变量myIntList的类型声明。它指定这不是一个任意的List,而是一个Integer的List,写作:List< Integer>。我们说List是一个带一个类型参数的泛型接口(a generic interface that takes a type parameter),本例中,类型参数是Integer。我们在创建这个List对象的时候也指定了一个类型参数。
另一个需要注意的是第3行没了类型转换。
现在,你可能认为我们已经成功地去掉了程序里的混乱。我们用第1行的类型参数取代了第3行的类型转换。然而,这里还有个很大的不同。编译器现在能够在编译时检查程序的正确性。当我们说myIntList被声明为List<Integer>类型,这告诉我们无论何时何地使用myIntList变量,编译器保证其中的元素的正确的类型。与之相反,一个类型转换说明程序员认为在那个代码点上它应该是那种类型。
实际结果是,这可以增加可读性和稳定性(robustness),尤其在大型的程序中。
2. 定义简单的泛型
下面是从java.util包中的List接口和Iterator接口的定义中摘录的片断:
public interface List<E> {
void add(E x);
Iterator<E> iterator();
}
public interface Iterator<E> {
E next();
boolean hasNext();
}
这些都应该是很熟悉的,除了尖括号中的部分,那是接口List和Iterator中的形式类型参数的声明(the declarations of the formal type parameters of the interfaces List and Iterator)。
类型参数在整个类的声明中可用,几乎是所有可是使用其他普通类型的地方(但是有些重要的限制,请参考第7部分)。
(原文:Type parameters can be used throughout the generic declaration, pretty much where you would use ordinary types (though there are some important restrictions; see section 7))
在介绍那一节我们看到了对泛型类型声明List(the generic type declaration List)的调用,如List<Integer>。在这个调用中(通常称作一个参数化类型a parameterized type),所有出现形式类型参数(formal type parameter,这里是E)都被替换成实体类型参数(actual type argument)(这里是Integer)。
你可能想象,List<Integer>代表一个E被全部替换成Integer的版本:
public interface IntegerList {
void add(Integer x)
Iterator<Integer> iterator();
}
这种直觉可能有帮助,但是也可能导致误解。
它有帮助,因为List<Integer>的声明确实有类似这种替换的方法。
它可能导致误解,因为泛型声明绝不会实际的被这样替换。没有代码的多个拷贝,源码中没有、二进制代码中也没有;磁盘中没有,内存中也没有。如果你是一个C++程序员,你会理解这是和C++模板的很大的区别。
一个泛型类型的声明只被编译一次,并且得到一个class文件,就像普通的class或者interface的声明一样。
类型参数就跟在方法或构造函数中普通的参数一样。就像一个方法有形式参数(formal value parameters)来描述它操作的参数的种类一样,一个泛型声明也有形式类型参数(formal type parameters)。当一个方法被调用,实参(actual arguments)替换形参,方法体被执行。当一个泛型声明被调用,实际类型参数(actual type arguments)取代形式类型参数。
一个命名的习惯:我们推荐你用简练的名字作为形式类型参数的名字(如果可能,单个字符)。最好避免小写字母,这使它和其他的普通的形式参数很容易被区分开来。许多容器类型使用E作为其中元素的类型,就像上面举的例子。在后面的例子中还会有一些其他的命名习惯。
3. 泛型和子类继承
让我们测试一下我们对泛型的理解。下面的代码片断合法么?
以下是引用片段:
List<String> ls = new ArrayList<String>(); //1
List<Object> lo = ls; //2
第1行当然合法,但是这个问题的狡猾之处在于第2行。
这产生一个问题:
一个String的List是一个Object的List么?大多数人的直觉是回答:“当然!”。
好,在看下面的几行:
以下是引用片段:
lo.add(new Object()); // 3
String s = ls.get(0); // 4: 试图把Object赋值给String
这里,我们使用lo指向ls。我们通过lo来访问ls,一个String的list。我们可以插入任意对象进去。结果是ls中保存的不再是String。当我们试图从中取出元素的时候,会得到意外的结果。
java编译器当然会阻止这种情况的发生。第2行会导致一个编译错误。
总之,如果Foo是Bar的一个子类型(子类或者子接口),而G是某种泛型声明,那么G<Foo>是G<Bar>的子类型并不成立!!
这可能是你学习泛型中最难理解的部分,因为它和你的直觉相反。
这种直觉的问题在于它假定这个集合不改变。我们的直觉认为这些东西都不可改变。
举例来说,如果一个交通部(DMV)提供一个驾驶员里表给人口普查局,这似乎很合理。我们想,一个List<Driver>是一个 List<Person>,假定Driver是Person的子类型。实际上,我们传递的是一个驾驶员注册的拷贝。然而,人口普查局可能往驾驶员list中加入其他人,这破坏了交通部的记录。
为了处理这种情况,考虑一些更灵活的泛型类型很有用。到现在为止我们看到的规则限制比较大。
4. 通配符(Wildcards)
考虑写一个例程来打印一个集合(Collection)中的所有元素。下面是在老的语言中你可能写的代码:
以下是引用片段:
void printCollection(Collection c) {
Iterator i = c.iterator();
for (int k = 0; k < c.size(); k++) {
System.out.println(i.next());
}
}
下面是一个使用泛型的幼稚的尝试(使用了新的循环语法):
以下是引用片段:
void printCollection(Collection<Object> c) {
for (Object e : c) {
System.out.println(e);
}
}
问题是新版本的用处比老版本小多了。老版本的代码可以使用任何类型的collection作为参数,而新版本则只能使用Collection<Object>,我们刚才阐述了,它不是所有类型的collections的父类。
那么什么是各种collections的父类呢?它写作: Collection<?>(发音为:"collection of unknown"),就是,一个集合,它的元素类型可以匹配任何类型。显然,它被称为通配符。我们可以写:
以下是引用片段:
void printCollection(Collection<?> c) {
for (Object e : c) {
System.out.println(e);
}
}
现在,我们可以使用任何类型的collection来调用它。注意,我们仍然可以读取c中的元素,其类型是Object。这永远是安全的,因为不管collection的真实类型是什么,它包含的都是objects。但是将任意元素加入到其中不是类型安全的:
Collection<?> c = new ArrayList<String>();
c.add(new Object()); // 编译时错误
因为我们不知道c的元素类型,我们不能向其中添加对象。
add方法有类型参数E作为集合的元素类型。我们传给add的任何参数都必须是一个未知类型的子类。因为我们不知道那是什么类型,所以我们无法传任何东西进去。唯一的例外是null,它是所有类型的成员。
另一方面,我们可以调用get()方法并使用其返回值。返回值是一个未知的类型,但是我们知道,它总是一个Object,因此把get的返回值赋值给一个Object类型的对象或者放在任何希望是Object类型的地方是安全的。
4.1. 有限制的通配符(Bounded Wildcards)
考虑一个简单的画图程序,它可以用来画各种形状,比如矩形和圆形。
为了在程序中表示这些形状,你可以定义下面的类继承结构:
以下是引用片段:
public abstract class Shape {
public abstract void draw(Canvas c);
}
public class Circle extends Shape {
private int x, y, radius;
public void draw(Canvas c) { // ...
}
}
public class Rectangle extends Shape {
private int x, y, width, height;
public void draw(Canvas c) {
// ...
}
}
这些
这些类可以在一个画布(Canvas)上被画出来:
public class Canvas {
public void draw(Shape s) {
s.draw(this);
}
}
所有的图形通常都有很多个形状。假定它们用一个list来表示,Canvas里有一个方法来画出所有的形状会比较方便:
public void drawAll(List<Shape> shapes) {
for (Shape s : shapes) {
s.draw(this);
}
}
现在,类型规则导致drawAll()只能使用Shape的list来调用。它不能,比如说对List<Circle>来调用。这很不幸,因为这个方法所作的只是从这个list读取shape,因此它应该也能对List<Circle>调用。我们真正要的是这个方法能够接受一个任意种类的shape:
public void drawAll(List<? extends Shape> shapes) { //..}
这里有一处很小但是很重要的不同:我们把类型 List<Shape> 替换成了 List<? extends Shape>。现在drawAll()可以接受任何Shape的子类的List,所以我们可以对List<Circle>进行调用。
List<? extends Shape>是有限制通配符的一个例子。这里?代表一个未知的类型,就像我们前面看到的通配符一样。但是,在这里,我们知道这个未知的类型实际上是Shape的一个子类(它可以是Shape本身或者Shape的子类而不必是extends自Shape)。我们说Shape是这个通配符的上限(upper bound)。
像平常一样,要得到使用通配符的灵活性有些代价。这个代价是,现在像shapes中写入是非法的。比如下面的代码是不允许的:
public void addRectangle(List<? extends Shape> shapes) {
shapes.add(0, new Rectangle()); // compile-time error!
}
你应该能够指出为什么上面的代码是不允许的。因为shapes.add的第二个参数类型是? extends Shape ??一个Shape未知的子类。因此我们不知道这个类型是什么,我们不知道它是不是Rectangle的父类;它可能是也可能不是一个父类,所以这里传递一个Rectangle不安全。
有限制的通配符正是我们解决DMV给人口普查局传送名单的例子所需要的。我们的例子假定数据用一个姓名(String)到people(用Person或其子类来表示,比如 Driver)。Map<K,V>是一个有两个类型参数的泛型类型的例子,表示map的键key和值value。
再一次,注意形式类型参数的命名习惯??K代表keys,V代表vlaues。
public class Census {
public static void addRegistry(Map<String, ? extends Person> registry) { ...}
}...
Map<String, Driver> allDrivers = ...;
Census.addRegistry(allDrivers);
5. 泛型方法
考虑写一个方法,它用一个Object的数组和一个collection作为参数,完成把数组中所有object放入collection中的功能。
下面是第一次尝试:
static void fromArrayToCollection(Object[] a, Collection<?> c) {
for (Object o : a) {
c.add(o); // 编译期错误
}
}
现在,你应该能够学会避免初学者试图使用Collection<Object>作为集合参数类型的错误了。或许你已经意识到使用 Collection<?>也不能工作。会议一下,你不能把对象放进一个未知类型的集合中去。
解决这个问题的办法是使用generic methods。就像类型声明,方法的声明也可以被泛型化??就是说,带有一个或者多个类型参数。
static <T> void fromArrayToCollection(T[] a, Collection<T> c){
for (T o : a) {
c.add(o); // correct
}
}
我们可以使用任意集合来调用这个方法,只要其元素的类型是数组的元素类型的父类。
Object[] oa = new Object[100];
Collection<Object> co = new ArrayList<Object>();
fromArrayToCollection(oa, co);// T 指Object
String[] sa = new String[100];
Collection<String> cs = new ArrayList<String>();
fromArrayToCollection(sa, cs);// T inferred to be String
fromArrayToCollection(sa, co);// T inferred to be Object
Integer[] ia = new Integer[100];
Float[] fa = new Float[100];
Number[] na = new Number[100];
Collection<Number> cn = new ArrayList<Number>();
fromArrayToCollection(ia, cn);// T inferred to be Number
fromArrayToCollection(fa, cn);// T inferred to be Number
fromArrayToCollection(na, cn);// T inferred to be Number
fromArrayToCollection(na, co);// T inferred to be Object
fromArrayToCollection(na, cs);// compile-time error
注意,我们并没有传送真实类型参数(actual type argument)给一个泛型方法。编译器根据实参为我们推断类型参数的值。它通常推断出能使调用类型正确的最明确的类型参数(原文是:It will generally infer the most specific type argument that will make the call type-correct.)。
现在有一个问题:我们应该什么时候使用泛型方法,又什么时候使用通配符类型呢?
为了理解答案,让我们先看看Collection库中的几个方法。
public interface Collection<E> {
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
}
我们也可以使用泛型方法来代替:
public interface Collection<E> {
<T> boolean containsAll(Collection<T> c);
<T extends E> boolean addAll(Collection<T> c);
// hey, type variables can have bounds too!
}
但是,在 containsAll 和 addAll中,类型参数T 都只使用一次。返回值的类型既不依赖于类型参数(type parameter)也不依赖于方法的其他参数(这里,只有简单的一个参数)。这告诉我们类型参数(type argument)被用作多态(polymorphism),它唯一的效果是允许在不同的调用点,可以使用多种实参类型(actual argument)。如果是这种情况,应该使用通配符。通配符就是被设计用来支持灵活的子类化的,这是我们在这里要强调的。
泛型函数允许类型参数被用来表示方法的一个或多个参数之间的依赖关系,或者参数与其返回值的依赖关系。如果没有这样的依赖关系,不应该使用泛型方法。
(原文: Generic methods allow type parameters to be used to express dependencies among the types of one or more arguments to a method and/or its return type. If there isn’t such a dependency, a generic method should not be used.)
一前一后的同时使用泛型方法和通配符也是可能的。下面是方法 Collections.copy():
class Collections {
public static <T> void copy(List<T> dest, List<? extends T> src){...}
}
注意两个参数的类型的依赖关系。任何被从源list从拷贝出来的对象必须能够将其指定为目标list(dest) 的元素的类型??T类型。因此源类型的元素类型可以是T的任意子类型,我们不关心具体的类型。
copy方法的签名使用一个类型参数表示了类型依赖,但是使用了一个通配符作为第二个参数的元素类型。我们也可以用其他方式写这个函数的签名而根本不使用通配符:
class Collections {
public static <T, S extends T> void copy(List<T> dest, List<S> src){...}
}
这也可以,但是第一个类型参数在dst的类型和第二个参数的类型参数S的上限这两个地方都有使用,而S本身只使用一次,在src的类型中??没有其他的依赖于它。这意味着我们可以用通配符来代替S。使用通配符比声明显式的类型参数更加清晰和准确,所以在可能的情况下使用通配符更好。
通配符还有一个优势式他们可以在方法签名之外被使用,比如field的类型,局部变量和数组。这就有一个例子。
回到我们的画图问题,假定我们想要保持画图请求的历史记录。我们可以把历史记录保存在Shape类的一个静态成员变量里,在drawAll() 被调用的时候把传进来的参数保存进历史记录:
static List<List<? extends Shape>> history = new ArrayList<List<? extends Shape>>();
public void drawAll(List<? extends Shape> shapes) {
history.addLast(shapes);
for (Shape s: shapes) {
s.draw(this);
}
}
最终,再说一下类型参数的命名习惯。
我们使用T 代表类型,无论何时都没有比这更具体的类型来区分它。这经常见于泛型方法。如果有多个类型参数,我们可能使用字母表中T的临近的字母,比如S。如果一个泛型函数在一个泛型类里边出现,最好避免在方法的类型参数和类的类型参数中使用同样的名字来避免混淆。
星期五, 十一月 17, 2006
JBOSS如何同JVMSTAT 远程remote一起工作?
1.JBOSS 运行jdk 5.0
2.JBoss 运行 j2sdk 1.4.2
1.JBOSS 运行jdk 5.0
1.1 启动参数加入JAVA_OPTS="$JAVA_OPTS -XX:+UsePerfData"
1.2 然后在运行jstatd的地方建立一个policy文件。
jstatd.policy
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
1.3 启动jstatd,直接在命令行运行jdk 5.0自带的 {jdk5.0_home}\bin\jstatd
1.4 确认Jboss和jstatd都一起运行 ,运行jdk 5.0自带的jps 得到如下结果:
5911 Main
5776 Jstatd
6075 Jps
1.5 再客户段 运行 jvmstat 3.0 bat或bin目录下的的visualgc.cmd 5911@szse199
注意:hostName必须用域名.
得到如下图片.

2.JBoss 运行 j2sdk 1.4.2
2.1 首先下载.jvmstat 2.0.
展开到一个目录下比如c:\jvmstat.及服务器上/root/jvmstat.
2.2 配置服务器端的policy.
设置 export JVMSTAT_HOME=/root/jvmstat
到 $JVMSTAT_HOME/policies 目录下 配置policy.
configurepolicy PerfAgentAll.tmpl PerfAgent.policy
2.3 运行 perfagent (rmi registry server)
$JVMSTAT_HOME/bin/perfagent -p 12345
注意:-p 选择 在有端口冲突(1099)的情况下使用.
这样在远程使用的时候,需要指定端口
2.4 得到运行的lvmid
运行$JVMSTAT_HOME/bin/jvmps 得到jboss的lvmid
7565 org.jboss.Main
7701 jvmps.jar
7632 perfagent.jar
2.5 在远程client机器上运行监控程序.
c:\jvmstat\bat\visualgc.cmd 7565@szse199:12345
得到图形如上:
星期四, 十一月 16, 2006
如何使用JDK 5.0 Jconsole同Jboss 3.0.8 Later工作?
是非常好的工具。
如何同JBOSS 3.0.8SP1一起工作,的确花了一定的时间才正确配置。
1.JBOSS 3.0.8 SP1是可以在JDK 5。0下工作的版本,比之小的版本只能运行在jdk 1.4下。
目前不能通过远程工作。不知道怎么回事。Linux下配置.
Jboss配置
修改 bin\run.sh
加入以下代码:
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
然后在其他机器下运行 jConsole连接服务器。如图。

星期三, 十一月 01, 2006
如何用Ado从数据库复制数据到Excel的Sheets里?
Sub runthis()
Dim conn As New ADODB.Connection
Dim rec As New ADODB.Recordset
Dim sql As String
connstr = "ODBC;DSN=development;Server=10.2.1.1;Port=3306;Database=Store;Uid=root;Pwd="
sql = "SELECT * FROM employee "
Sheets("test").Activate
With ActiveSheet.QueryTables.Add(Connection:=connstr, _
Destination:=Range("B1"), sql:=sql)
.Refresh
End With
Set rec = Nothing
Set conn = Nothing
Exit Sub
errorHandler:
MsgBox "RunThis 错误:" & Err.Description
End Sub
方法二:
Sub runthis()
Dim conn As New ADODB.Connection
Dim rec As New ADODB.Recordset
Dim sql As String
connstr = "Driver={MySQL ODBC 3.51 Driver};Server=10.2.1.1;Port=3306;Option=131072;Stmt=;Database=store;Uid=root;Pwd="
conn.Open connstr
rec.Open "SELECT * FROM employee ", conn
sql = "SELECT * FROM emp_M_BasicInfo "
Sheets("test").Activate
Sheets("test").Cells.Clear
'显示字段名
For lCount = 0 To rec.Fields.Count - 1
Cells(1, 1 + lCount).Value = rec.Fields(lCount).Name
Next lCount
'显示数据
linenum = 1
If Not rec.EOF Then
Cells(linenum + 1, 1).CopyFromRecordset rec
rec.NextRecordset
linenum = linenum + 1
End If
Set rec = Nothing
Set conn = Nothing
Exit Sub
errorHandler:
MsgBox "RunThis 错误:" & Err.Description
End Sub
星期一, 十月 23, 2006
Tips.Excle 格式化cells value to text 文本
with cells(1,1)
.Style.NumberFormat = "@"
End with
星期五, 十月 13, 2006
Linux用Sendmail 发送 附件
#!/bin/sh
From="sunose@g.com"
To="sunose@g.com"
Subject="Sendmmail with attachment use uuencode"
(
echo "Subject: $Subject"
echo "body"
echo ""
uuencode $1 $1
) | /usr/sbin/sendmail -f$From $To
exit 0
Linux下Sendmail 配置成为邮件转发及避免DNS查询
一般语法转换为 m4 /etc/mail/sendmailmc > /etc/sendmail.cf
1。配置Sendmail作为邮件转发网关。
目的:做为内网,外网之间的Email集中,发散服务器。
可以把所有内网的Email通过一台Email发送到可以访问外网的服务器
配置.
1.1 直接修改sendmail.cf DS属性.
在Sendmail.cf里找到smart relay host DS 在后面加入需要转发到的中心Email网关
服务器的domain name
如 DSsmtp.microsft.com
1.2 修改sendmail.mc
加入:define(`SMART_HOST',`smtp.microsft.com')
然后用命令m4 编译成sendmail.cf.启动sendmail 就可以使用了。
上面的方法有个缺点,就是 网关服务器必须要有正规的域民,如果没有在发送email的时候,跟踪email
sendmail -v gate@microsft.com 会出现 (Reason 550 Host Unknown)的错误。
如何避免这个问题呢?这个问题就直接引出下面问题。
Sendmail发送Email的时候,如何避免查询DNS?
2. 配置Sendmail 发送Email不要查询DNS.
在sendmail.mc 文件里加入如下语句:
FEATURE(`nodns')dnl
然后通过 m4生成 sendmail.cf文件,并在提示下,建立/etc/mail/service.switch文件
文件内容包括如下:
hosts files
aliases files
注释:
hosts files 让sendmail的dns查询只查询/etc/hosts文件。
你可以在hosts文件里加入 ip 服务器名.
aliases files 让sendmail 查询/etc/mail/aliases
启动 sendmail /etc/init.d/sendmail restart 之后。
再用 sendmail -v xxx@microsft.com
就可以看到发送成功的消息了。如下
220 yourseve.name ESMTP Service ready at Fri, 13 Oct 2006 13:21:34 +0800
>>> EHLO localhost.localdomain
250-Email.Gateway Hello localhost.localdomain ([10.2.5.240]), pleased to meet you
250-HELP
250-SIZE 10240000
250 PIPELINING
>>> MAIL From:
250 root@localhost.localdomain... Sender OK
>>> RCPT To:
250 gate@microsft.com... Recipient OK
>>> DATA
354 Enter message, end with "." on a line by itself
>>> .
250 Message accepted for delivery
gate@microsft.com... Sent (Message accepted for delivery)
Closing connection to Email.gatway
>>> QUIT
星期二, 十月 10, 2006
Tips:Vba合并Excel的单元格
With Selection
.MergeCells = True
End With
任意多个对象都有.MergeCells的属性。
比如想把第一行合并。
With Rows(1)
.MergeCells = True
End With
星期四, 九月 28, 2006
Tips:Excle filter row copy to new sheet.
注意红色的关键代码。
'把包含某一个数字的记录,
'全部复制到result 工作簿里
'用户选择的range范围
Sub findByNumber()
Dim rng As Range
Dim newrng As Range
Dim Tools As New Toolkit
Dim choice As Integer
Dim cell As Object
Dim rRow As Range
Dim inyes As Boolean
Dim realnumber As Integer
Dim name As String
Dim counter As Integer
inyes = False
On Error Resume Next
counter = 1
choice = Application.InputBox("输入包含的数字", "查找的数字", Type:=1)'必须为数字
Set rng = Application.InputBox("选择数据范围", "选择数据", Selection.Address, , , , , 8)
If rng Is Nothing Then
MsgBox "你没有选择数据,不能继续"
Exit Sub
End If
name = rng.Parent.name
Add_Sheet ("result")
realnumber = choice
Sheets(name).Activate
If realnumber = 0 Then
Else
On Error GoTo errorhandler
For Each rRow In rng.Rows
inyes = False
For Each cell In rRow.Cells
If cell.value = realnumber Then '行中某一列的值同用户输入的值相等,则该行复制到result
inyes = True
rRow.Copy
Sheets("result").Activate
Sheets("result").Cells(counter, 1).Select
Sheets("result").Paste
counter = counter + 1
Sheets(name).Activate
Exit For
End If
Next 'for
Next
End If
Sheets("result").Activate
Exit Sub
errorhandler:
MsgBox Err.Description & Err.Source
End Sub
星期二, 九月 26, 2006
Tips:Excel sort by Each Column of Row
不能按照每一行第一列来排序。
必须自己编写一个方法来提供这个功能。
'iWhichWay as xlAscending 或 xlDescending,见Excel 2003 VBA 参考手册
Function SortRows(ByVal iWhichWay As Integer, rng As Range)
Dim rRow As Range
Dim parentSheet As String
parentSheet = rng.Parent.Name
Sheets(parentSheet).Activate '可以在任意sheet工作薄里对数据
'xlAscending,xlDescending
For Each rRow In rng.Rows
rRow.Sort Key1:=Range(rRow.Cells(1).Address), Order1:=iWhichWay , _
OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, _
DataOption1:=xlSortNormal
Next
End Function
星期六, 九月 23, 2006
tips:excel vba 等待一段时间继续执行
对此方法缺点有是没有直接方法来确定准确的时间, 程序将运行循环量。 时间量取决于计算机的速度。 以下代码运行循环, 不起作用但占用时间。
Sub MyDelayMacro
For iCount = 1 to 1000
Next iCount
End Sub
方法 2: 使用 API 调用来暂停执行 Word
使用一个 API 调用来暂停执行 Word 用于固定的时间量。
Kernel32 包含函数, 暂停用于指定长的时间, 毫秒中指定程序的执行。 要使用函数, 必须首先在它将在其中使用模块的常规声明部分声明它:
Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
(ByVal dwMilliseconds As Long)
使用以下语法来调用 Sleep 函数:
Sub Sleep()
Sleep 1000 'Implements a 1 second delay
End Sub
方法 3: 使用 OnTime 方法
使用 OnTime 方法来设置长的时间以运行其他宏命令之前暂停。 OnTime 方法使用以下语法:
表达式 .OnTime 时, 名称, Tolerance)
由于 名称 名称 参数需要, 运行一个宏的名称, 必须创建两个宏。 第一个宏包含 OnTime 方法调用和其他命令与宏相关。 第二个宏分配时间已过时运行。 第二个宏可以是 " 虚设 " 宏执行什么。
本示例运行名为 15 秒从示例宏 (MyMainMacro) 运行时间为 " MyDelayMacro " 宏。
Sub MyMainMacro()
' Pause for 15 seconds.
Application.OnTime When:=Now + TimeValue("00:00:15"), _
Name:="MyDelayMacro"
End Sub
Public Sub MyDelayMacro()
' Place your delayed macro commands here.
MsgBox "This macro runs after 15 seconds."
End Sub
有关获取与 VisualBasic 帮助 VisualBasicforApplications, 请单击文章编号以查看 Microsoft 知识库中相应:
星期五, 九月 22, 2006
Tips:Excel添加新的worksheet
Sub Add_Sheet(shtName As String)
Dim wSht As Worksheet
For Each wSht In Worksheets
If wSht.Name = shtName Then
Sheets(shtName).Cells.Clear '清除所有数据
Sheets(shtName).Activate 'focus
Exit Sub
End If
' MsgBox ActiveSheet.Name
Next wSht
Sheets.Add.Name = shtName
Sheets(shtName).Move After:=Sheets(Sheets.Count)
End Sub
星期四, 九月 21, 2006
tips:遍历(Iterator)Excel Range的数据。
For i = 1 To rng.row
For j=1 to rng.column
cells(i,j).value=??.
Next
counter = 1
For Each cell In rng
Cells(21, counter).Value = cell.Value
counter = counter + 1
Next
星期三, 九月 20, 2006
Excel Developer Tip: Pausing a Macro to Get a User-Selected Range
Sub ProblemCode()
Dim oRangeSelected As Range
On Error Resume Next
Set oRangeSelected = Application.InputBox("Please select a range of cells!", _
"SelectARAnge Demo", Selection.Address, , , , , 8)
If oRangeSelected Is Nothing Then
MsgBox "It appears as if you pressed cancel!"
Else
MsgBox "You selected: " & oRangeSelected.Address(external:=True)
End If
End Sub
这里的inpubox可以改变为一个editor,如果标准Excel显示。
星期五, 九月 08, 2006
开源的数学工具包。
http://jscience.org/ 是个提供一些数学方法的 java mathematics library
提供全部数学方法的函数库非常之少。
遗憾。