存档

‘技术’ 分类的存档

软件测试Ron Patton(英文)

2008年9月21日 没有评论
分类: 技术 标签:

无线餐饮点菜系统–去年的毕业设计

2008年9月21日 36 条评论

无线点菜
仿龙脉
截图:


PDF文件:毕业设计文件下载

源代码文件:代码下载
==========================================
安装步骤:
一、安装步骤
假设全部安装在同一台计算机上,将本光盘全部文件复制到目标计算机上
1、安装sql2000
2、进入目录“SQL服务器”,安装sp4
3、进入目录“SQL服务器”,还原数据库yunfei

4、进入目录“IIS服务器\Microsoft SQL Server 2005 Mobile Edition”,安装Sqlce30setupcn.msi
5、进入目录“IIS服务器\Microsoft SQL Server 2005 Mobile Edition”,安装sql2kcnsp4.msi
6、(确认所在计算机已经安装了IIS)将目录“IIS服务器\wwwroot”指定为IIS根目录
7、运行Microsoft SQL Server 2005 Mobile Edition的“配置 Web 同步向导”,
在出现的步骤中新建立虚拟目录sqlce,路径指定为“IIS服务器\wwwroot”,
客户端身份验证选择“以匿名方式”,
在“匿名访问”界面取消复选框的选择

8、进入目录“测试机器(虚拟PDA端)”,安装netsvwrap(Virtual PC Network Driver).msi
9、进入目录“测试机器(虚拟PDA端)”,安装Windows Mobile 5.0 Pocket PC SDK.msi
10、进入目录“测试机器(虚拟PDA端)”,安装Windows Mobile 5.0 Emulator Images for Pocket PC – CHS.msi

11、进入控制面板——添加硬件——添加新的硬件设备——“安装我手动从列表选择的硬件(高级)”——网络适配器——Microsoft Loopback

Adapter

二、演示步骤
(1)客户端
1、禁用除Microsoft Loopback Adapter的其他网络连接,为Microsoft Loopback Adapter连接配置IP
2、进入C:\Program Files\Microsoft Device Emulator\1.0, 运行dvcemumanager.exe,右键选择“Pocket PC 2003 SE仿真程序”——连接
3、为打开的“Pocket PC 2003 SE仿真程序”配置IP地址和代理服务器地址,IP地址应和本地计算机同一网段,代理服务器地址为本地计算机的IP
4、打开“Pocket PC 2003 SE仿真程序”的“文件——配置——网络”,选择“启用NE2000 PCMCIA网络适配器并绑定到”,确定。
5、打开“Pocket PC 2003 SE仿真程序”浏览器,在地址栏输入本地计算机的IP地址,若配置无误,则会出现一个HTML页面,按顺序安装。
6、打开“Pocket PC 2003 SE仿真程序”——程序——资源管理器——Program Files——yunfei——运行程序
SQL服务器名:当前SQLserver所运行的实例的名称
SQL代理地址:当前计算机的IP地址(即运行IIS服务的计算机地址)
默认用户名:haijun,密码:haijun

(2)管理端
进入目录“管理端”,安装,即可使用
首先配置网络,默认用户名:111,密码:111

========================================================================

基本代码:

using System;
using System.Text;
using System.IO;
using System.Data;
using System.Windows.Forms;
using System.Collections;
using System.Data.Common;
using System.Data.SqlServerCe;
using System.Data.SqlClient;
using System.Reflection;
 
namespace Yunfei_Client
{
public class SQLServerCEWrapper
{
public static string ceUser =null;// "haijun";
 
public static string SqlServer =null;// "HAIJUN";
public static string SqlAgent_ip = null;//192.168.0.254
public static string SqlAgent =null;
 
public static string RemoteConnection = "Provider=sqloledb;Data Source=" + SqlServer + ";Initial Catalog=yunfei;User ID=sa;Password=sa;";
public static string LocalDatabase = string.Format(@"{0}\yunfei.sdf", Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase));
public static string LocalConnection = string.Format(@"Data Source = {0}", LocalDatabase);
 
public SQLServerCEWrapper()
{
 
}
 
public bool CreateDatabase()
{
 
if (File.Exists(LocalDatabase))
{
File.Delete(LocalDatabase);
SqlCeEngine SQLCEEngine = new SqlCeEngine(LocalConnection);
SQLCEEngine.CreateDatabase();
SQLCEEngine.Dispose();
// MessageBox.Show("数据库创建成功!");
return true;
}
else
{
SqlCeEngine SQLCEEngine = new SqlCeEngine(LocalConnection);
SQLCEEngine.CreateDatabase();
SQLCEEngine.Dispose();
return true;
}
 
}
 
public void DeleteDatabase()
{
// Delete the local database!
// *****************************
try
{
if (File.Exists(LocalDatabase) == true)
{
File.Delete(LocalDatabase);
}
}
catch (SqlCeException ex)
{
ShowErrors(ex);
}
}
 
public void Pull(bool KeepLocalData, string TableName, string sqlSelectString)
{
// 将表请求下载到本地数据库中。
// *****************************
 
try
{
string SQL=null;
SqlCeConnection cn=null;
SqlCeCommand cmd=null;
SqlCeRemoteDataAccess RDA = null;
 
// 创建并启动新的 RDA 对象
RDA = new SqlCeRemoteDataAccess(SqlAgent, LocalConnection);
 
// 是否保留本地数据?如果要保留,请先强制上载这些数据!
if (KeepLocalData)
{
RDA.Push(TableName, RemoteConnection, RdaBatchOption.BatchingOff);
}
 
// 在 Pull 之前,必须先删除本地表
// 打开本地数据库连接
cn = new SqlCeConnection(LocalConnection);
cn.Open();
 
// 删除本地表
SQL = "DROP TABLE " + TableName;
cmd = new SqlCeCommand(SQL, cn);
// 如果该表不存在,则出错。
// 如果出错,可以置之不理。
try
{
cmd.ExecuteNonQuery();
}
catch
{
 
}
 
// 关闭连接
cmd.Dispose();
cn.Close();
cn.Dispose();
// 最后,请求下载远程表!
SQL = sqlSelectString;
RDA.Pull(TableName, SQL, RemoteConnection, RdaTrackOption.TrackingOnWithIndexes);
 
// 清理
SQL = null;
RDA.Dispose();
}
catch (SqlCeException ex)
{
ShowErrors(ex);
}
 
}
 
public void Push(string localTableName)
{
try
{
SqlCeRemoteDataAccess RDA = null;
// 创建并启动新的 RDA 对象
RDA = new SqlCeRemoteDataAccess(SqlAgent, LocalConnection);
RDA.Push(localTableName, RemoteConnection, RdaBatchOption.BatchingOff);
RDA.Dispose();
//MessageBox.Show("数据上传成功!");
}
catch (SqlCeException ex)
{
ShowErrors(ex);
}
}
 
public DataSet GetResult(string TableName, string sqlSelectString)
{
// 从本地数据库获取数据。作为 DataSet 返回。
// *****************************
//try
//{
string SQL=null;
SqlCeConnection cn=null;
SqlCeCommand cmd=null;
DataSet ds=null;
SqlCeDataAdapter da=null;
 
// 初始化新的连接
cn = new SqlCeConnection(LocalConnection);
 
// 打开连接
cn.Open();
 
// 生成 SQL
SQL = sqlSelectString;
 
// 初始化新的命令
cmd = new SqlCeCommand(SQL, cn);
 
// 初始化新的 DataSet
ds = new DataSet();
da = new SqlCeDataAdapter(SQL, cn);
 
// 通过适配器,使用数据来填充 DataSet
da.Fill(ds, TableName);
// 清理
da.Dispose();
cmd.Dispose();
cn.Close();
cn.Dispose();
SQL = null;
 
// 返回 DataSet
return ds;
//}
//catch (SqlCeException ex)
//{
// ShowErrors(ex);
//}
 
}
 
public int CountResult(string sqlCountString)
{
// Count the result.
// *****************************
//try
//{
 
int Count = 0;
string SQL=null;
SqlCeConnection cn=null;
SqlCeCommand cmd=null;
cn = new SqlCeConnection(LocalConnection);
cn.Open();
SQL = sqlCountString;
cmd = new SqlCeCommand(SQL, cn);
cmd.CommandText = SQL;
Count =(int)cmd.ExecuteScalar();
cmd.Dispose();
cn.Close();
cn.Dispose();
SQL = null;
return Count;
//}
//catch (SqlCeException ex)
//{
// ShowErrors(ex);
//}
 
}
 
//public void DoResult(string sqlInsertString)
//{
// try
// {
// string SQL;
// SqlCeConnection cn;
// SqlCeCommand cmd;
// cn = new SqlCeConnection(LocalConnection);
 
// cn.Open();
 
// SQL = sqlInsertString;
// cmd = new SqlCeCommand(SQL, cn);
// cmd.CommandText = SQL;
// int ccc=cmd.ExecuteNonQuery();
 
// cmd.Dispose();
// cn.Dispose();
// }
// catch (SqlCeException ex)
// {
// ShowErrors(ex);
// }
 
//}
 
public void Submit(string sqlString)
{
try
{
SqlCeRemoteDataAccess RDA = null;
// 创建并启动新的 RDA 对象
RDA = new SqlCeRemoteDataAccess(SqlAgent, LocalConnection);
RDA.SubmitSql(sqlString,RemoteConnection);
RDA.Dispose();
//MessageBox.Show(远程执行命令成功!");
}
catch (SqlCeException ex)
{
ShowErrors(ex);
}
}
 
public static void ShowErrors(SqlCeException e)
{
SqlCeErrorCollection errorCollection = e.Errors;
 
StringBuilder bld = new StringBuilder();
Exception inner = e.InnerException;
 
foreach (SqlCeError err in errorCollection)
{
bld.Append("\n Error Code: " + err.HResult.ToString("X", System.Globalization.CultureInfo.CurrentCulture));
bld.Append("\n Message : " + err.Message);
bld.Append("\n Minor Err.: " + err.NativeError);
bld.Append("\n Source : " + err.Source);
 
foreach (int numPar in err.NumericErrorParameters)
{
if (0 != numPar) bld.Append("\n Num. Par. : " + numPar);
}
 
foreach (string errPar in err.ErrorParameters)
{
if (String.Empty != errPar) bld.Append("\n Err. Par. : " + errPar);
}
}
MessageBox.Show(bld.ToString());
}
}
}
分类: 技术 标签:

软件测试的基础知识概要

2008年9月21日 没有评论

一、概述

  信息技术的飞速发展,使软件产品应用到社会的各个领域,软件产品的质量自然成为人们共同关注的焦点。不论软件的生产者还是软件的使用者,均生存在竞争的环境中,软件开发商为了占有市场,必须把产品质量作为企业的重要目标之一,以免在激烈的竞争中被淘汰出局。用户为了保证自己业务的顺利完成,当然希望选用优质的软件。质量不佳的软件产品不仅会使开发商的维护费用和用户的使用成本大幅增加,还可能产生其他的责任风险,造成公司信誉下降,继而冲击股票市场。在一些关键应用 (如民航订票系统、银行结算系统、证券交易系统、自动飞行控制软件、军事防御和核电站安全控制系统等) 中使用质量有问题的软件,还可能造成灾难性的后果。

  软件危机曾经是软件界甚至整个计算机界最热门的话题。为了解决这场危机,软件从业人员、专家和学者做出了大量的努力。现在人们已经逐步认识到所谓的软件危机实际上仅是一种状况,那就是软件中有错误,正是这些错误导致了软件开发在成本、进度和质量上的失控。有错是软件的属性,而且是无法改变的,因为软件是由人来完成的,所有由人做的工作都不会是完美无缺的。问题在于我们如何去避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可能低的程度。

  四、软件测试的复杂性与经济性

  人们常常以为,开发一个程序是困难的,测试一个程序则比较容易。这其实是误解。设计测试用例是一项细致并需要高度技巧的工作,稍有不慎就会顾此失彼,发生不应有的疏漏。

  不论是黑盒测试方法还是白盒测试方法,由于测试情况数量巨大,都不可能进行彻底的测试。所谓彻底测试,就是让被测程序在一切可能的输入情况下全部执行一遍。通常也称这种测试为“穷举测试”。 “黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。 “白盒”法是穷举路径测试,贯穿程序的独立路径数是天文数字,但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。e.w.dijkstra的一句名言对测试的不彻底性作了很好的注解:“程序测试只能证明错误的存在,但不能证明错误不存在”。

  在实际测试中,穷举测试工作量太大,实践上行不通,这就注定了一切实际测试都是不彻底的。当然就不能够保证被测试程序中不存在遗留的错误。软件工程的总目标是充分利用有限的人力和物力资源,高效率、高质量地完成测试。为了降低测试成本,选择测试用例时应注意遵守“经济性”的原则。第一,要根据程序的重要性和一旦发生故障将造成的损失来确定它的测试等级;第二,要认真研究测试策略,以便能使用尽可能少的测试用例,发现尽可能多的程序错误。掌握好测试量是至关重要的,一位有经验的软件开发管理人员在谈到软件测试时曾这样说过:“不充分的测试是愚蠢的,而过度的测试是一种罪孽”。测试不足意味着让用户承担隐藏错误带来的危险,过度测试则会浪费许多宝贵的资源。

  测试是软件生存期中费用消耗最大的环节。测试费用除了测试的直接消耗外,还包括其它的相关费用。能够决定需要做多少次测试的主要影响因素如下:

  ①、系统的目的

  系统的目的的差别在很大程度上影响所需要进行的测试的数量。那些可能产生严重后果的系统必须要进行更多的测试。一台在boeing 757上的系统应该比一个用于公共图书馆中检索资料的系统需要更多的测试。一个用来控制密封燃气管道的系统应该比一个与有毒爆炸物品无关的系统有更高的可信度。一个安全关键软件的开发组比一个游戏软件开发组要有苛刻得多的查找错误方面的要求。

  ②、潜在的用户数量

  一个系统的潜在用户数量也在很大程度上影响了测试必要性的程度。这主要是由于用户团体在经济方面的影响。一个在全世界范围内有几千个用户的系统肯定比一个只在办公室中运行的有两三个用户的系统需要更多的测试。如果不能使用的话,前一个系统的经济影响肯定比后一个系统大。除此而外,在分配处理错误的时候,所花的代价的差别也很大。如果在内部系统中发现了一个严重的错误,在处理错误的时候的费用就相对少一些,如果要处理一个遍布全世界的错误就需要花费相当大的财力和精力。

  ③、信息的价值

  在考虑测试的必要性时,还需要将系统中所包含的信息的价值考虑在内,一个支持许多家大银行或众多证券交易所的客户机/服务器系统中含有经济价值非常高的内容。很显然这一系统需要比一个支持鞋店的系统要进行更多的测试。这两个系统的用户都希望得到高质量、无错误的系统,但是前一种系统的影响比后一种要大得多。因此我们应该从经济方面考虑,投入与经济价值相对应的时间和金钱去进行测试。

  ④、开发机构

  一个没有标准和缺少经验的开发机构很可能开发出充满错误的系统。在一个建立了标准和有很多经验的开发机构中开发出来的系统中的错误不会很多,因此,对于不同的开发机构来说,所需要的测试的必要性也就截然的不同。

  然而,那些需要进行大幅度改善的机构反而不大可能认识到自身的弱点。那些需要更加严格的测试过程的机构往往是最不可能进行这一活动的,在许多情况下,机构的管理部门并不能真正地理解开发一个高质量的系统的好处。

  ⑤、测试的时机

  测试量会随时间的推移发生改变。在一个竟争很激烈的市场里,争取时间可能是制胜的关键,开始可能不会在测试上花多少时间,但几年后如果市场分配格局已经建立起来了,那么产品的质量就变得更重要了,测试量就要加大。测试量应该针对合适的目标进行调整。

  给软件带来错误的原因很多,具体地说,主要有如下几点:

  五、软件测试的心理学问题

  1、程序测试的过程具有破坏性

  人类的活动具有高度的目的性,建立适当的目标具有重要的心理作用。如果我们的目的是要证明程序中没有错误,那我们就会不自觉地朝这个方向去做;也就是说,我们会倾向于挑选那些使程序出错的可能性较小的测试数据。另一方面,如果我们的目标是要证明程序中有错,那就会选择一些易于发现程序所含错误的测试数据。而后一种态度会比前者给程序增添更多的价值。

  测试的定义意味着程序测试的过程是具有破坏性的,其程度甚至达到了不可容忍的地步。社会上大多数人的人生观是建设性的,而不是破坏性的。人们倾向于创造一个物品,而不是轻易毁坏?个物品。因此,

分类: 技术 标签:

软件测试基础知识

2008年9月21日 没有评论

软件测试基本概念

1、软件=程序+文档,软件测试=程序测试+文档测试。

“程序”是指能够实现某种功能的指令的集合,“文档”是指软件在开发、使用和维护过程中产生的图文集合。;

2、软件的分类

按功能分:系统软件、应用软件

按技术架构分:单机版软件、C/S结构软件(C是指客户端, S指服务器端)、B/S结构软件(B是指浏览器)

按照用户划分:产品软件、项目软件

按开发规模划分:小型、中型、大型

3、BUG的定义:软件的BUG指的是软件中(包括程序和文档)不符合用户需求的问题。常见的软件BUG分三种类型:完全没有实现的功能;基本实现了用户需求的功能;实现了用户不需要的功能。

4、测试环境=软件+网络+硬件。搭建环境:真实、干净、无毒、独立

5、软件环境的分类:软件开发环境软件生产运行环境

6、测试用例:指在测试执行之前设计的一套详细的测试方案,包括测试环境、测试步骤、测试数据和与其结果!测试用例=输入+输出+测试环境。测试用例有两个模板,word和excel,前者适合性能测试,后者适合功能测试。

 

软件测试分类

1、黑盒测试:指的是把被测的软件看作是一个黑盒子,我们不去关心盒子里面的结构是什么样子的,只关心软件的输入数据和输出结果

白盒测试:指的是把盒子盖 打开,去研究里面的源代码和程序结构。

2、静态测试:是指不实际运行被测软件,而只是静态的检查程序代码、界面或文档中可能存在的错误的过程。

动态测试:是指实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符的过程,所以我们判断一个测试属于动态测试还是静态测试,唯一的标准就是看是否运行程序。

注:同一个测试,既有可能属于黑盒测试,也有可能属于动态测试;既有可能属于静态测试,也有可能属于白盒测试。他们之间也有可能交叉。

3、单元测试:编译运行程序——静态测试——动态测试

集成测试:是单元测试的下一个阶段,是指将通过测试的单元模块组装成系统或子系统,再进行测试,重点测试不同模块的接口部分。

系统测试:指的是将整个软件系统看作1个整体进行测试,包括对功能、性能,以及软件所运行的软硬件环境进行测试。

验收测试:指的是在系统测试的后期,以用户测试为主,或有测试人员等质量保障人员共同参与的测试,它也是软件正式交给用户使用的最后一道工序.

          验收测试又分为α测试和β测试,其实α测试指的是由用户、测试人员、开发人员等共同参与的内部测试,而β测试指的是内侧后的公测,即完全交给最终用户测试。

4、功能测试:是黑盒测试的一方面,它检查实际软件的功能是否符合用户的需求。功能测试又可以细分为很多种:逻辑功能测试、界面测试、易用性测试、安装测试、兼容性测试等。

性能测试:软件的性能包括很多方面,主要有时间性能和空间性能两种。时间性能:主要指软件的一个具体事务的响应时间。空间性能:主要指软件运行时所消耗的系统资源。

         软件性能测试分为一般性能测试、稳定性测试、负载测试和压力测试。一般性能测试指的是让被测系统在正常的软硬件环境下运行,不向其十佳任何压力的性能测试。稳定性测试,也叫可靠性测试,是指连续运行内测系统,检查系统运行时的稳定程度。我们通常用MTBF(错误发生的平均时间间隔)来衡量系统的稳定性,越大稳定性越强。负载测试是性能测试的一种,通常是指让被测系统在其能忍受的眼里的极限范围之内连续运行,来测试系统的稳定性。压力测试是性能测试的一种,通常是指连续不断地给被测系统增加压力,直到将被测系统压垮为止,用来测试系统所能承受的最大压力。

         假设一个人很轻松的就能背一袋米,背两袋米很吃力,最多就能背三袋米,那么:

         一般性能测试:我就让他背一袋米

         稳定性测试:我让他背一袋米,但是让他去操场上跑圈,看多久累倒。

         负载测试:我让他背两袋米去操场上跑圈,看多久累倒。

         压力测试:我让他背两袋米,三袋米,四袋米……发现他最多就能背三袋米。

5、回归测试:是指对软件的新的版本测试时,重复执行上一个版本测试时的用例

冒烟测试:是指在对一个新版本进行西戎大规模的测试之前,先验证一下软件的基本功能是否可以实现,是否具备可测性

随机测试:是指测试中所有的输入数据都是都是随机生成的,其目的是模拟用户的真是操作,并发现一些边缘的错误。

6、关系

测试工程师

1、测试工程应该具备的基本职业素质:三心二意一能力。三心:细心、耐心、信心。二意:服务意识、团队意识。一能力:沟通能力。

2、如何成为一名优秀的测试工程师:内功(基础知识:计算机硬件、网络、操作系统、数据库等)、测试技术(黑盒测试中等价类、边界值、因果图等,白盒测试中的语句覆盖、分支覆盖、路径覆盖等)

1)、不断学习充电

2)、阅读原版书籍

3)、阅读缺陷管理系统中的缺陷报告

4)、阅读高手写的测试用例

5)、学习产品相关的业务知识

3、SQA——软件质量保障,CMM是SQA用来监督项目的一个标准质量模型,SQA按照CMM上面各种规则来检验各种各样的项目。CMM——能力成熟度模型

4、软件测试的原则:

1)、Zero bug——指的是软件没有任何bug,没有bug是不可能的,我们只能想方设法把软件的bug数控制在可以忍受的范围之内。Good enough——指的是只要软件达到一定的质量要求,就可以停止测试了。

2)、不要试图穷举测试

3)、开发人员不能既是运动员又是裁判员

4)、软件测试要尽早执行

5)、软件测试应该追溯需求

6)、缺陷的二八定理——缺陷的集群现象或是虫子窝现象

7)、缺陷具有免疫性

黑盒测试技术

等价类技术、边界值技术、因果图法、流程图法

缺陷管理

1、BUG的分类

Bug严重级别(Severity,Bug级别):是指因缺陷引起的故障对软件产品的影响程度。由测试人员指定。A
错误导致了死机、产品失败(“崩溃”)、系统悬挂无法操作;

B
功能未实现或导致一个特性不能运行并且不可能有替代方案(包括计算错误);

C
错误导致了一个特性不能运行但可有一个替代方案;

D
错误是表面化或微小的(提示信息不太准确友好、错别字、UI布局或罕见故障等),对功能几乎没有影响,产品及属性仍可使用;

E
建设性的意见或建议。

Bug优先

分类: 技术 标签:

XP正版验证补丁

2008年8月22日 没有评论

windows.genuine.advantage.validation.v1.7.59.1.crackedeth0.rar:
Click Here To Download

分类: 技术 标签:

HTML To TXT (Part 2)

2008年6月8日 没有评论

// 把所有&xxx的转义;所有<xxx>取消;其它照样返回
  function ConvertHTMLToken(const s:string;var inPre:boolean):string;
  var
    s0,s0_2,s0_3,s0_4:string;
  begin
    if s='' then
    begin
      result:='';
      exit;
    end;
    if s[1]='&' then
    begin
      s0:=lowerCase(s);
      result:='';
      if s0=' ' then result:=' '
      else if s0='"' then result:='"'
      else if s0='>' then result:='>'
      else if s0='<' then result:='<'
      else if s0='·' then result:='·'
      else if s0='™' then result:=' TM '
      else if s0='©' then result:='(c)'
      else if s0='®' then result:='(R)'
      else if s0='&amp' then result:='&';
    end
    else if s[1]='<' then
    begin
      s0:=lowerCase(s);
      s0_2:=copy(s0,1,2);
      s0_3:=copy(s0,1,3);
      s0_4:=copy(s0,1,4);
 
      result:='';
      // 将所有<hr>替换成为'——'
      if s0='<br>' then result:=CR
      else if s0_4='<pre' then   // <pre 一定要在 <p 之前判断!
           begin inPre:=true;result:=CR; end
      else if s0_2='<p' then result:=CR+CR
      else if s0_3='<hr' then result:=CR+MakeStr('-',40)+CR
      else if s0_3='<ol' then result:=CR
      else if s0_3='<ul' then result:=CR
      else if s0_3='<li' then result:='·'
      else if s0_4='</li' then result:=CR
      else if s0_4='</tr' then result:=CR
      else if s0='</td>' then result:=#9
      else if s0='<title>' then result:='《'
      else if s0='</title>' then result:='》'+CR+CR
      else if s0='</pre>' then inPre:=false
      else if copy(s0,1,6)='<table' then result:=CR
      else if MarkLinks and (s0[2]='a') then
           begin
             CurrLink:=GetLink(s);
             if CurrLink<>'' then result:='[';
           end
      else if MarkLinks and (s0='</a>') then
             if CurrLink<>'' then result:=format(' %s ]',[CurrLink]);
    end
    else if inPre then
      result:=s
    else // 不在<pre>..</pre>内,则删除所有CR
      result:=ReplaceStr(s,CR,'');
  end;

begin
  s0:=UnixToDos(HTMLText);
  result:='';
  InputLen:=length(s0);
  InputIdx:=1;
  inPre:=false;
  CurrLink:='';

  while InputIdx<=InputLen do
  begin
    NextToken:=GetNextToken(s0,InputIdx);

    // 去除<style …> — </style>之间的内容
    if lowercase(copy(NextToken,1,6))='<style' then
    begin
      while lowercase(NextToken)<>'</style>' do
      begin
        inc(InputIdx,length(NextToken));
        NextToken:=GetNextToken(s0,InputIdx);
      end;
      inc(InputIdx,length(NextToken));
      NextToken:=GetNextToken(s0,InputIdx);
    end;

    // 去除<Script …> — </Script>之间的内容
    if lowercase(copy(NextToken,1,7))='<script' then
    begin
      inc(InputIdx,length(NextToken));
      inQuot:=false;
      i:=InputIdx-1;
      while I<InputLen do
      begin
        inc(i);
        if s0[i]='"' then
        begin
          inQuot:=not inQuot;
          continue;
        end;
        if not inQuot then
          // 去除<script>段里的<!– … –>注释段, 99.8.2
          if copy(s0,i,4)='<!–' then
          begin
            HelpIdx:=pos('–>',copy(s0,i+4,MaxInt));
            if HelpIdx>0 then
            begin
     &
nbsp;        inc(i,4+HelpIdx+2);
            end
            else
            begin
              i:=InputLen;
              break;
            end;
          end;
          if lowercase(copy(s0,i,9))='</script>' then
          begin
            break;
          end;
      end;
      InputIdx:=i;
    end;

    NextToken:=GetNextToken(s0,InputIdx);
    inc(InputIdx,length(NextToken));
    result:=result+ConvertHTMLToken(NextToken,inPre);
  end;
end;

分类: 技术 标签:

HTML To TXT (Part 1)

2008年6月8日 没有评论

以下是大富翁cee写的一个实用函数,实现HTML到TXT格式的转换。
以下过程经过了几年的无数的测试,稳定性相当好。输出的结果也较美观。

function HtmlToTxt(const HTMLText:string;MarkLinks:boolean):string;
const
  CR=#13#10;
var
  NextToken,s0:string;
  i:integer;
  HelpIdx:integer;
  inQuot:boolean;        // 去除<script>段之用
  InputLen:integer;
  InputIdx:integer;      // 指向输入字符的下一个待处理字符
  inPre:boolean;         // 表示是否在<pre>…</pre>段内
  CurrLink:string;

  function MakeStr(C: Char; N: Integer): string;
  begin
    if N < 1 then Result := ''
    else begin
  {$IFNDEF WIN32}
      if N > 255 then N := 255;
  {$ENDIF WIN32}
      SetLength(Result, N);
      FillChar(Result[1], Length(Result), C);
    end;
  end;

  function NPos(const C: string; S: string; N: Integer): Integer;
  var
    I, P, K: Integer;
  begin
    Result := 0;
    K := 0;
    for I := 1 to N do begin
      P := Pos(C, S);
      Inc(K, P);
      if (I = N) and (P > 0) then begin
        Result := K;
        Exit;
      end;
      if P > 0 then Delete(S, 1, P)
      else Exit;
    end;
  end;

  function ReplaceStr(const S, Srch, Replace: string): string;
  var
    I: Integer;
    Source: string;
  begin
    Source := S;
    Result := '';
    repeat
      I := Pos(Srch, Source);
      if I > 0 then begin
        Result := Result + Copy(Source, 1, I – 1) + Replace;
        Source := Copy(Source, I + Length(Srch), MaxInt);
      end
      else Result := Result + Source;
    until I <= 0;
  end;

  function UnixToDos(const s:string):string;
  begin
    result:=AdjustLineBreaks(s);
  end;

  // 取得下一段字符串
  function GetNextToken(const s:string; const StartIdx:integer):string;
  var
    i:integer;
  begin
    if StartIdx>length(s) then
    begin
      result:='';
      exit;
    end;
    result:=s[StartIdx];
    if result='&' then
    begin
      for i:=StartIdx+1 to length(s) do
      begin
        if s[i] in ['&',' ',#13,'<'] then break;
        result:=result+s[i];
        if s[i]=';' then break;
      end;
    end
    else if result='<' then
    begin
      for i:=StartIdx+1 to length(s) do
      begin
        result:=result+s[i];
        if s[i]='>' then break;
      end;
    end
    else
    begin
      for i:=StartIdx+1 to length(s) do
        if s[i] in ['&','<'] then break
        else result:=result+s[i];
    end;
  end;
 
  // 输入:<a href="http://anjo.delphibbs.com">
  // 输出:http://anjo.delphibbs.com
  function GetLink(s:string):string;
  var
    LPos,RPos,LQuot,RQuot:integer;
  begin
     result:='';

    // 去掉'….<'
    LPos:=pos('<',s);
    if LPos=0 then exit;
    delete(s,1,LPos);
    s:=Trim(s);

    // 去掉'>….'
    RPos:=pos('>',s);
    if RPos=0 then exit;
    delete(s,RPos,MaxInt);

    if uppercase(copy(s,1,2))='A ' then
    begin
      LPos:=pos('HREF',uppercase(s));
      if LPos=0 then exit;

      LQuot:=NPos('"',s,1);
      RQuot:=NPos('"',s,2);

      if (LQuot<LPos) or (RQuot>RPos) then exit;

      // 开头带'#'的超链接,视为无效
      if s[LQuot+1]='#' then exit;

      // 开头带'javascript:'的超链接,也视为无效
      // 如:<div align=right><a href="javascript:window.close()"><IMG SRC="button_close.gif"></a></div>
      if copy(s,LQuot+1,11)='javascript:' then exit;

      result:=copy(s,LQuot+1,RQuot-LQuot-1);
    end;
  end;

分类: 技术 标签:

DBX2EML OE dbx文件分离软件 1.0

2008年6月5日 没有评论

DBX2EML是一个简单的工具,它可以从OUTLOOK EXPRESS的DBX文件中分离出EMAIL文件

当OE出现问题,有可能破坏DBX文件,这时可以使用本工具分离EML文件,修复重要的EMAIL电子邮件文件

DBX2EML 是一个自由免费软件,您可以任意使用或者分发,但是必须包含本文档.  

点此下载

分类: 技术 标签:

将邮件里面的联系人全部导出(for Winmail) 有缺陷,不过目的达到了

2008年4月16日 没有评论

Main 

Sub Main()
Dim fso, f1, ts, s
Const ForReading = 1
Set fso = CreateObject(“Scripting.FileSystemObject”)

Set f = fso.GetFolder(“C:\Users\海军\Desktop\JUNFAN”)
Set fc = f.Files

For Each f1 in fc
Set ts = fso.OpenTextFile(f1.name , ForReading)
  s = ts.ReadLine
do While  left(s,3)<>”To:” and ts.AtEndOfStream <> True
  s = ts.ReadLine
  ‘ts.Skipline 
loop

ts.Close
WriteFiles(s)
‘Msgbox(f1.name & s) 
Next

End Sub

Sub WriteFiles(T)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fso, f
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set f = fso.OpenTextFile(“out.txt”, ForAppending, True)
f.Write T
f.Writeline
f.Close
End Sub
============================
保存为.vbs结尾的文件,运行

分类: 技术 标签:

imageVue

2008年4月15日 没有评论

  安装要求:

  要运行imageVue,基本上只有一要求:你需要支持PHP的一台服务器。此外,为了能自动建立缩略/预览图像,你的服务器需要GD2扩展。

  如果你的服务器不支持GD2,你仍然能使用imageVue,但是你必须手工建立缩略图。 使用Macromedia fireworks和adobe Imageready的批处理功能可以很方便的做到(缩略图放在图片的同一目录,且名称前加tn_,即01.jpg的缩略图为tn_01.jpg)。

  功能介绍:

1、 自动生成缩略图 (需GD库)

2、 支持背景音乐,并有相当成熟的流出理能力。

3、 支持POPUP窗口,图片特写。

4、 动态预览窗口

5、 方向键控制

6、 幻灯片功能

7、 在线、本地管理功能

8、 支持语言文件编辑

9、 其中没有一样东西你不能改……

10、 推荐理由:经我多次测试,用ImageVue上传照片后,使用空间反而变为0,其他的文件使用无影响。如下图所示,此时我站已使用空间超过120M。(包括100M的图片,十几兆的音乐,还不算imageVue和LBS的程序。)因为使用imageVue上传的图片在服务器上不占自己的空间,所以在上传之后使用FTP软件删除时减去的是其他文件的,希望想要节省空间的朋友们一定要试啊!!!即使你不使用这个相册程序,也可以用它来“偷”  空间,那么省下的可都是银子啊!!!  

  ImageVue的使用提示:

  1、解开压缩包会看到三个目录,documentation是说明文档(英文),source是FLASH模板的源程序,upload才是主程序,所以只需在虚拟主机建立一个目录,例如photo,然后将压缩包中的upload目录里面的全部文件及目录上传就可以了。upload文件夹中包含一个test子文件夹,运行该文件夹中的index.php可以检测服务器环境(GDtest DIRtest Permissions PHPinfo ),看你的服务器对imageevue的支持度是否良好。该文件夹可以删除。

  2、图片是存放在content位置上的,你可以在上面建立多重目录,菜单会自动生成。文件夹和文件名中间不能带空格,否则无法显示。文件夹不要超过两层,否则显示有问题。原图片建议不要选择过大,要不然载入时间很长,但这也看你的服务器速度,如果快就放原图的好。要养成细分类的习惯,以便以后快速更新。(建议每次上传图片时数量不要超过5个,总大小不要超过1M)

  3、如果需要改变相册的标题,可以修改config.ini文件,将startheading = imageVue Gallery修改为startheading = 你相册的标题(要用英文哦!)

  4、如果你想菜单或提示的文字,可以修改lang.ini。但是它对中文的支持很不好,建议不要更改。

  5、如果想让相册更个性化点,可以替换load.jpg、loadblur.jpg、back.jpg,这三个文件分别是主体图片、动态的主题图片、背景图片。

  6、修改文件属性,把content的属性包括里面的文件都设置为777。

  7、建立管理员密码。你可以对不同的用户为ImageVue的管理设置不同密码。例如,你可以允许一个用户不受限制而其他的用户则被限制到只能访问an imagefolder 或者一个完整的groupfolder。

默认的用法:
$data['password'] = 'path/restriction/here/'; 
在记事本中打开passwords.php
$data['guest'] = 'guest'; 
$data['admin'] = 'content/'; 
  默认的设置包含两个密码,其中guest登录是一项特别的功能,仅仅允许该用户查看管理后台。而admin登录允许访问整个content/ folder。 

  你只要修改自己喜欢的密码。(注:修改admin,替换成你的密码,admin为默认密码,安装后要记得修改)

  强烈建议更改admin文件夹的名称,以提高安全性。因为进入后台的方法实在太简单了,只要输入密码,而输入guest竟然可以登陆,而修改admin下的password.php 也不是最好的方法,因为知道构造的人很容易下载此文件,用记事本就可以察看密码。

  8、配置ImageVue. 在记事本中打开config.ini,一般情况下用默认的就可以了。后台管理配置请修改adminconfig.ini 关于该文件,说明如下:

admin configuration list

mainheadtext = ImageVue Admin //设置管理界面的名称,它出现在左上方//

hidepassword = true //如果设置成true,输入密码时用***掩盖//

serverextension = php //设置服务器教本语言扩展//

extensions = jpg //设置何种格式的文件可以通过上传程序上传//

backgroundimage = back.jpg//设置管理界面左上角的背景图片//

guestlogininfo = true //在登陆处,允许或禁止显示告诉用户可以作为guest用户做限制访问的信息。
如果选择为true,意味着你愿意保留特殊的guest密码在你的password.php文档.如果设置为false,你将清除它//

foldersorting = dd //设置在主菜单输出分类文件夹的方式.影响图片文件夹和组文件夹.dd(时间降序) da(时间升序) na(名称升序) nd(名称降序) rnd(随机显示)

contentfolder = content/ //设置管理员编辑的内容文件夹.也可以通过URL设置。//

imagesorting = na //设置图片列表输出图片的方式。参数和foldersorting相同//

globalpath = //设置管理后台的相对地址或绝对地址//

dropcol = 000000,10 //设置主要内容(main content)的背景(backdrops)颜色和透明度//

startheading = sitename 相册标题

startimage = load.jpg 编辑初始Flash载入图像

swflayer = false 窗口内外挂Flash,填入swf相对路径,在察看图像时会消失。

startfx = true 调用内置的flash效果修饰主窗口,可选值:blur,true ,false

textcol = 34507A 菜单文本颜色

bgcol = EFEFEF 背景颜色

barcol = false 导航巴颜色,此处未定义,故为false

menucol = bgcol,textcol ,导航巴配色,此处设定值表示继承之前设定的颜色,也可选设值:false ,bgcol,textcol ,textcol,bgcol ,[HEX color,HEX color] (注意要设置两个Hex值对应文本和菜单颜色)

backimage = back.jpg ,网页窗口的背景图片

backalign = TL,背景图片对齐方式,可选值:TL (Top Left), T (Top) ,TR (Top Right) ,R (Right) ,BR (Bottom Right), B (Bottom), BL (Bottom Left) ,L (Left) ,M (Middle)

audiopath = mp3/ 设定mp3 播放目录

navigation = 1,1,1,1,1,0,0,导航栏的风格设定,7个值分别对应[nextbutton],[previousbutton],[thumbnails],[motion],[open in popup],[open in blank],[toggle sound FX],1代表yes,0代表no。

imagepopinfo = 1,1,0,0,0,1 鼠标悬浮图像是显示信息设定,六个值分别对应,[clickaction, imagename, imagedimensions, imagesize, imagedate, description]

popdispl
ay = 1,1,1,1,1,1,POPUP窗口的内容设定,可选值:[ containinswf, name, attributes, description, url, clickimageclose],建议全部选上。

  9、播放mp3音乐。ImageVue支持播放mp3音乐,可以在你一边欣赏图片的同时一边听着动听的歌曲。在ImageVue的安装目录下建立mp3文件夹,放入mp3就可以了。修改congfig.ini的audiopath属性还可以在浏览不同的图片文件夹时听不同的歌曲。

分类: 技术 标签: