1.如何检查本机中已安装字体 2.MessageDlg与Timer冲突 3.复制文件

时间:2021-07-24 20:59:53

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。