自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

无常之语,无心之果(by 僵哥)

不语不为过,语而不诺实不诚

  • 博客(4)
  • 资源 (27)
  • 收藏
  • 关注

原创 关键字(非词)检测

//保留字序列 __declspec(thread) bool  ReservedTable[65536] = {0};//清除或设置保留字状态 void __fastcall SetAllReserved(bool Reserved = true){    for (int i = 0; i         ReservedTable[i] = Reserve

2008-11-20 20:11:00 1381

原创 Windows Resource File(.res)文件格式拆解(入门)

鄙人查当懒,望大家见谅。正好今天回复VB版的某贴子写了几行字,感觉有点用处,就记录下来虽然代码都是现成的,但是要改成VB,那也不是很简单的事情。如果你把所有的东西都弄完,粗粗估计也要半个月到一个月,而且还要求其中所有的技术访问都比较娴熟。 如果只是把资源数据的结构分解出来,倒不算难。MSDN(http://msdn.microsoft.com/en-us/library/ms648027(VS

2008-11-15 18:10:00 6358

原创 人民币中文大写转金额

 type  MoneyType = Currency; //这里可以是Double,但是浮点数存在误差,也可以是Currency,但是大小有限制 function ChineseCapital2Money(Capital:WideString): MoneyType;var  szNum:PWideChar;  Sign: MoneyType;  dblCur

2008-11-09 20:29:00 1883

原创 Delphi版金额大写(人民币大写读数)代码

 首先非常感觉xxaacc 发现了原来写的那份Delphi代码当中的问题(测试数据:1000100011.12).原来的代码是03年写的了,最初的代码也是用C++写的,然后转换成Delphi代码.当是发布以C++Builder,从而为了速度优化等,得到了tiegerium(/*唐秀观*/)支持,而得以完善.  uses        math;const  mnUn

2008-11-08 23:52:00 5444 1

Inno Setup 5.4 with CodeSign Support

1. 添加签名工具命令行,参数类似于: SignCode=$qSignTools\signtool.exe$q sign /f $qCerts\[Certificate].pfx$q -d $q[Software Name or Company]$q -du $q[http://www.mydomainhost.com]$q /t $qhttp://timestamp.comodoca.com/authenticode$q $f 其中[Certficate]请使用实际的数字证书文件名代替,[Software Name or Company]使用一个有用的提示信息或标签,比如软件的名称或公司的名称,[http://www.mydomainhost.com]使用公司或软件的网址 2.代码[Setup]节添加如:SignTool=SignCode,启用代码签名,此处如果没有其他配置则会对卸载程序和安装程序进行签名 3.[Files]节点当中对具体的文件添加“;SignCode: Yes ”启用对该文件(或文件组当中所列的文件,仅Window PE可执行文件或称程序文件)进行签名 4.可以参考附图,也可以参考帮助文件 5. 本程序根据官方5.4版本进行修改,主要是添加了对程序文件的签名,目的是在打包的时候可以很方便的一次性对所须文件进行签名,而省去麻烦

2010-11-04

Base64.dll(Base64编解码,附VB示例)

Base64编码和解码库,支持API调用和COM调用,输入参数支持VB的字节数组Byte(),输出支持VB的字节数组Byte()和字符串String。编码速度大约为每秒钟256MB~380MB。 内附一个比较三方提供的比较经典的库VBVorLib,其性能也相当不错。本程序库比之稍快,内附截图。 Public Declare Sub Encode Lib "Base64" (ByRef Dest() As Byte, ByRef Src() As Byte) Public Declare Sub EncodeToVBString Lib "Base64" (ByRef Dest As Any, ByRef Src() As Byte) Public Declare Sub EncodeToVaraint Lib "Base64" (ByRef Dest As Variant, ByRef Src() As Byte) Public Declare Sub EncodeWithEOL Lib "Base64" (ByRef Dest() As Byte, ByRef Src() As Byte) Public Declare Sub EncodeToVBStringWithEOL Lib "Base64" (ByRef Dest As Any, ByRef Src() As Byte) Public Declare Sub EncodeToVaraintWithEOL Lib "Base64" (ByRef Dest As Variant, ByRef Src() As Byte) Public Declare Sub Decode Lib "Base64" (ByRef Dest() As Byte, ByRef Src() As Byte) Public Declare Sub DecodeEx Lib "Base64" (ByRef Dest() As Byte, ByRef Src() As Byte) Public Declare Sub DecodeFromVBString Lib "Base64" (ByRef Dest() As Byte, ByRef Src As String) Public Declare Sub DecodeFromVBStringEx Lib "Base64" (ByRef Dest() As Byte, ByRef Src As String)

2010-10-17

Dell Latitude D630 BIOS A17(SLIC 2.1,支持Windows7)

Dell Latitude D630 的BIOS更新程序,通过修改官方的A17版本由SLIC2.0更新为SLIC2.1,安装之后,Dell OEM版本Windows7可以顺利激活。

2010-10-10

Indy10_Tiburon(SVN:4445) for C++Builder2007&C++Builder2010

参考贴子:http://topic.csdn.net/u/20100929/14/11329986-0714-488e-9a30-e6d3b60bd5bd.html

2010-10-10

为Windows平台浏览器注册自己的协议+跨进程参数传递

详细请参考http://topic.csdn.net/u/20090413/17/95324fd2-c830-44f3-af6f-7c98441eb641.html?seed=463571679

2009-04-14

MDAC Utility: Component Checker

来源:http://www.microsoft.com/downloads/details.aspx?FamilyID=8f0a8df6-4a21-4b43-bf53-14332ef092c9&displaylang=en&Hash=c5tFzN%2blL6R9cdiiknOWzEnHnOeoIpQWyS7Hi0KXFp3KbUl1tOlnlA9fMDaCtI3T32mggAqU533lZ7fzHKzvIw%3d%3d

2009-02-04

Delphi2009/C++Builder2009 Updates(SP1+SP2)

Codegear RAD Studio 2009 更新包

2008-12-22

Register COM DLL(注册DLL的API组件)

Delphi源代码,内附VB6动态注册DLL的DEMO

2008-12-21

SFTP Demo for Delphi

SFTP/SSH Demo for Delphi.

2008-12-11

Delphi6&2007&2009(Demo&Source)

Delphi6 Demo Delphi6 Source Delphi2007 Demo Delphi2007 Source Delphi2009 Demo Delphi2009 Source

2008-12-10

DCOM-Based Sharing Object between processes Demo In Delphi

Delphi版基于DCOM的进程间对象(内存)共享示例,希望对需要的朋友有所帮助。 测试办法: 1.先执行:注册.bat; 2.启动两个或多个SharedObject_Test.exe进程; 3.在某一个画面当中的Name输入一个名字,并设置Value,然后按下SetValue; 4.在其它进程当中输入同样的Name,然后按下GetValue 如果是用户(客户进程)量大,会导致启动多个服务进程的话,那么建议把服务进程配置是“交互式用户”,具体的操作,运行DCOMCNFG.exe,然后展开到DCOM,找出相应的DCOM组件(本例为:CoShareObject Object),然后右键,在弹出的菜单当中选择[属性],转到[标识]页,把运行该程序的用户配置为“交互式用户”(默认为“启动用户”) 单元补充: unit UnitManagedObject; interface uses Windows ; type TManagedObject = class(TObject) {Management Properties} private FManagementCount : Integer; //对象引用计数 public {structor} constructor Create; public {Management} procedure Free; function Attach:TManagedObject; function Detach: Integer; end; implementation {TManagedBaseObject} {structor} constructor TManagedObject.Create; begin Inherited Create; FManagementCount := 1; end; {Management} function TManagedObject.Attach : TManagedObject; begin Result := Nil; if InterlockedIncrement(FManagementCount) = 1 then begin InterlockedDecrement(FManagementCount); Exit; end; Result := self; end; function TManagedObject.Detach : Integer; begin Result := InterlockedDecrement(FManagementCount); end; procedure TManagedObject.Free; begin if Detach>0 then Exit; Inherited; end; end.

2008-11-30

[Doc] using ADO with Oracle In Delphi

using ADO with Oracle In Delphi MSWord Document

2008-11-28

CodeGear RAD 2007&2009 Runtime Library

CodeGear Rad 2007 and 2009 Runtime Library rtl120.bpl,vcl120.bpl,rtl100.bpl,vcl100.bpl

2008-11-18

制作资源DLL的示例

资源DLL示例,使用Microsoft Resource Compiler,较好的支持Unicode.

2008-11-17

BCB6Update4

Borland C++ Builder 6 Enterprise English Update4.

2008-11-06

Microsoft Make CAB Tools

Microsoft Make CAB Tools

2008-11-05

GBK与BIG5的转换工具DLL

一个通过查表方式完成转换的DLL,支持COM和API两种方式调用.内附Delphi和VB的Demo.

2008-11-05

RAD 2009 VCL Source

Delphi 2009 VCL Source,希望对某些朋友有所用处。

2008-10-28

Windows快捷方式文件的格式说明(英文版,PDF)

Windows快捷方式文件的格式说明(英文版) 希望对大家有用. (PS:据说现在可用分可以更换资源积分,就黑一点吧,哈哈)

2008-10-28

IOCP完成端口代码(C++Builder)

以前刚学习IOCP的时候用C++Builder写的代码,基本除了一些property之类的是C++Builder特有的以外,稍做修改也可以用到其它C++编译器上. 起始使用C++Builder6写的,后来有使用C++Builder2006及C++Builder2007重新编译过,所以基本这三个版本都可以很好地支持.其中代码几乎完全使用的API+vector. 仅供学习参考.

2008-10-28

基本Zlib的压缩/解压缩组件(同时支持API接口和COM接口

为方便VB应用的开发,特开发此组件.可以支持几乎所有VB当中的原生类型的压缩(需要通过Variant). 简单实例: Dim str As String Dim packed_bytes As Variant Dim unpacked_bytes As Variant str = "随便测试一个相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长的字符串" '压缩 packed_bytes = str 'StrConv(str, vbFromUnicode) MsgBox "压缩前字节数:" & LenB(packed_bytes) Call PackStream(packed_bytes) MsgBox "压缩后字节数:" & (UBound(packed_bytes) - LBound(packed_bytes) + 1) '解压缩 unpacked_bytes = packed_bytes MsgBox "解压缩前字节数:" & (UBound(unpacked_bytes) - LBound(unpacked_bytes) + 1) Call UnPackStream(unpacked_bytes) MsgBox "解压缩后字节数:" & LenB(unpacked_bytes) str = unpacked_bytes 'StrConv(unpacked_bytes, vbUnicode) MsgBox str

2008-10-23

基于Zlib的压缩/解压缩组件

Dim str As String Dim packed_bytes As Variant Dim unpacked_bytes As Variant str = "随便测试一个相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长的字符串" '压缩 packed_bytes = StrConv(str, vbFromUnicode) MsgBox "压缩前字节数:" & LenB(packed_bytes) Call PackStream(packed

2008-10-21

OverByte.ICS.WSocket.V6.RC1(SSL Enabled)

Overbyte 发布的Ics套件V6 Release Candidate 1版本,加入了SSL(OpenSSL)支持.

2008-08-27

Indy10.2.3.BCB2007

Last update 2008-07-23<br>2008-08-22,从http://indy.fulgan.com/ZIP/indy10.zip<br>下载,并增加C++Builder的Package.<br>安装时,只需要打开根目录下的Indy10.2.3_cb2007.groupproj(Delphi:Indy10.2.3_d2007.groupproj),<br>然后到菜单View下选择Project Manager(热键Ctrl+Alt+F11)<br>然后在Project Manager当中,对各bpl按顺序<br>IndySystem110.bpl,选中,右击,然后选择Build(在弹出的菜单当中按B键)<br>IndyCore110.bpl,选中,右击,然后选择Build(在弹出的菜单当中按B键)<br>dclIndyCore110.bpl,选中,右击,然后选择Install(在弹出的菜单当中按I键)<br>IndyProtocols110.bpl,选中,右击,然后选择Build(在弹出的菜单当中按B键)<br>dclIndyProtocols110.bpl,选中,右击,然后选择Install(在弹出的菜单当中按I键)<br><br>选择菜单Tools->Options...<br>Environment Options->C++ Options->Paths and Directories下面设置Include Path和Library Path.

2008-08-23

Delphi使用ADO连接池(存储过程示例)

一个使用ADO连接池的示例,演示了TADOStoredProc动态参数的使用,带重连机制 =================== unit UnitDemo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; //数据库服务器 gDBServer: String = '127.0.0.1'; //数据库名称 gDBName: String = 'master'; //数据库用户名 gDBUser: String = 'sa'; //密码 gDBPass: String = '2001'; implementation {$R *.dfm} uses ADODB, UnitADOConnectionPool; const CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+ 'as'#13#10+ 'select * from sysobjects where xtype=@type'#13#10+ 'return @@rowcount'; DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+ ' drop procedure TestMyPool'; var gPoolMan: TADOConnPoolMan = Nil; procedure TForm2.Button1Click(Sender: TObject); var ADOObject:TADOConnPoolObject; ADOStoredProc:TADOStoredProc; Running :Integer; I: Integer; begin //取得一个存储过程资源(含一数据库有效连接) ADOObject := gPoolMan.CreateSP('TestMyPool'); if ADOObject = Nil then //取得资源失败 Exit; try ADOStoredProc := ADOObject.ExecObject as TADOStoredProc; Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连 while Running>0 do begin Dec(Running); if ADOObject.NeedRefresh then begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连) if Not ADOObject.Reconnect then Exit; ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh; if ADOObject.NeedRefresh then Exit; end; for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do begin //========================= //传递参数 ADOStoredProc.Parameters.Items[I].Value := 'U'; //========================= end; if Running 0 then try //执行存储过程 ADOStoredProc.Open; //执行存储过程成功,退出循环进入后续的数据处理 break; except On E:Exception do begin //执行失败非程序级的异常通常有两种可能: //1.数据库连接断开 //2.自适合的参数传递当中可能存储过程已更新,参与不一致 //设置重连标志 ADOObject.NeedRefresh := True; //=================== //这里记录数据库操作失败日志 //=================== end; end; Exit; end; //========================== //从ADOStoredProc当中读取记录 ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value)); //========================== //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (****************BEGIN*******************) (*注:仅为测试准备 *) //初始化测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); ADOConn.Execute(CreateSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) //初始化连接池 gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true); end; procedure TForm2.FormDestroy(Sender: TObject); var ADOConn:TADOConnection; begin //释放连接池 if Assigned(gPoolMan) then gPoolMan.Free; (****************BEGIN*******************) (*注:仅为测试准备 *) //清理测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) end; end.

2008-03-26

线程安全日志记录器

(******************************************************************************)<br>(* 模 块 名: HSLogger4D.Pas *)<br>(* 别 名: 多任务线程安全日志接口-进程独立版 *)<br>(* 作 者: Unsigned(僵哥) *)<br>(* 说 明: 基于线程安全和文件缓存的单例多线程同步日志记录接口,本接口由一个 *)<br>(* Delphi版本的动态链接库来提供相应的功能,采用Delphi的 String 类型 *)<br>(* 传递参数,使用时请注意调用方式与Delphi一致,不建议使用于 Delphi *)<br>(* 以外的语言环境,由此所引发的后果,作者不承担任何责任 *)<br>(* 附带文件: HSLogger4D.DLL *)<br>(* 版 本 号: 1.1 *)<br>(* 创 建 于: 2007-07 *)<br>(* 备 注: 本接口属进程独立版不处理多进程间同步 *)<br>(* *)<br>(* 修改记录: 2007-07-13 创建最初版本 *)<br>(* 2007-07-14 修正多线程内存管理冲突 *)<br>(******************************************************************************)<br><br>unit HSLogger4D;<br><br>interface<br>uses<br> Windows;<br>(*********************************)<br>(* 功 能:记录日志 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:日志内容,自行控制换行符 *)<br>(* 参数3:记录日志后是否关闭文件 *)<br>(* (不会释放其它资源) *)<br>(* 返回值:0=成功,非0=LastError *)<br>(*********************************)<br>function WriteLogThreadsafe(<br> FileName : String;<br> LogString : String;<br> CloseFileAfterWrote : BOOL<br> ) : DWORD;overload;<br><br>function WriteLogThreadsafe(<br> FileName : String;<br> LogString : String<br> ) : DWORD;overload;<br>(*********************************)<br>(* 功 能:关闭日志文件 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:记录日志文件关闭后是否 *)<br>(* 释放其它相关资源 *)<br>(*********************************)<br>procedure CloseFile(<br> FileName : String;<br> FreeAfterClose : BOOL = true<br> );<br><br>(*********************************)<br>(* 功 能:关闭所有日志文件 *)<br>(* 参数1:记录日志文件关闭后是否 *)<br>(* 释放其它相关资源 *)<br>(*********************************)<br>procedure CloseAllFile(<br> FreeAfterClose : BOOL = false<br> );<br><br>(*********************************)<br>(* 功 能:强制缓存写入文件 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:写入文件后是否关闭文件 *)<br>(* (不会释放其它资源) *)<br>(* 返回值:0=失败,非0=成功 *)<br>(*********************************)<br>function FlushFileToDisk(<br> FileName : String;<br> CloseFileAfterFlush : BOOL = true<br> ) : BOOL;<br><br>(*********************************)<br>(* 功 能:强制缓存写入文件 *)<br>(* 参数1:写入文件后是否关闭文件 *)<br>(* (不会释放其它资源) *)<br>(*********************************)<br>procedure FlushAllFileToDisk(<br> CloseFileAfterFlush : BOOL = false<br> );<br><br>var<br> CloseFileAfterWrote:BOOL=false;<br><br>implementation<br><br>(******************************************************************************)<br>(* *)<br>(* <<日志接口定义>> *)<br>(* 注:请保持与源接口一致 *)<br>(******************************************************************************)<br>type<br> (*Logger Interface*)<br> ILogger=interface<br> ['{E43E419D-26AD-48e6-8097-19622CC2043E}']<br> function WriteLog(<br> FileName : String;<br> LogString : String;<br> CloseFileAfterWrote : BOOL = true<br> ) : DWORD;<br><br> procedure CloseFile(<br> FileName : String;<br> FreeAfterClose : BOOL = true<br> );<br><br> procedure CloseAllFile(<br> FreeAfterClose : BOOL = true<br> );<br><br> function FlushFileToDisk(<br> FileName : String;<br> CloseFileAfterFlush : BOOL = true<br> ) : BOOL;<br><br> procedure FlushAllFileToDisk(<br> CloseFileAfterFlush : BOOL = true<br> );<br> end;<br><br> (*Logger Import statement*)<br> function HSLoggerObject: ILogger; stdcall;<br> external 'HSLogger4D.dll'<br> name 'HSLoggerObject';<br><br>(*Write Log-String to file*)<br>(*********************************)<br>(* 功 能:记录日志 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:日志内容,自行控制换行符 *)<br>(* 参数3:记录日志后是否关闭文件 *)<br>(* (不会释放其它资源) *)<br>(*********************************)<br>function WriteLogThreadsafe(<br> FileName : String;<br> LogString : String;<br> CloseFileAfterWrote : BOOL<br> ) : DWORD;<br>begin<br> Result:=HSLoggerObject.WriteLog(<br> FileName,<br> LogString,<br> CloseFileAfterWrote<br> );<br>end;<br><br>function WriteLogThreadsafe(<br> FileName : String;<br> LogString : String<br> ) : DWORD;<br>begin<br> Result:=WriteLogThreadsafe(<br> FileName,<br> LogString,<br> CloseFileAfterWrote<br> );<br>end;<br><br>(*Close one Logfile,and free logfile-Object if FreeAfterClose was set to TRUE*)<br>(*********************************)<br>(* 功 能:关闭日志文件 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:记录日志文件关闭后是否 *)<br>(*********************************)<br>procedure CloseFile(<br> FileName : String;<br> FreeAfterClose : BOOL);<br>begin<br> HSLoggerObject.CloseFile(<br> FileName,<br> FreeAfterClose<br> );<br>end;<br><br>(*Close All Logfile,and free logfile-Object if FreeAfterClose was set to TRUE*)<br>(*********************************)<br>(* 功 能:关闭所有日志文件 *)<br>(* 参数1:记录日志文件关闭后是否 *)<br>(*********************************)<br>procedure CloseAllFile( FreeAfterClose : BOOL = false );<br>begin<br> HSLoggerObject.CloseAllFile(FreeAfterClose);<br>end;<br><br>(*********************************)<br>(* 功 能:强制缓存写入文件 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:写入文件后是否关闭文件 *)<br><br>(* 返回值:0=失败,非0=成功 *)<br>(*********************************)<br>function FlushFileToDisk( FileName : String;<br> CloseFileAfterFlush : BOOL<br> ) : BOOL;<br>begin<br> Result:=HSLoggerObject.FlushFileToDisk(<br> FileName,<br> CloseFileAfterFlush<br> );<br>end;<br><br>(*********************************)<br>(* 功 能:强制缓存写入文件 *)<br>(* 参数1:写入文件后是否关闭文件 *)<br>(*********************************)<br>procedure FlushAllFileToDisk( CloseFileAfterFlush : BOOL );<br>begin<br> HSLoggerObject.FlushAllFileToDisk(CloseFileAfterFlush);<br>end;<br>end.

2008-01-11

BDS2007授权文件

CodeGear RAD Studio 2007 Architect Trial<br>License File

2007-09-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除