1.MessageDlg和ShowMessage都默认为ShowModal形式,即阻塞式的,它们运行后停止后台的工作,直到它们完成(关闭).但它们运行后,Timer控件仍在工作,当Timer调用Form中控件时会报错.
我的解决方法是重新声明的一个新的函数,在其中调用MessageDlg等,并在之前和之后分别加上Timer.Enabled:=False和Timer.Enabled:=True手动阻止Timer控件的运行.
2.如何检查本机中已安装字体
API函数原型:int EnumFonts(HDC hdc, LPCTSTR lpFaceName, FONTENUMPROC lpFontfunc, LPARAM lParam);
参数:
hdc:设备环境句柄。
LpFaceName:指向以/0结束的字符串的指针,该字符串指定所期望字体的字样名。如果此值为NULL,则EnumFonts随机选择并列举每个有效字样的一种字体。
LpFontFunc:指向应用程序定义的回调函数的指针。要得到更多的信息,参见EnumFontsProc。
:指向任何应用程序定义的数据的指针,这些数据和字体信息一起传给回调函数。
返回值:返回值是由函数返回的一个值。其含义为应用程序定义。
备注:用EnumFontFamiliesEx来代替EnumFonts。EnumFontFamiliesEx与EnumFonts的不同之处在于前者取得了与一种TrueType字体相联系的风格名。用EnumFontsFamiliesEx,可以取得关于字体风格的信息,这是用EnumFonts无法获得的。Windows CE:版本1.0只支持光栅字体。
Windows CE版本2.0支持那些使用TrueType字体和光栅字体其中之一的系统。字体类型(光栅或TrueType)是在系统设计时选择的,不能被应用程序修改。
delphi中
var ts:TStrings;
ts:=TStringList.Create;
ts:=Screen.Fonts; {TScreen类详情?}
在ts.Strings[i]存放的即为各种字体名
3.复制文件
可直接
CopyFile(PChar(源文件路径文件名),PChar(目标路径文件名),True); {绝对或相对路径皆可}
True时如文件已存在, 则返回false(失败)。 False时如文件存在,则覆盖,返回True。
也可用TFileStream方法读写文件。
4.窗口OnCreate事件中检查系统中是否存在相关字体,不存在则弹出字体安装对话框,点击yes安装字体,复制字体文件到系统Fonts目录,安装完成后Close关闭窗口。但Close无效果。总结:OnCreate中无法Close该窗口。(如不关闭窗口,窗口中的字体仍为未安装状态)
原因是OnCreate事件发生时,Form的constructor方法CreateNew,并没有真正的执行完毕。
一句话:OnCreate事件发生完毕后才执行WM_CREATE消息。
解决方法:改为Application.Terminate。