TClientDataSet小家碧玉,恐怕人人都喜欢使用。但是,都知道娶TClientDataSet是有代价的,因为你同时也得面对丈母娘MIDAS.DLL。  
   
    能不能使用TClientDataSet又不用MIDAS.DLL呢?  
   
    很简单,就是uses一下MidasLib单元!  
   
    MidasLib单元在Delphi6以及DELPHI的更高版本中才有,是Lib目录下的一个dcu文件。一旦在你的源程序中引用了MidasLib单元,程序运行时就不再需要MIDAS.DLL文件。  
   
    然而,编译后程序大小一定会增加200k以上,即使使用包编译模式。   
        
    当然,需要的时候才这样做。你的应用程序本身就包含多个DLL或BPL文件,就没有必要这样做。如果每个模块里都uses MidasLib,一定会累死你的,还是供养一个MIDAS.DLL好些。
posted @ 2011-12-19 17:30 毛小毛 阅读(31) 评论(0) 编辑

uses DateUtils;

function StartOfTheYear(const AValue: TDateTime): TDateTime;
function EndOfTheYear(const AValue: TDateTime): TDateTime;
function StartOfAYear(const AYear: Word): TDateTime;
function EndOfAYear(const AYear: Word): TDateTime;

function StartOfTheMonth(const AValue: TDateTime): TDateTime;
function EndOfTheMonth(const AValue: TDateTime): TDateTime;
function StartOfAMonth(const AYear, AMonth: Word): TDateTime;
function EndOfAMonth(const AYear, AMonth: Word): TDateTime;

function StartOfTheWeek(const AValue: TDateTime): TDateTime;           {ISO 8601}
function EndOfTheWeek(const AValue: TDateTime): TDateTime;             {ISO 8601}
function StartOfAWeek(const AYear, AWeekOfYear: Word;                  {ISO 8601}
   const ADayOfWeek: Word = 1): TDateTime;
function EndOfAWeek(const AYear, AWeekOfYear: Word;                    {ISO 8601}
   const ADayOfWeek: Word = 7): TDateTime;

posted @ 2011-10-20 13:34 毛小毛 阅读(42) 评论(0) 编辑

一个友好的用户界面,必须具有下拉菜单,弹出菜单,工具条和快捷键。同样一个功能,程序员可能要提供几种操作方式,如文本拷贝,菜单命令&Copy,快捷键Ctrl+C,工具条上的拷贝按钮,都是程序员提供给用户的操作,可以大大方便了不同层次的用户。但是,多增加一种操作方式,就意味着增加响应事件的代码,还有,实现统一功能的多个操作必须一致,如剪切板上不为空的时候,菜单命令,快捷键,按钮,都是可以选择的Enabled状态,而剪切板上没有内容时,这些构件的Enabled状态都为假。当然,如果不集中控制这些细节的话,实现相同功能的构件要一致,必须多增加代码,控制较为复杂。
Action就是将实现某个功能的细节统一管理起来,如Caption, Checked, Enabled, HelpContext, Hint, ImageIndex, ShortCt, Visible, onExecute等属性和事件。程序员设置Action属性的同时,还要实现执行Action的代码onExecute。定义了Action后,将其连接到一个菜单项,或者按钮上时,Action定义的属性和OnExecute事件,马上取代了原来的设置,并且建立了连接。通过这个连接,当Action的属性发生变化时,如Enabled发生变化,那么与之连接的构件属性都会自动更新;反过来,当构件对应的事件被执行时,Action的onExecute也被调用。
8.1.2 Action 和ActionList
Action是定义了最小的功能单位,使用它来在不同构件间,达到代码集中管理。表4-12定义了Action的一些属性:
ActionList是将多个Action统一管理的构件,在窗体设计阶段,使用它的弹出菜单,可以增减Action和定义Action的属性。它本身的属性Image连接了一个TImageList,指出它所包含的Action使用那个TImageList来定义ImageIndex。ActionLink是一个看不见的构件,但是它是负责构件和Action之间建立连接的。
表 4-12 Action属性和事件
属性和事件 具体功能
Caption 标题,可用于菜单项,ToolButton等。
Category 分类
Checked 设置选择状态,用于菜单项
Enabled 设置可用状态,用于与之连接的所有构件
HelpContext 帮助的索引项,用于与之相连的所有构件
Hint 智能感知,设置提示内容
ImageIndex 设置菜单项和按钮上的图片
Visible 指示与之连接的构件可否显示
ShortCut 设置菜单项的快捷键。
OnExecute 执行此Action的代码
OnHint 当被感知的构件显示Hint时调用的代码
OnUpdate 当Action更新构件的属性时调用的代码
////////////
我们先来认识TActionList。TActionList 是从TCustomAction中继承来的,由它管理定义好的Action,是程序员在对Action编程的接口。
新建一个工程文件,在主窗体上增加一个TActionList,一个TMemo,一个TImageList,几个按钮,几个菜单项。双击TActionlist,会出现它的编辑界面。再单击右键选择New standard action,显示出预定义的Action类别,属性Category是用来表明Action所属类别,我们可以根据需要选择具体的类别,如图4-10所示,我们引入了文件操作的一些标准Action。
这里所列的Action,大部分属性已经定义好了,就是说只要把他们添加到ActionList中,就可以使用。同样的,也可以新建Action,在Category属性中加上自己定义的名字,之后再添加新的Action 。
8.2.2 连接Action
定义了Action后,不与菜单项和按钮连接,是不能使用的,也没有达到程序功能集中实现和管理。使用对象观察器,看看我们刚刚选择的菜单项和按钮上是否有属性Action。
在这些构件的Action属性内,选择一个Action之后,构件本身的很多属性都随着Action定义的属性发生了变化,例如菜单项的Caption与Action的属性Caption就一致了,构件的属性Name和Tag是不随着改变的。连接后,Action的属性值被拷贝到所连接构件的相应属性上,这种连接是动态地,当Action的属性值发生变化时,自动更新所联系的构件。
注意:如果使用的是一个TToolButton 或着是菜单项,必须自己设置与它相联系的Images属性,虽然构件的ImageIndex属性已经动态的同Action相连接,但是属性Images并未自动连接。
继续本节的例子,通过设置菜单项和按钮的Action属性,完成Action的连接。
8.2.3 处理Action
处理Action的代码可放置在Action的onExecute事件,也可以集中放置在ActionList的onExecuteAction中,还可以更集中的放置在Application的onExecuteAction事件中。改变了以往每个构件都必须对应事件的做法,程序设计上更系统化。
在本节的例子中,编写某几个Action的onExecute方法。如FileOpenCmd的onExecute事件如下:
if OpenDialog.Execute then
Memo1.LoadFromFile(OpenDialog.FileName);
8.2.3 更新Action属性
Action的事件有OnExecute和OnUpdate,OnExecute事件在控制被触发时响应,比如说按钮被按下,菜单被按下,而OnUpdate事件是在应用程序空闲时被调用,用来更新Action的属性。ActionList 中也有OnUpdate, 可以用作设置菜单或者按钮的可选等属性使用。如下例,这个例子来自于$Delphi\Demos\RichEdit\Richedit.Dpr程序,有兴趣的读者可查看一下,以便更了解Action。
1 procedure TMainForm.ActionList2Update(Action: TBasicAction; var Handled: Boolean);
2 begin
3 EditCutCmd.Enabled := Editor.SelLength > 0;
4 EditCopyCmd.Enabled := EditCutCmd.Enabled;
5 if Editor.HandleAllocated then
6 begin
7 EditUndoCmd.Enabled := Editor.Perform(EM_CANUNDO, 0, 0) <> 0;
8 EditPasteCmd.Enabled := Editor.Perform(EM_CANPASTE, 0, 0) <> 0;
9 end;
10 end;
当应用程序空闲时,就执行这段代码,首先检查是否有被选定的文本,如果有则将Cut和Copy的Enabled属性设为True;当前控制是Editor时,设置Undo和Paste属性,Perfom是构件向自身发送消息的方法。
Delphi已经定义了一些标准的Action,这些Action实现的功能和VCL代码已经结合起来。所以,程序员可以直接使用,有些Action甚至不需要定义onExecute事件。如Cut,Copy,Paste等剪切板操作,Cancel,Delete,Edit,First,Insert,Last,Next,Prior,Post,Refresh等数据导航功能,Arrange,Cascade,Close,MinimizeAll,TileHorizontal等窗口排布功能。  

posted @ 2011-10-12 16:43 毛小毛 阅读(26) 评论(0) 编辑

class procedure TVTUpgrader.UpdateSelf(const FileName: TVTString);
var
  LBatchFile: TextFile;
  LBatchFileName: TVTString;
  LProcessInfo: TProcessInformation;
  LStartUpInfo: TStartupInfo;
begin
  //批处理文件名
  LBatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat';

  //打开文件,设置覆盖模式
  AssignFile(LBatchFile, LBatchFileName);
  Rewrite(LBatchFile);

  //写入批处理内容
  Writeln(LBatchFile, ':try');
  Writeln(LBatchFile, 'del "' + ParamStr(0) + '"');
  Writeln(LBatchFile, 'if exist "' + ParamStr(0) + '"' + ' goto try');
  Writeln(LBatchFile, 'copy "' + FileName + '" "' + ParamStr(0) + '"');
  Writeln(LBatchFile, 'del "' + FileName + '"');
  Writeln(LBatchFile, 'del %0');

  //关闭文件
  CloseFile(LBatchFile);

  //创建新进程运行批处理文件
  FillChar(LStartUpInfo, SizeOf(LStartUpInfo), $00);
  LStartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  LStartUpInfo.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(LBatchFileName), nil, nil, False,
    IDLE_PRIORITY_CLASS, nil, nil, LStartUpInfo, LProcessInfo) then
  begin
    CloseHandle(LProcessInfo.hThread);
    CloseHandle(LProcessInfo.hProcess);
  end;
end;

posted @ 2011-10-11 15:37 毛小毛 阅读(19) 评论(0) 编辑

原文标题:How to use transparent PNG icons with Delphi ImageList
原文:http://www.aha-soft.com/faq/delphi-imagelist-png.htm


Query: "Embarcadero Delphi ImageList does not show transparent PNG icons correctly. How to fix it?".

Solution: If you want to use 32-bit (24-bit + alpha channel) PNG icons within Delphi TImageList, you need to set the following property values for TImageList.

DrawingStyle: dsTransparent
ColorDepth: cd32Bit

posted @ 2011-09-28 10:23 毛小毛 阅读(135) 评论(0) 编辑
摘要: 安装RemObjects后打开Dephi报No RemObject server templates were found under \Templates\错误解决方法: 点击开始-运行,输入regedit.exe打开注册表,在HKEY_CURRENT_USER\Software下新建一个项,名为 RemObjects,在RemObjects下面再新建一个项,名为RemObjects SDK for Delphi,最后在RemObjects SDK for Delphi下面新建一个字符串值,名为InstallDir,值为D:\RemObjects\RemObjects SDK for Del阅读全文
posted @ 2011-09-14 18:09 毛小毛 阅读(24) 评论(0) 编辑
摘要: 在工程文件头加入 Windows引用在begin后加入SetThreadLocale( DWORD(Word(SORT_DEFAULT) shl 16) or DWORD(Word(SUBLANG_CHINESE_SIMPLIFIED) shl 10) or DWORD(Word(LANG_CHINESE)) );原理:设置程序的所在区域方法来自互联网,备忘~阅读全文
posted @ 2011-01-15 21:32 毛小毛 阅读(142) 评论(0) 编辑
摘要: 首先在下载的文件里你会找到一个文件,位置在Replacement BorlndMM DLL\Precompiled\for Delphi IDE\Performance\BorlndMM.dll,替换掉Delphi\Bin下的相应文件就可以完成对IDE的提速。 对自己编的程序的提速也非常简单,只要在.dpr工程文件里的uses部分加上FastMM4就可以了,但必须是加在第一位,还要记得设置 路径。重新编译你的程序就可以完成提速。一般情况下,感觉程序的启动速度会有提高。如果你的程序有内存泄漏的话那就会在程序关闭时弹出一个对话框告诉你你 的程序有内存泄漏,并指出相应的有内存泄漏的类。例如,我的程序阅读全文
posted @ 2010-12-30 13:26 毛小毛 阅读(811) 评论(0) 编辑
摘要: 对于一个网站来说,使用搜索引擎来进行站内搜索往往比自己编写的站内搜索更高效,并且不占用网站服务器的资源,下面是我搜集到的几个主要搜索引擎(Google和百度、雅虎)的站内搜索代码,使用时只需要将代码里的"www.williamlong.info"替换成你的网址即可。<!--Google站内搜索开始--><form method=get action="http://www.google.com/search"><input type=text name=q><input type=submit name=btnG value="Google 搜索"><input type=hidden nam阅读全文
posted @ 2010-12-30 13:09 毛小毛 阅读(34) 评论(0) 编辑
摘要: 告诉你一个最快的方法,用SQLServer连接DBF在SQLServer中执行SELECT * into bmkFROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="e:\share";User ID=Admin;Password=;Extended properties=dBase 5.0')...bmk这样就可以把e:\share中的bmk.dbf表导入到Sqlserver中,速度是最快的上面这个方法DBF文件必须在服务器上,如果DBF不在服务器上,就用连接串Provider=Microsoft.Jet.OLEDB.4.阅读全文
posted @ 2010-12-29 13:11 毛小毛 阅读(48) 评论(0) 编辑