大悟还俗

邮箱 key_ok@qq.com 我的收集 http://pan.baidu.com/share/home?uk=1177427271
  新随笔  :: 联系 :: 订阅 订阅  :: 管理

2013年10月18日

摘要: 添加四个控件TToolbarAlignment: alTopTSpeedButtonAlignment: alRightStyleLookUp: detailstoolbuttonMargin, Right: 5 (this is set in case you want to carry this UI over to iOS as well, to account for both bordered (iOS6) and non-bordered (iOS7) button sizesTListBox with several itemsEach of the fourlistboxite 阅读全文

posted @ 2013-10-18 18:04 大悟还俗_2 阅读(438) 评论(0) 推荐(0) 编辑

2013年10月17日

摘要: TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。TStringList 常用方法与属性:var List: TStringList; i: Integer;begin List := TStringList.Create; List.Add('Strings1'); {添加} List.Add('Strings2'); List.Exchange(0,1); {置换} List.Insert(0,'Strings3'); {插入} i := List.IndexOf('Strings1'); {... 阅读全文

posted @ 2013-10-17 14:54 大悟还俗_2 阅读(304) 评论(0) 推荐(0) 编辑

2013年10月11日

摘要: 1. 下载光盘镜像ftp://debian.ustc.edu.cn/debian-cd/7.1.0/amd64/iso-dvd/[2012.3.25]1.1去官网http://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/下载testing版,每周一个版本,刻盘。[2013.5.28]1.2 Debian 7.0 已经在今年5月初正式发布,可以到国内各大镜像下载:http://debian.ustc.edu.cn/debian-cd/7.0.0/amd64/iso-cd/http://debian.cn99.com/debian-c 阅读全文

posted @ 2013-10-11 10:29 大悟还俗_2 阅读(493) 评论(0) 推荐(0) 编辑

摘要: 第一步:到你netbeans安装目录下的etc目录下,找到netbeans.conf文件,打开准备编辑;第二步:在netbeans_default_options后面加上-J-Dawt.useSystemAAFontSettings=on,保存退出 阅读全文

posted @ 2013-10-11 10:28 大悟还俗_2 阅读(158) 评论(0) 推荐(0) 编辑

2013年10月10日

摘要: 操作方法:在RAD Studio XE5快捷方式上鼠标右击选择属性,在弹出的快捷方式标签页中将目标(T):"C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\bds.exe"后面加参数-np,即启动时候不显示Welcomepage标签页。修改后的RAD Studio XE5快捷方式"C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\bds.exe" -np修改后的Delphi XE5快捷方式"C:\Program Files 阅读全文

posted @ 2013-10-10 10:13 大悟还俗_2 阅读(271) 评论(0) 推荐(0) 编辑

2013年10月9日

摘要: Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)Insert Classselect N'张三',N'语文',78 union allselect N'张三',N'数学',87 union allselect N'张三',N'英语',82 union allselect N'张三',N'物理',90 union allselect N'李四',N' 阅读全文

posted @ 2013-10-09 17:57 大悟还俗_2 阅读(233) 评论(0) 推荐(0) 编辑

摘要: uses RichEdit;procedure RichEditSetBackColor( // 设置RichEdit文字背景色 mRichEdit: TRichEdit; // Rich编辑框 mBackColor: TColor // 背景色 ); var vCharFormat2: TCharFormat2; begin if not Assigned(mRichEdit) then Exit; FillChar(vCharFormat2, SizeOf(vCharFormat2), 0); vCharFormat2.cbSize := SizeOf(vCharF... 阅读全文

posted @ 2013-10-09 17:43 大悟还俗_2 阅读(655) 评论(0) 推荐(0) 编辑

摘要: uses RichEdit;function TextToRtf( // 将文本处理为RTF格式 mText: WideString // 输入文本): WideString; // 返回处理后的RTF文本var I: Integer;begin Result := StringReplace(mText, #13#10, #10, [rfReplaceAll]); for I := Length(mText) downto 1 do begin case mText[I] of '\': begin Delete(Result, I,... 阅读全文

posted @ 2013-10-09 17:39 大悟还俗_2 阅读(871) 评论(0) 推荐(0) 编辑

摘要: type TMenuHintWindow = class(THintWindow) private FTimerShow: TTimer; FTimerHide: TTimer; procedure TimerShowTimer(Sender: TObject); procedure TimerHideTimer(Sender: TObject); procedure ApplicationHint(Sender: TObject); public constructor Create(AOwner: TComponent); override; ... 阅读全文

posted @ 2013-10-09 17:36 大悟还俗_2 阅读(279) 评论(0) 推荐(0) 编辑

摘要: (*//标题:无限进制处理说明:使用于数学领域进制之间相互转换和计算设计:Zswang日期:2005-01-15支持:wjhu111@21cn.com//*) uses Math; const cScaleChar: array[0..35] of Char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; function StringToCharSet( //字符串集合 mString: string //源字符串): TSysCharSet; //返回字符串中包含的集合var I: Integer;begin Result := []; 阅读全文

posted @ 2013-10-09 17:35 大悟还俗_2 阅读(448) 评论(0) 推荐(0) 编辑

摘要: 今天有人问我:“用shell打开文件(显示桌面.scf)的方式还是用模拟键盘(Win+D)显示桌面”这应该有更好的方法,就搜了搜,关键字定位“ToggleDesktop”因为显示桌面.scf的内容是:[Shell]Command=2IconFile=explorer.exe,3[Taskbar]Command=ToggleDesktop找到了MSDNhttp://msdn.microsoft.com/en-us/library/bb774124(VS.85).aspx给出的是VB脚本和Javascript脚本,这个容易翻译:JavaScriptusesComObj;procedureTForm 阅读全文

posted @ 2013-10-09 17:33 大悟还俗_2 阅读(316) 评论(0) 推荐(0) 编辑

摘要: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, Grids; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private protected { Private declarations... 阅读全文

posted @ 2013-10-09 17:25 大悟还俗_2 阅读(348) 评论(0) 推荐(0) 编辑

摘要: 方法a.不使用Intent而是直接发短信.smsManager对应的Delphi代码应该是:uses Androidapi.JNI.JavaTypes,Androidapi.JNI.Telephony;var j: JSmsManager;begin j := tjsmsmanager.Create; j.sendTextMessage(stringtojstring('137114553XX'), nil, stringtojstring('测试短信'), nil, nil);end;至于双卡双待用哪个卡来发送这些我没有详细研究,有兴趣的朋友可以研究下.方法b 阅读全文

posted @ 2013-10-09 17:21 大悟还俗_2 阅读(363) 评论(0) 推荐(0) 编辑

摘要: This is the only code that changes between the first and second code snippets: dlg.ShowModal(procedure(ModalResult: TModalResult) begin if ModalResult = mrOK then // if OK was pressed and an item is selected, pick it if dlg.ListBox1.ItemIndex >= 0 then edit1.Text := dlg.List... 阅读全文

posted @ 2013-10-09 14:39 大悟还俗_2 阅读(672) 评论(0) 推荐(0) 编辑

摘要: procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var vPoint: TPoint;begin if Button mbRight then Exit; vPoint := Point(X, Y); X := SendMessage(RichEdit1.Handle, EM_CHARFROMPOS,0, Integer(@vPoint)) and $0000FFFF;// 得到鼠标点击字符位置 if (X >= R. 阅读全文

posted @ 2013-10-09 13:15 大悟还俗_2 阅读(391) 评论(0) 推荐(0) 编辑

摘要: //-------Delphi-------usesCommCtrl;procedureTForm1.Button1Click(Sender:TObject);varvHandle:THandle;vCount:Integer;I:Integer;vProcessID:THandle;vProcess:THandle;vNumberOfBytesRead:DWORD;vPointer:Pointer;vBuffer:array[0..255]ofChar;beginvHandle:=FindWindow('Shell_TrayWnd',nil);vHandle:=FindWin 阅读全文

posted @ 2013-10-09 13:09 大悟还俗_2 阅读(318) 评论(0) 推荐(0) 编辑

摘要: 主窗体unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,LongWaitTrd;type TForm1 = class(TForm) btnSetTask: TButton; btnExitThd: TButton; btnCreateTrd: TButton; procedure btnSetTaskClick(Sender: TObject); procedure btn... 阅读全文

posted @ 2013-10-09 13:05 大悟还俗_2 阅读(300) 评论(0) 推荐(0) 编辑

摘要: 在消息队列部分,我们已经知道消息泵是以线程为单位进行分离的!换句话说,有N个程序,都产生了相关事件,在系统消息队列中会根据线程来区分,当线程的消息泵从系统消息队列抽取消息时,会挑属于自己线程的消息。当我们创建一个工程时,IDE环境已经为我们生成了主线程的代码以及消息泵,而当我们自己创建一个Worker线程时,默认是没有消息泵的,如果想要在线程内接收消息,需要添加消息泵!消息泵的结构:whileGetMessage(Msg,0,0,0)dobegin TranslateMessage(Msg); DispatchMessage(Msg)end;另:要想在线程内响应消息,没有窗口是不行的所以要在线 阅读全文

posted @ 2013-10-09 13:02 大悟还俗_2 阅读(519) 评论(0) 推荐(0) 编辑

摘要: 在这里把网友常常搞不清楚的属性作用列出来:一、FreeOnTerminate用于表明线程执行完毕后是自动释放还是保留,默认为False二、Terminate该过程只是简单地设置线程类的Terminated标志,并不是真正的释放,这一点要格外注意!三、Synchronize该函数是同步方法,如果线程中有操作UI的语句时,需要把UI操作写成过程(无参数过程),放到该方法中!//这段代码是要用线程打印1-99,输出至Memo1中TThread1 = class(TThread) private FNum: Integer; procedure AddLines; protected ... 阅读全文

posted @ 2013-10-09 13:01 大悟还俗_2 阅读(221) 评论(0) 推荐(0) 编辑

摘要: 还是本着上篇文章的原则,只不过在Delphi中string有点特殊!先了解一下Delphi中的string1.string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节,变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起始于@Str[1],@Str[1]偏移负16个字节的空间存储着字串长度、引用计数等信息。字符序列以NULL结束。2.string[n] = ShortString = 短字符串,最多容纳255个字符,实际长度是字符长度+1,是Delphi的简单类型,Str[0]存储着字符的个数,第一个字符从Str[1]开 阅读全文

posted @ 2013-10-09 12:29 大悟还俗_2 阅读(409) 评论(0) 推荐(0) 编辑

摘要: delphi编写指定时间不动鼠标将系统锁定/以及在不动的情况下隐藏鼠标3秒种不动鼠标键盘看看效果。GetLastInputInfo:获取闲置时间;ShowCursor:设置鼠标状态unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); ... 阅读全文

posted @ 2013-10-09 12:29 大悟还俗_2 阅读(136) 评论(0) 推荐(0) 编辑

摘要: 首先强调一点:任何数据在内存中都是线性存储的,归根结底都是由一个字节数组表示的!如:Integer占4个存储单元,32bit,在内存中他就是由一个长度为4的字节数组来表示!只不过在读取该类型时,系统帮我们根据不同的数据类型对数据进行捆绑读取(如果上学时学过汇编就可以想出,如果自己取的话需要把高地址的内容乘以某值后再加上低址的值)。值得注意的是:对于Delphi中的多维动态数组,不要用类似于内存复制的函数进行复制,如CopyMemory,Move等。因为多维动态数组的内存是不连续的!只要把握住这一原则,我想类型转换我就不多讲了//Word与ByteArr的互转一、从ByteArr转为Word(I 阅读全文

posted @ 2013-10-09 12:28 大悟还俗_2 阅读(441) 评论(0) 推荐(0) 编辑

摘要: 问题1:一般来说,要让你的线程能够尽快终止,必须在Execute方法中在较短的时间内不断地检查Terminated标志,以便能及时地退出。这是设计线程代码的一个很重要的原则!在这种情况下使用上述思路一般不会出什么问题!type TThread1 = class(TThread) private procedure Test(); protected procedure Execute; override; end;procedure TThread1.Execute;var i:Integer;begin FreeOnTerminate := True;//线程正常结束... 阅读全文

posted @ 2013-10-09 12:28 大悟还俗_2 阅读(183) 评论(0) 推荐(0) 编辑

摘要: 前一篇文章讲到非队列消息会直接把消息Dispatch到窗口函数上,窗口函数长什么样?//就是一个大case分支//要想拦截消息,override窗口函数是一个办法!procedure TCustomForm.WndProc(var Message: TMessage);var FocusHandle: HWND; SaveIndex: Integer; MenuItem: TMenuItem; Canvas: TCanvas; DC: HDC;begin with Message do case Msg of WM_ACTIVATE, WM_SETFOCUS, WM... 阅读全文

posted @ 2013-10-09 12:27 大悟还俗_2 阅读(263) 评论(0) 推荐(0) 编辑

摘要: 前一篇文章介绍了为何要共用内存管理器,有人要问可不可以在编写dll时更通用一些,可以兼顾其它编译器(如果是其它编译器的话,Delphi写的dll不能与其它语言共用内存管理器),采用一定的策略来避免在dll内创建RTL自动管理的数据类型做参数或返回值,这样其它非Delphi的开发语言也可以用了!完全可以!一般的策略如下:1.在主调函数中申请一块空间2.把这个空间的地址传送给dll3.dll内部进行逻辑运算,得到结果后把值添到主调函数传递过来的空间上4.主调函数获取值,根据业务规则对空间进行处理(释放等操作)在整个工作周期中,申请的内存一直掌握在主调函数的手中,没有给dll任何管理对象的机会!看一 阅读全文

posted @ 2013-10-09 12:26 大悟还俗_2 阅读(433) 评论(0) 推荐(0) 编辑

摘要: 看了MSDN后,以下是我个人的理解!消息能够被分为「队列化消息」和「非队列化消息」。队列化消息是指当程序发生某事件时,由Windows主动捕获并把消息放入系统消息队列中,而程序在运行时会初始化一个消息泵,该消息泵用于抽取系统消息队列中的与之相关的消息,并把之分发到相应窗口函数上!非队列化消息不走消息泵,而是直接分发到相应的窗口函数上!队列化消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP消息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。队列化消息还包含时钟消息(WM_TIMER)、更 阅读全文

posted @ 2013-10-09 12:25 大悟还俗_2 阅读(326) 评论(0) 推荐(0) 编辑

摘要: 调用DLL中的函数可分为早绑定与晚绑定!早绑定是指在编译期就已经确定函数地址!晚绑定是指在运行期动态加载dll,并根据查表的方式获取dll内exports函数的地址,由于早绑定比较简单,在此不再讲述,主要说晚绑定!//晚绑定,也就是动态调用外部函数主要用以下三个命令: //LoadLibrary:获取 DLL //GetProcAddress:获取函数 //FreeLibrary:释放DLL例:type TFunctionName=function():boolean;stdcall;//定义函数类型 Function DynamicInvokeDllFunction: string; ... 阅读全文

posted @ 2013-10-09 12:13 大悟还俗_2 阅读(369) 评论(0) 推荐(0) 编辑

摘要: 问题描述:具体问题就是在隐式使用接口变量后,在FreeLibrary执行后,就会出现一个非法访址的错误。这个错误的原因就是在FreeLibrary后,DLL以的代码均为不可用状态,而在代码执行完整个过程后,VCL要对RTL类型的数据进行清理。而在清理过程中肯定要对接口进行减1并进行释放相关对象。而对象代码已从进程空间卸载,故报非法访址错误!解决方法:所以要想解决该问题,就应该把DLL调用过程放到一个单独的过程中,其目的就是让调用完毕后,让VCL来清理接口。清理完毕后返回后,再调用FreeLibrary来从进程空间中卸载DLL。错误调用代码为:var libHandle: THandle; .. 阅读全文

posted @ 2013-10-09 12:12 大悟还俗_2 阅读(823) 评论(0) 推荐(0) 编辑

摘要: Delphi创建DLL时,IDE自动生成的文档中写得很清楚,当在DLL中以动态数组或String做为参数或返回值时(即RTL自动维护的数据类型),请在每个工程文件的第一个单元加上ShareMem。这样就可以使宿主程序与DLL共享内存管理器了!这样的话,在发布程序时需要把borlndmm.DLL一同发布!问题1:为何要加到工程文件的第一个单元? 对于DLL和主程序这样的程序结构来说,使用2个内存管理器,在返回的数据类型为string的话,仅仅在主程序中将内存管理器中将引用数加1,而DLL的引用数不变,这样当退出DLL过程中,由于引用数为0,要对返回值进行释放,由于主程序中的数据为一个地址,将DL 阅读全文

posted @ 2013-10-09 12:12 大悟还俗_2 阅读(312) 评论(0) 推荐(0) 编辑

摘要: 相关背景:我们在做桌面级小程序时,一般的结构是:设计业务对象做工作线程写界面工作线程主要把业务对象给封装起来,处理时避免前台界面停止响应的情况。但有时业务对象会有异常,需要反应到前台界面上,这时,我们需要捕获一下线程的异常type TTrdExceptionDemo=class(TThread) private FException: Exception; procedure DoHandleException; protected procedure Execute; override; procedure HandleException; virtual... 阅读全文

posted @ 2013-10-09 12:06 大悟还俗_2 阅读(271) 评论(0) 推荐(0) 编辑

摘要: 在Delphi中,Inifiles单元中有一个TStringHash的类,不过它的Value仅支持Integer(其实也不是问题,有其它类型可以将变量变为Pointer),有点不舒服,今天没事做就把它替换为variant了,其中Key的名称大小写无关,就是为了加快开发速度!使用Hashtable,查找和删除复杂度都是常数级别的!type PPHashItem = ^PHashItem; PHashItem = ^THashItem; THashItem = record Next: PHashItem; Key: String; Value: Variant; end... 阅读全文

posted @ 2013-10-09 12:05 大悟还俗_2 阅读(861) 评论(0) 推荐(0) 编辑

摘要: 平时写程序时经常要把一些Key与Value保存起来,但一般数据量都不大,故不想用TStringHash来做。而用TStringList来做,还要写一个"=",挺别扭!而且数据类型还有限制。自己从VCL中找了一段,感觉挺好用的,以后用它玩一玩!不过对Key值的搜索采用遍历方式,数据量大就慢了,建议采用HashTable。注:Key与Value均不受数据类型限制!TLookupList = class(TObject) private FList: TList; public constructor Create; destructor Destroy; override; . 阅读全文

posted @ 2013-10-09 12:02 大悟还俗_2 阅读(321) 评论(0) 推荐(0) 编辑

摘要: //GetLastInputInfo是检测系统输入的,应用到某个程序中不合适!此问题有二种解法来监控输入消息:1.用线程级HOOK,钩上MOUSEHOOK与KEYBOARDHOOK2.在Application.OnMessage中做处理显然,用第2种方法比较方便!众所周知,键盘与鼠标消息都是队列消息,需要经过消息队列后经过一些处理,再发往各个WNDPROC。基于这个原理,我们可以在ONMESSAGE中做一下消息处理,即先声明全局变量,用于保存上次输入动作的时间,而后用时间控件来进行定时扫描,用GetTickCount来判断是否超时。unit Unit1;interfaceuses Windo. 阅读全文

posted @ 2013-10-09 12:00 大悟还俗_2 阅读(265) 评论(0) 推荐(0) 编辑

摘要: unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, DB, ADODB;type PNodeInfoEx = ^TNodeInfoEx; TNodeInfoEx = Packed Record NodeID : Integer; ParentID : Integer; NodeType : Integer; ChnNodeTitle ... 阅读全文

posted @ 2013-10-09 11:59 大悟还俗_2 阅读(300) 评论(0) 推荐(0) 编辑

摘要: //unit UntService;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, DB, ADODB,Registry,ActiveX;type TService2 = class(TService) con1: TADOConnection; procedure ServiceExecute(Sender: TService); procedure ServiceAfterInstall(Sender: TService); pro... 阅读全文

posted @ 2013-10-09 11:58 大悟还俗_2 阅读(444) 评论(0) 推荐(0) 编辑

摘要: 需求:由于某种原因,需要根据管理员设定的时间定时关闭服务器上的COM+程序以及Windows Service程序。任务:任务就是做一个Windows Service,这个Service要有一个配置窗体(该窗体可通过HotKey呼出窗体或在服务启动时把配置窗体放到系统托盘中),用于管理员配置所要关闭的服务条目以及关闭时间。关键点:1.要设置允许服务与桌面进行交互2.定时(不想用Timer)3.关闭相关程序定时功能刚才调试了一下,已经实现!实现的方法就是在服务中创建一个线程,以管理员设置的Interval做为阻塞时间步骤1:先创建线程uses Classes,SyncObjs,Dialogs,S. 阅读全文

posted @ 2013-10-09 11:55 大悟还俗_2 阅读(287) 评论(0) 推荐(0) 编辑

摘要: //第1种方法procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);begin if ActiveControl = ComboBox1 then Handled := True;end;//第2种方法(了解该方法后,以后会有助于我们处理更复杂的问题)unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Cl... 阅读全文

posted @ 2013-10-09 11:54 大悟还俗_2 阅读(837) 评论(0) 推荐(0) 编辑

摘要: 这种模式如果不用面向对象的思想的话,也就是case Type of 1:doCreditCardPayment(); 2:doCheckPayment()end;然后在doCreditCardPayment中复制一段其它支付方式的代码拷到这个过程中,就搞定了!但以后如果需要新增加一种付款方式的话,您必须要打开程序,添加某过程,编译。然后进行整体业务流程的测试。往往程序员在修改主系统时会很头痛的,说不定改了哪部分会导致整体程序出问题。基于上述原因,我们在想,能不能在不修改主系统的前提下加上这个功能?我们一般是这样做:1.先在主系统做一个基类,类似于下述的TPayment,把付款业务的共同代码出来 阅读全文

posted @ 2013-10-09 11:53 大悟还俗_2 阅读(275) 评论(0) 推荐(0) 编辑

摘要: 要想跨进程访问DBGRID,貌似只能用HOOK,写一个DLL想办法注入到目标进程。注入成功后,使DLL与目标进程在同一进程空间中(其内有一些细节问题,请参见代码),这时可以访问目标进程的VCL组件。并把VCL组件的数据通过进程通信的方式发给Sniffer进程。如何进行注入? 可以安装一个WH_CALLWNDPROC钩子,这样当有消息在窗口函数中时,系统就会装载HOOK,即执行DLL部分。如何发消息? 可以在DLL中设置一个自定义消息,在安装完钩子后,发送一个自定义消息至目标进程的窗口函数。以下实例可读出另一进程的EDIT、LABEL、DBGRID等控件的值。如何了解这个原理,跨进程读取Stri 阅读全文

posted @ 2013-10-09 11:49 大悟还俗_2 阅读(965) 评论(1) 推荐(0) 编辑

摘要: 1.利用SQL的Exec()来计算2.利用JavaScript来计算3.利用逆波兰式来计算(比较复杂)这里用JavaScript来实现uses ComObj;function TForm1.DoCaculate(exp: string): string;var script: Variant;begin script := CreateOleObject('ScriptControl'); script.Language := 'JavaScript'; Result := script.Eval(Exp);end;procedure TForm1.btn1Cl 阅读全文

posted @ 2013-10-09 11:40 大悟还俗_2 阅读(265) 评论(0) 推荐(0) 编辑