Delphi获得与设置系统时间格式

在Delphi中,特别是在写管理系统软件时,经常要用到 FormatDateTime 以将 TDateTime 格式的日期时间转换成字符串形式的值显示或保存起来,或者用 StrToDateTime将字符串形式的日期时间转换成 TDateTime 然后再做其他操作。在进行时间或日期的转换时,会使用系统当前设定的时间日期格式。而如果时间日期格式与字符串中的表示方式不相符,会使转换过程 失败。例如当前短日期格式设定为'yyyy/MM/dd',而要转为 '2006-10-20'这样的字符串为日期,就会报错,说这不是一个有效的日期。

所以在进行转换前,要确保系统的日期时间格式与程序中使用的相符。一种方法是在安装时由安装程序设置,或者明确告诉用户必须设置成要求格式。另一种就是程序在启动时,自动设定为需要的格式,退出程序时再恢复原来的设置。

查看更多内容...

Posted in 软件开发 at February 24, 2014. by 傻猫 .    Views: 3580    No Comments

Delphi7自动以管理员身份运行程序

1.建立 res 文件

建立一个文本文件,名字可以自己起,如UAC.manifest,内容:

建立文本文件,名为 UAC.rc,内容:
1 24 UAC.manifest

编译成 uac.res 文件,运行:
brcc32 uac.rc -fouac.res

2.在代码中引入
打开项目文件,加入
{$R uac.res}

3.编译程序
这时程序就支持 VISTA 了,在运行的时候,会弹出 WINDOWS 的提示框,询问用户是否允许以管理员身份运行。

Posted in 软件开发 at January 27, 2014. by 傻猫 .    Views: 2123    No Comments

兼容各个操作系统,格式化系统日期

在实际工作中,遇到很多电脑的日期格式设置不一样,有些时间格式是“上午”或“下午”
还有一些电脑是PM,AM,长日期格式也不一样。

为此为了统一格式,我们把系统获得的日期和时间格式一下,统一为 yyyy-mm-dd hh:nn:ss 格式
mytime:=FormatDateTime('yyyy-mm-dd hh:nn:ss',qry_temp.FieldByName('CurrDateTime').AsDateTime);

Posted in 软件开发 at January 24, 2014. by 傻猫 .    Views: 1870    No Comments

DELPHI 获取本月的第一天和最后一天

USER :DateUtils
使用 StartOfTheMonth 和 EndOfTheMonth 函数获取即可;

procedure TForm1.btn1Click(Sender: TObject);
begin
mmo1.Lines.Add(FormatDateTime('yyyy-mm-dd',StartOfTheMonth(Now)));
mmo1.Lines.Add(FormatDateTime('yyyy-mm-dd',EndOfTheMonth(Now)));
//mmo1.Lines.Add(DateTimeToStr(StartOfTheMonth(Now)));
//mmo1.Lines.Add(DateTimeToStr(EndOfTheMonth(Now)));
end;

Posted in 软件开发 at January 5, 2014. by 傻猫 .    Views: 2040    No Comments

在FormShow事件中关闭一个Modal窗口

在窗体FormShow事件中进行条件判断,如果不符合条件时,showmessage显示消息,然后自动关闭窗口。

showmessage会触发一个modal事件,点确定后,再执行close是无法关闭窗口的,只能通过其它办法才行。

下面是一种通过消息传递的方法,可完美解决在formshow事件中关闭窗口。

private
{ Private declarations }
//定义一个用户消息
procedure test(var msg: TMessage);message WM_USER;

procedure TForm1.FormShow(Sender: TObject);
begin
//发送消息            
PostMessage(handle,WM_USER,0,0);
end;

procedure TForm1.test(var msg: TMessage);
begin
//在消息中关闭窗口
close;
end; 

Posted in 软件开发 at December 4, 2013. by 傻猫 .    Views: 2491    No Comments

给软件增加一个保护模块

以前搞过很多小软件,除了收费的软件做了保护模块,一般免费的软件,公司内部用的软件我都没有添加保护模块。

保护模块主要的作用是:对程序自身进行保护,防止别人修改或破解,如果发现程序被修改过就自动中止,最暴力的是程序发生自己被修改后就启动自毁模块,自己删除自己,哈哈。

常用的方法是加壳,以前还专门买了一套加壳软件Zprotect,不过现在这个软件基本已经销声敛迹了。我一般用aspack压缩一下资源,把程序变小一点,方便进行网络传输。

可以通过文件大小来进行判断是否被修改,当然这种方法相比比较简单,适合不加壳的软件,比较弱,修改字节也能保持文件大小不变,所以这种方法不能做到严格意义上的自我保护。

最近研究了一下,可以通过在线验证MD5值,每个程序的MD5指纹都不一样,只要修改过一个字节,MD5指纹就会发现变化,通过这样的思路来进行验证程序是否被修改。

查看更多内容...

Posted in 软件开发 at July 23, 2013. by 傻猫 .    Views: 3234    No Comments

只输入数字或字母

procedure TFrm_KhbNewView.edt_cl_mbqssKeyPress(Sender: TObject;  var Key: Char);
begin
   if not(key in['0'..'9',#8])then   //限制只输入数字
  begin
      key:=#0;
      MessageBeep(1);    //Beep; 调用系统声音也行!
  end;
end;

['a'..'z' ,'A'..'Z', #8]       限制只输入字母

 

Posted in 软件开发 at July 12, 2013. by 傻猫 .    Views: 3037    No Comments

Delphi之通过崩溃地址找出源代码的出错行

一 什么是MAP文件

      什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。

      如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:

      崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000

      为什么要这样做呢?我们得到的崩溃地址都是由 偏移地址+ 基地址得来的,所以在计算行号的时候要把基地址减去,一般情况下,基地址的值是 0x00400000 。另外,由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的,所以也必须减去 0x1000 。

二 Delphi 下生成MAP文件的方法 

        1.   project   ->   options   ->   Linker   ->   Map   file   选择detailed.  

三 例子

      代码

procedure TForm1.Button1Click(Sender: TObject);
var     
    I,   J:   Integer;
    p:   PChar;
begin
    I   :
=   10
;
    J   :
=   0
;
    p   :
=
   nil;
    p
^   :=   'A';   //   36行.  这里会报错

end;

     运行时会抱错

这里可以发现出错地址是:$00401A51

根据:      崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000

                                     =$00401A51 - $00400000 -$1000

                                    =$00000A51

用记事本打开生成的MAP文件
Line numbers 
for
 Unit1(Unit1.pas) segment .text

    
32 0001:00000A48    35 0001:00000A49     36 0001:00000A4E    37 0001
:00000A54
    
40 0001:00000A58    42 0001:00000A7D    43 0001:00000A8E    44 0001
:00000ABD
    
45 0001:00000AEE    49 0001:00000AF8    50 0001:00000B10    52 0001
:00000B44
    
52 0001
:00000B4B

那么,通过在MAP文件里查找小于或等于$00000A51的最大值就是,我们要得到的崩溃行偏移.

这样得到出错行在, Unit1单元的36行.  正好是这行:   p^   :=   'A';   //   36行.  

Posted in 软件开发 at June 26, 2013. by 傻猫 .    Views: 3035    No Comments