星期六, 十二月 22, 2007

罗马数字的表示方法

I - 1 unus
II - 2 duo
III - 3 tres
IV - 4 quattuor
V - 5 quinque
VI - 6 sex
VII - 7 septem
VIII - 8 octo
IX - 9 novem
X - 10 decem
XI - 11 undecim
XII - 12 duodecim
XIII - 13 tresdecim
XIV - 14 quattuordecim
XV - 15 quindecim
XVI - 16 sedecim
XVII - 17 septendecim
XVIII - 18 duodeviginti
XIX - 19 undeviginti
XX - 20 viginti
XXI - 21 viginti unus
XXII - 22 viginti duo
XXVIII - 28 duodetriginta
XXIX - 29 undetriginta
XXX - 30 triginta
XL - 40 quadraginta
L - 50 quinquaginta

1~10: I II III IV V VI VII VIII IX X
11~20: XI XII XIII XIV XV XVI XVII XVIII XIX XX
21~30: XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX
31~40: XXXI XXXII XXXIII XXXIV XXXV XXXVI XXXVII XXXVIII XXXIX XL
41~50: XLI XLII XLIII XLIV XLV XLVI XLVII XLVII XLIX L
其中,I 为1
V为5
X为10
L为50

星期五, 十二月 21, 2007

Hibernate的数据库事务处理

1. 介绍数据库事务、事务隔离级别、悲观锁、乐观锁等概念。

2.数据库ACID特征:

Atomic(原子性):指整个数据库事务是不可分割的工作单元。

Consistency(一致性):指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

Isolation(隔离性):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

Durability(持久性):指的是只要事务成功结束,它对数据库所作的更新就必须永久保存下来。

3.数据库系统支持两种事务模式:

自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。

手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。

4.MySQL中数据库表分为3种类型:INNODB、BDB和MyISAM,其中MyISAM不支持数据库事务。MySQL中create table 语句默认为MyISAM类型。

5.对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:

A.第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。

B.脏读:一个事务读到另一个事务为提交的更新数据。

C.虚读:一个事务读到另一个事务已提交的新插入的数据。

D.不可重复读:一个事务读到另一个事务已提交的更新数据。

E.第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。

6.数据库系统提供了四种事务隔离级别供用户选择:

A.Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。

B.Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。

C.Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。

D.Read Uncommitted(读未提交数据):一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以有优先考虑把数据库系统的隔离级别设为Read Commited,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场 合,可以由应用程序采用悲观锁或乐观锁来控制。

7.当数据库系统采用read Commited隔离级别时,会导致不可重复读喝第二类丢失更新的并发问题,可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度,锁可以分为以下几类:

A.悲观锁:指在应用程序中显示的为数据资源加锁。尽管能防止丢失更新和不可重复读这类并发问题,但是它会影响并发性能,因此应该谨慎地使用。

B.乐观锁:乐观锁假定当前事务操作数据资源时,不回有其他事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出现的并发问题。

8.悲观锁有两种实现方式:

A.在应用程序中显示指定采用数据库系统的独占所来锁定数据资源。SQL语句:select ... for update,在Hibernate中使用get,load时如session.get(Account.class,new Long(1),LockMode,UPGRADE)

B.在数据库表中增加一个表明记录状态的LOCK字段,当它取值为“Y”时,表示该记录已经被某个事务锁定,如果为“N”,表明该记录处于空闲状态,事务可以访问它。增加锁标记字段就可以实现。

9.利用Hibernate的版本控制来实现乐观锁

乐观锁是由程序提供的一种机制,这种机制既能保证多个事务并发访问数据,又能防止第二类丢失更新问题。

在应用程序中可以利用Hibernate提供的版本控制功能来视线乐观锁,OR映射文件中的元素和都具有版本控制的功能,一般推荐采用

星期三, 十二月 19, 2007

VBA.Vbscript的定时器timer.任务安排功能的实现

方法:
Application.
OnTime(EarliestTime, Procedure, LatestTime, Schedule)
因为可以有许多的任务,所以默认的索引任务的唯一key,就是该任务开始的时间。就是:
EarliestTime,如果想可以控制一个任务,必须保留下来开始任务的时间。
vba中需要申明一个全局的public变量来保存,
例子:
Public RunWhen As Double

找一个地方调用下面的方法就可以了。

sub msgMovie
RunWhen = Now + DateTime.TimeValue("00:00:05")
Application.OnTime RunWhen, "msgMovie"
end sub

如果要停止这个任务,需要调用以下方法:
sub stopTime()
On Error Resume Next
Application.OnTime EarliestTime:=RunWhen, Procedure:="msgMovie", Schedule:=False
end Sub

VBA/Vbscript 如何彻底关闭一个UserForm实例

Excel里的VBA定义了一个UserForm
当点击close按钮的时候,往往是调用me.hide方法来隐藏。单这样不能完全清楚当前
实例,当再次调用me.show的时候,只是将该窗口重新显示。
所以,如果需要在隐藏窗口的时候动态修改了内容,当再次显示的时候,
想显示出来的时候,必须加入unload me代码
如下:
Private Sub okbutton_Click()
aboutForm.Hide
Unload Me
End Sub

星期一, 十一月 19, 2007

Mathematica 6 帮助搜索没有反应

原因:

Mathematica 6 用Java打开连接服务器来动态更新帮助文档,如果在有了firewall或proxy的情况下,Mathematica 6 可能会应为等待返回而造成,帮助的搜索,点击link无法打开新文档新窗口。

这种情况下要关闭Mathematica 6的这个选择。

在edit.Preferencs..Internet Connectivity去掉这个功能。

如图

星期五, 十一月 09, 2007

配置Jboss web 虚拟目录

在jboss 4.2.1 GA里需要修改
deploy/jboss-web.deployer/server.xml
加入下面类似的红色代码行。

<Host name="localhost"
autoDeploy="false" deployOnStartup="false" deployXML="false"
configClass="org.jboss.web.tomcat.security.config.JBossContextConfig"
>
......

<context path="/help" docbase="/home/jb/jboss/server/mrp_guide" debug="0" reloadable="true">
</host >

星期五, 十月 26, 2007

网络Vbscript函数库大全

http://www.thescriptlibrary.com/default.asp?Action=SubIndex&ScriptLanguage=VBScript

不过现在还不太清楚如何在一个vbscript调用另外一个vbscript文件里的函数呢?

需要研究一下

星期二, 十月 23, 2007

Sqlite3 3.5.1 如何读取汉字?

首先.sqlite3 建立的数据库默认编码是UTF-8.
当进入管理界面通过.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命令

目的:在Vbscript中实现清空当前cmd窗口的内容。经过实验 发现一下代码可以实现。

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

1.普通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 如何得到返回的对象?

把需要返回的对象在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

上次写的文章中因为无法使用Com对象“HTMLFILE”,而不得不采用IE.Application对象来处理
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文件。

PowerShell中可以直接使用.NET的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 call that takes and returns simple data types.
##
## ie:
##
## ## Prepare the parameter types and parameters for the
## CreateHardLink function
## $parameterTypes = [string], [string], [IntPtr]
## $parameters = [string] $filename, [string] $existingFilename, [IntPtr]::Zero
##
## ## Call the CreateHardLink method in the Kernel32 DLL
## $result = Invoke-WindowsApi "kernel32" ([bool]) "CreateHardLink" `
## $parameterTypes $parameters
##
##############################################################################

param(
[string] $dllName,
[Type] $returnType,
[string] $methodName,
[ Type[]] $parameterTypes,
[Object[]] $parameters
)

## Begin to build the dynamic assembly
$domain = [AppDomain]::CurrentDomain
$name = New-Object Reflection.AssemblyName 'PInvokeAssembly'
$assembly = $domain.DefineDynamicAssembly( $name, 'Run')
- Show quoted text -
$module = $assembly.DefineDynamicModule( 'PInvokeModule')
$type = $module.DefineType('PInvokeType', "Public,BeforeFieldInit")

## Go through all of the parameters passed to us. As we do this,
## we clone the user's inputs into another array that we will use for
## the P/Invoke call.
$inputParameters = @()
$refParameters = @()

for($counter = 1; $counter -le $parameterTypes.Length; $counter++)
{
## If an item is a PSReference, then the user
## wants an [out] parameter.
if($parameterTypes[$counter - 1] -eq [Ref])
{
## Remember which parameters are used for [Out] parameters
$refParameters += $counter

## On the cloned array, we replace the PSReference type with the
## .Net reference type that represents the value of the PSReference,
## and the value with the value held by the PSReference.
$parameterTypes[ $counter - 1] =
$parameters[$counter - 1 ].Value.GetType().MakeByRefType()
$inputParameters += $parameters[$counter - 1].Value
}
else
{
## Otherwise, just add their actual parameter to the
## input array.
$inputParameters += $parameters[$counter - 1]
}
}

## Define the actual P/Invoke method, adding the [Out]
## attribute for any parameters that were originally [Ref]
## parameters.
$method = $type.DefineMethod( $methodName, 'Public,HideBySig,Static,PinvokeImpl',
$returnType, $parameterTypes )
foreach($refParameter in $refParameters)
{
[void] $method.DefineParameter($refParameter, "Out", $null)
}

## Apply the P/Invoke constructor
$ctor = [Runtime.InteropServices.DllImportAttribute ].GetConstructor([string])
$attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dllName
$method.SetCustomAttribute($attr)

## Create the temporary type, and invoke the method.
$realType = $type.CreateType()

$realType.InvokeMember($methodName, 'Public,Static,InvokeMethod', $null, $null,
$inputParameters)

## Finally, go through all of the reference parameters, and update the
## values of the PSReference objects that the user passed in.
foreach($refParameter in $refParameters)
{
$parameters[$refParameter - 1].Value = $inputParameters[$refParameter - 1]
}

星期五, 十月 05, 2007

Akashic records

空之境界中对于阿克夏记录,或者说阿卡沙年代记的注解十分简单和模糊。阿克夏记录(Akashic Records)并不具备电脑分析和处理信息的功能,它所能做的只有忠实详细的记录而已。

阿 克夏的概念起源于印度。在婆罗门教的文献中,“阿克夏”被描述为“宇宙的精神—物质”,它包括了所有的存在与发展。与之类似的“梵”(婆罗门教与印度教的 主神之一,为创造之神,亦指终生之本)在实质上通常被视作非个人的、无法识别的最高宇宙原理,万物来源于它,万物又回归于它。它非实体、非物质、非先天而 又永恒存续,无始无终。按照古老的印度学说,梵“能够穿透一切,赋予至高无上的天神或是小到极点的矿物原子以生机。”古印度秘密学说最后明确指出,“阿克 夏就是一切创造物的起源于回归之地”,阿克夏“比一切万物都更古老”,简直就是“最后的终点”。阿克夏就是世间万物的根源(荒耶宗莲竭尽全力所追求的,想 必就是这个东西了);而阿克夏记录则使得任何时刻——包括过去、现在和未来——所发生的任何事情都不致归于遗忘之中,它记录了一切的信息。

当 然在客观上,没有确切的证据能证明这样一种所谓的“宇宙记忆”确实存在,或者证明这个世界上从一开始曾经发生的一切都被记录了下来。但若仅仅因此就认为阿 克夏记录是不存在的,同样不能令人信服。即使是现代,这种现象也能得到共鸣和认同,只是换了一个完全不同的名字:形态发生场。

剑桥大学的 生化学家鲁伯特·谢尔德雷克在其著作《创造性的宇宙》中写道,形态发生场能够摆脱时间和空间发挥作用。具体地说,如果一个生物种类的成员获得了一种新的行 为,那么它自己的形态发生场会由此改变。只要这种新的行为在足够长的时间里得到了坚持,物种成员之间就会形成一种相互影响,进而影响整个物种。实际的例子 是:一只老鼠一旦学会了在一明一暗的信号下告到黄油,其他老鼠就会越来越快地掌握这个方法。直到最后,所有的老鼠——即便不是由最初的那只生出来的,也不 曾与它有过接触——都学会了这种行为。

按照谢尔德雷克的观点,自然是具有“记忆”的,我们通常视作自然法则的东西只不过是“习惯”。自然存在与“习惯”也就是“行为模式”之中。根据这一构想,自然界中的每一类事物都必须按照它那一类的“集体记忆”内容来行事,从有生命的事物到无生命的物质都是如此。

调试.NET错误工具

再运行Powershell经常出现一些系统错误,可以通过
C:\Program Files\Microsoft.NET\SDK\v2.0\Bin\FUSLOGVW.exe 来观察错误。
首先运行FUSLOGVW.exe ,然后再运行Powershell,就可以在FUSLOGVW.exe窗口中看到错误内容。如图


双击条目或按下 查看日志按钮,则在IE中查看日志内容

Dll 函数查看工具

因为在Powershell里调用一些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 数据库

首先必须安装了Mysql 5.0 Connector .net 5.0的driver,
下载地址: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?

增强版本的HelloWorld,通过传递一族人民到HellowWorld.
一下只写明增强版本的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第一步

首先来自Microsoft的例子:http://msdn2.microsoft.com/en-us/library/ms714437.aspx
编译一个以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

HTML document是相对XML Document而言,非格式良好的XMLnon-well formatted.
使用标准的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控件?

在PowerShell下,用一下命令都可以做到
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 定制提示符号的简单技巧





















set-item -path function:prompt -value {' PS '+ $(Get-Date -format t) + " " + $(write-host -f red $(Get-Location) -nonewline) + '> '}

得到如下效果:

星期一, 九月 17, 2007

如何通过VBA来让Excel显示HTML代码?

目前发现的方法只是让 EXCEL通过web query是直接支持的。
如果需要更加灵活的方式,目前只能通过把 HTML代码复制到系统粘贴板,然后再让EXCEL
粘帖来实现。

首先在Excel里 ,按下Alt+F11打开宏编写。
然后在菜单工具-->引用。。里找到 Microsoft Forms 2.0 object library ,启用之,
然后书写一下代码,则可以实现了Excel的HTML渲染。

Dim MyDataObj As New DataObject

MyDataObj.SetText "

OneTwo
"

MyDataObj.PutInClipboard '复制到clipboard

然后再调用

ActiveSheet.Paste

则可以显示HTML效果了。

另外一种通过 HTMLProject 来完成,把HTML页面直接传送过去

ActiveWorkbook.HTMLProject.HTMLProjectItems(stockCode).Text = resl
ActiveWorkbook.HTMLProject.RefreshProject


星期五, 九月 14, 2007

几种语言如何设置跳过盗链的检查

一般Java 访问网站。
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关键词的解释.

往往在函数中使用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。

http://www.json.org/
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)。
JSON的表达语法:
object //用两个大花括号把对象数组包含起来。
{}
{ members }

members //成员
pair
pair , members
pair //标准的名字:值
string : value
array //数组用两个中括号包含起来的
[]
[ elements ]
elements
value
value , elements
value
string
number
object
array
true
false
null

简单的一个小技巧,如何把一个符合JSON数组表达的字符串转为Javascript数组对象
<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文件产生空白行的办法,就是需要把所有的<%%>连起来书写,在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 语法.

http://www.nauticalworld.co.uk/jscripts/dhtmlxTreeGrid/samples/pro_paging_wt.html

<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)的申明

Anonymous function(or Unnamed function)语法:

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="mainTabContainer" selectedTab="这里是{CalendarPart,vocationPart,WorkCenterPart}之一" dojoType="TabContainer" style="width: 100%; height: 26em;">
<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.

任务管理器,选择进程,鼠标右键选择调试,然后查看log文件

c:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson\drwtsn32.log

星期日, 七月 15, 2007

飞狐 运行VBS公式出现错误处理。

在飞狐公式中运行VBS公式出现以下错误的提示:

"脚本引擎请求位置对象信息:"Wscript"",脚本引擎请求位置对象信息:"JSProxy"

解决方法:

进入windows目录下,再进入system32目录下,运行:
regsvr32 jscript.dll
regsvr32 vbscript.dll

再启动飞狐软件或股道软件就可以了。

Java Rest框架。

https://cetia4.dev.java.net/

支持:Servlet API.

支持ROR的Java框架.

http://grails.codehaus.org/

星期五, 七月 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 "]]>":


<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1
}
else
{
return 0
}
}
]]>
</script>

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页面不能刷新

通过javascript在页面更深,删除后,通过调用window.location.reload()或者window.location.href
的方式来刷新jsp页面,浏览器只是从cache里调用,并没有从服务器段刷新新的页面

如何能通过Javascript来手动刷新jsp页面呢。

秘密在于要加入以下一句

window.returnValue=0;

星期一, 六月 11, 2007

Motorala E6墙纸 Linux下的路径

Motorala E6 wallpater的路径在:

\\169.254.142.2\system\usr\data_resource\picture

星期一, 五月 14, 2007

Motorola E6 修改开机画面。

\\169.254.142.2\system\ezx_user\download\appwrite\setup\ezx_theme.cfg

[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 解除手机四个按钮自定义冻结

\\169.254.142.2\system\ezx_user\download\appwrite\setup\ezx_idle.cfg

发现:

[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的一些说明

Motorola E6使用的是:MontaVista(R) Linux(R) Consumer Electronics Edition 3.1
在网络上找到这个公司网址及文档的说明地址: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 热键的编写方法

Office 的帮助文件一般放在office安装目录下。比如:\OFFICE11\2052\VBAOF11.CHM

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里如何增加菜单及菜单项目风格线

在vbproject ThisWorkbook 里输入以下代码

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

butterfly

butterfly

星期五, 一月 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