7月 102016
 

  Java、Php等语言中都有成熟的框架来解析Json数据,可以让我们使用很少的代码就把格式化好的json数据转换成程序可识别的对象或者属性,同时delphi中也有这样的组件来实现此功能,即IsuperObject。如果还没有这个组件的请在网上搜索下载或者在下面留言处留下你的邮箱向本人索取。

  下面先说一下ISuperObject中几个常用的函数

  • function SO(const s: SOString = ‘{}’): ISuperObject; overload; 此函数传入json数据字符串,并返回一个ISuperObject对象,这一般是我们解析json时使用的第一个函数,如jObj := SO(jsonstr)。
  • property O[const path: SOString]: ISuperObject read GetO write PutO; default; 如:jobj.O[‘username’],此函数被一个ISuperObject对象调用,方括号内的字符串为json中的字段名称,返回一个ISuperObject对象。
  • property S[const path: SOString]: SOString read GetS write PutS; 此函数被一个ISuperObject对象调用,和O[‘username’]不同的是,它返回的是一个SoString,即一个字符串,使用方法 str := jObj.S[‘username’]; 同理的还有其他几个类似的函数,如I[‘age’]返回整数,B[‘isenable’]返回布尔型,A[‘users’]返回一个TSuperArray数组
  • AsString, AsBoolean, AsInteger,AsArray,ISuperObject的函数,用来把ISuperObject转换成相应的数据类型。

  下面我们看一个演示代码,json数据如下

  Delphi版本2010,代码如下:

点击下载源代码

2月 102015
 

uses RichEdit;

1. 设置RichEdit的行间距,代码如下

2. 为RichEdit设置行号,代码如下:

3. 根据鼠标位置定位光标的方法。

当RichEdit为可用状态时,是不用代码控制此操作的,TRichEdit本身就可以定位光标。但是当RichEdit开始不可用时,则此方法就可能用到了。本例中RichEdit1开始时是不可用的,当在ApplicationEvents1中接收到RichEdit1被双击时则设置RichEdit1的Enable := true;并且定位光标。

4. 使Richedit中的链接可以点击

 

 

12月 312014
 

方法一:

  定时调用GetForegroundWindow获取最前端的窗口句柄,然后判断该窗口宽度高度是否等于屏幕的宽度高度。代码如下,大家参考:

  这种方法真是弱啊弱,看看第二种方法吧

方法二:

  第二种方法是通过SHAppBarMessage函数给系统发送一个监听消息,用于监听一些关于AppBar的信息,该消息的第二个参数里有一个属性是用于指定回调消息的,程序中定义一个消息码用于监听。当传回的消息的wParam是ABN_FULLSCREENAPP 时判断lParam为真假来判断是进入全屏还是退出全屏。

 

8月 082014
 

在子窗口中重载CreateParams函数,并将WndParent设置为0即可,具体代码如下:

当我们把Params.WndParent设置为0时,Delphi在调用CreateWindowEx创建该窗口时,会将hWndParent 参数设置为相同的值(此处为0),为0则意味着要创建的窗口的所有者为桌面。此值不能在运行期通过Windows ApI改变,可能是因为窗口的拥有者不能在运行期改变的原因。

一些有用的链接

CreateWindowEx function

MFC子窗口和父窗口(SetParent,SetOwner)

7月 162014
 

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

 

5月 142014
 

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

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

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

DoMouseWheel的代码如下:

 

11月 062013
 

  在Delphi中下拉框条目的宽度总是和下拉框的宽度一样,当里面的项目太长时就不能显示全了。其实Windows提供了一个CB_SETDROPPEDWIDTH消息可能定义下拉框窗口的宽度,不知道为什么Delphi一直没有添加这个功能。使用方法很简单,如下:

  SendMessage(cboIndustry.Handle, CB_SETDROPPEDWIDTH, 200, 0);

  • 第一个参数是下拉框组件的句柄
  • 第二个参数是要发送的消息
  • 第三个参数是要设定的宽度
  • 第四个参数未使用