bcoder

7月 242014
 

  很久没用Eclipse了,今天打开的时候,突然报Android开发插件需要更新。打开插件管理页面,更新Android插件,又提示和旧版本有冲突,心想只能卸载了重新安装了。找了半天没找到在哪下载,把Eclipse目录下的plugins目录下和android相关的都删除了,还是不能更新,后来又把features目录下和android中的jar包都删除了,还是不行。经过在网上一番搜索,终于找到在哪卸载了,对Eclipse的友好性真是……

  下面说一下详细的步骤吧

  1. 打开菜单help->Install New Software…

  2. 点击窗口中正文选项里的蓝色already installed标签

  3. 选中要卸载的插件,然后点击Uninstall按钮(里面除了Eclipse IDE for Java EE Development外都是Android for Eclipse的插件)

  4. 这时会弹出一个确认窗口,点击Finish按钮,Eclipse就开始删除插件了,删除完成后会弹出一个提示窗口提示是否要重新启动Eclipse

7月 162014
 

在TRichEdit的Scrollbars属性为ssNone时,RichEdit中的内容超出边框大小时,翻动鼠标上下滚轮时,内容是不会自动滚动的。需要写代码实现此功能,主要是在RichEdit1MouseWheelUp和RichEdit1MouseWheelDown中发送消息实现,具体代码如下:

 

7月 152014
 

union all对于重复的数据也会提取出来

union 不会提取重复的数据

一个sql语句可以有多个union或者union all连接

如果要对连接表中的字段排序,把union的表当成一个子表来操作,如下:

 

7月 122014
 

在PAYPAL帐户中添加自己的香港招行“香港一卡通”,需要填写以下信息:

(1)Name on account(帐户名称):收款人名字,英文、中文?

(2) Bank Name(银行名称):填写“CHINA MERCHANTS BANK HONG KONG BRANCH”;

(3) Account Type(帐户类型):选择“Checking(支票收款)”;

(4) Bank Code(银行代码):238,又叫CHATS CODE;

(5) Branch Location(分行地址):21F,12 HARCOURT ROAD CENTRAL

(6) Branch Code(分行代码):填写“860”这三位固定代码(即卡号中间的那三位);

(7) Account Number(帐户号码):填写你自己卡号的最后7位数字(即860之后的7位);

(7) Re-Enter Account Number(重复帐户号码):再次输入上面输入的7位收款帐号。

附截图:

paypal添加招商银行香港一卡通

其他信息:

1、招商銀行香港分行SWIFT CODE: CMBCHKHH

2、招商银行卡BIN号

信用卡:431988、356889、439225、439226、439227、518710、518718、622575、622576、622578、479229、479228、552534、552587、622581、622582、622577、521302、628362、356890、370285、370287、370289
借记卡:8位卡、955550、622580、622588、622609、621286、468203、512425、410062、524011、621483、621485、621486、621299

7月 092014
 

  对于一些非多文档类的程序,我们只想让用户打开一个程序的实例,当用户再次点击图标的时候只需将原来运行的程序界面打开即可。那么如何实现这种功能呢?首先,要实现进程的单实例运行,我们可以用互斥对象实现,互斥对象即在系统层上只能创建一个这样标识的对象,当第二个此标识的互斥对象创建时将会返回一个已存在的标志。

  单实例运行实现后,我们还要通过消息实现打开前面已经打开的窗口,我们可以用EnumWindows函数来遍例所有窗口以找到已打开窗口的句柄,并通过ShowWindow函数或者自定义消息来激活那个窗口。具体的代码如下:

 

 

6月 272014
 

在Delphi7中,使用TAdoQuery读取sybase中的数据,发现在读取numeric字段时,本来存储的是负数值,但tadoquery读出后为正数。

select workdays from workinfo

后来gg了一下,发现这是delphi的一个bug,用Delphi 2010写了一小工具,发现读取不会出现负数为正的情况,说明在后来的delphi版本中修正了此错误。跟踪代码时发现在adodb.pas中的GetFieldData函数中的子函数VarToBuffer中,delphi 2010和delphi 7有所区别,具体代码片断如下:

ftAutoInc, ftInteger:
Integer(Buffer^) := lVal;

将adodb.pas文件拷贝到工程目录下,并将delphi 2010中的此行代码拷贝到这个文件中,发现问题确实解决了,但是修改delphi的源文件还是容易为以后的开发带来隐患,所以还需要其他的办法来解决此问题。

既然是读取numeric字段会报错,那么我们可以想办法把这个字段动态的改变为其他的类型,在sql语句中通过一些数学运算即可改变,最简单的就是跟这个字段除以1(乘以1不会改变),所以最简单的解决办法就是如下更改sql语句:

select workdays / 1 as workdays from workinfo

这样就轻松解决了问题,如果大家遇到类似的问题也可以考虑这种办法来解决问题。

6月 192014
 

1. 点击“开始-》控制面板-》管理员工具”,打开Internet 信息服务(IIS)管理器

2. 在左侧的树形列表中的“网站”上右键,选择“添加FTP站点”

3. 输入要添加的FTP站点的名字,并选择FTP站点所在的物理路径,点击“下一步”继续

4. 勾选自动启动FTP服务器,系统启动时会自动 运行FTP服务器。SSL的选项根据自己需要进行选择,建议选择“允许”使用SSL

5. 身份验证选择“基本”,授权可以选择给所有用户授权,或者授权给指定用户,这里没有特殊的需求,选择的是“所有用户”,这里最好不要选择“未选定”。权限根据自己的需要设置。

 

 Posted by on 2014-06-19
6月 092014
 

Windows服务作为Windows提供的一种特殊应用程序,拥有下面优点:

1. 随系统启动而启动,不需要用户手动执行,适合做后台检测程序等
2. 不用登录系统即可运行
3. 在后台运行,不与Windows桌面相互影响
4. 拥有System权限,在任务管理器中无法结束运行

Windows不建议在服务程序中与桌面有交互,在Windows Xp及以前的版本Windows服务和用户桌面还运行在一个session下,所以服务程序还可以比较轻松的与桌面进行交互。但是自Windows Vista及以后的系统中,服务程序是运行于session0中,而第一个启动的用户则运行于session1中,要想在服务中显示桌面或者与桌面程序交互要使用很复杂的技术,甚至用CreateProcess和ShellExecute启动的应用程序都无法在用户桌面中显示。

一、在Delphi中创建Windows服务程序

Delphi中提供了创建Windows服务的程序框架,生成Windows服务工程的具体方法如下,点击菜单File->New->Other,在里面寻找Service Application项目,点击OK按钮生成即可。这里会生成一个带界面的TService1类。选中TService1界面,下面介绍一下TService的相关属性和事件。

TService属性:

  • AllowPause: 是否允许暂停
  • AllowStop: 是否允许停止
  • Dependencies: 设置该服务与其他服务的依赖关系
  • DisplayName: 在Windows服务管理器中显示的名称(注意:不是服务名)
  • Name: 服务名称,使用/install参数安装时安装的服务名为此属性值
  • Interactive: 是否要与桌面进行交互
  • StartType: 服务的启动方式
  • ServiceStartName: 设定用于启动服务的用户名

TService事件:

1. procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
在该服务启动的时候调用OnStart事件,参数Started的默认为True,所以不用在该事件中再设置Started := True; 在此事件中如果判断某些条件不允许服务运行,则可以将Started置为False,这样服务将会不再启动。
2. procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
在该服务被停止的时候调用OnStop事件,Stopped的默认为True,在此事件中如果判断某些条件不允许服务停止则可将Stopped置为False来防止服务被停止。
3. procedure TService1.ServiceExecute(Sender: TService);
服务的主体执行部分,需要将服务的主要功能实现代码放在此事件中,此过程执行完毕后服务将会自动停止,所以一般在此事件中要写类似如下代码:

4.procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
在服务被暂停时调用的事件,Paused的含义类似ServiceStart事件中的Started.
5. procedure TService1.ServiceContinue(Sender: TService; var Continued: Boolean);
服务被暂停后重新启动继续执行时调用的事件,Continued的含义类似ServiceStart事件中的Started

经过简单的点击后,一个最基本的Windows服务程序已经编写完成了,编译工程,将会生成一个exe程序,本例中生成一个ServiceTest.exe。
打开命令行窗口,将目录定位到工程的输出目录,输入ServiceTest.exe /install并执行,刚才编写的服务就安装到系统中了。
卸载服务时使用ServiceTest.exe /unstall
可以在命令行后面加/silent参数,使其不弹出安装、卸载成功的提示框。
注意:使用/install这种方式安装时,服务的名字是服务窗口的类名,不是DisplayName,服务管理器中显示的是DisplayName
也可使用Windows自带的sc命令来创建或者删除服务,创建的示例代码如下:

二、一些很有用的管理服务的函数

调用方法:

{启动服务} StartServices(服务名);
{停止服务} StopServices(服务名);
{新建服务} CreateServices(服务名,exe文件路径);
{删除服务} DeleteServices(服务名);
{获取服务状态} string:=QueryServiceStatu(服务名);

注意这里的服务名是Service类的名称,不是DisplayName

三、Delphi中编写Windows服务的注意事项

1. 尽量避免使用ShowMessage等直接进行调试,容易造成服务无法响应等问题。
2. 停止服务时提示”Windows无法停止 xxx 服务(位于 本地计算机 上)” ,则可能是OnStop事件结束时将Stopped设置成了False或者OnExecute事件不能结束或者OnExecute与界面进行了不正确的交互。
3. Windows Vista及上版本的系统中不再支持服务中显示窗口,所以在这些版本的系统上,如果需要显示窗口,则要另外创建一个窗口程序,并与之用消息通讯以显示窗口。

四、一些有用的链接

Subverting Vista UAC in Both 32 and 64 bit Architectures
http://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-and-bit-Archite

如何在Windows Service里面运行程序
http://blog.sina.com.cn/s/blog_5f8817250100vooy.html

5月 142014
 

当我们需要响应鼠标滚轮效果的时候,我们需要在Form的FormMouseWheel、FormMouseWheelDown、FormMouseWheelUp事件中进行处理。如下面的代码:

但是在实际运行中我们发现,每次滚轮后Edit1的顶部位置往上或下移动了两次,这是因为TControl的DoMouseWheel调用了该事件,如果该事件中Handled返回值为true,则DoMouseWheel将认为该事件处理完毕,不在执行后边的代码,如果返回false则继续执行后面的代码。

所以如果要避免这几个事件执行多次,在执行完你要执行的操作后,返回Handled := True;即可。如下:

DoMouseWheel的代码如下:

 

3月 302014
 

先在要调试的代码前边的灰色条上点一下,当代码这行变成红色背景时说明断点已经打上了
然后在上面的工具栏中点击绿三角右边的那个带刺的e按钮,这个按钮是以调试模式运行应用
这样就可以了,当代码运行到你设置的断点的时候,就会暂停,这时你就可以开始调试你的代码了

A220C055-FCAE-4FFB-812F-41932236B419

调试app