sina.com.cn
新浪首页|免费邮件|用户注册|网站地图

科技时代

新浪首页 > 科技时代 > 软件 > 编程语言 > 正文
软件分类教程

● 系统工具
● 网络工具
● 常用工具
● 多媒体类
● 图像处理
● 文字编辑
● 休闲娱乐
● 办公软件
● 编程语言
● 操作系统
● 其它软件
● 软件评测
● 主页制作
● 观点评论





Delphi 应用编程实例简介

http://tech.sina.com.cn 2000/05/23  软件世界 许亮

  1. 控制INI文件几法

  要利用.INI文件做程序有关数据的存储工作,就需要能读和写.INI文件,所以列了如下方法给大家参考:

  从.INI文件中获取字符串

  var

  strResult:pchar;

  begin

  GetPrivateProfileString(

  'windows', // []中标题的名字

  'NullPort', // =号前的名字

  'NIL', // 如果没有找到字符串时,返回的默认值

  strResult, //存放取得字符

  100, //取得字符的允许最大长度

  'c:\forwin95\win.ini' // 调用的文件名

  );

  edit1.text:=strResult; //显示取得字符串

  从.INI文件中获取整数

  edit1.text:=inttostr(GetPrivateProfileInt(

  'intl', // []中标题的名字

  'iCountry', // =号前的名字

  0,// 如果没有找到整数时,返回的默认值

  'c:\forwin95\win.ini' // 调用的文件名

  ));

  向.INI文件写入字符串

  WritePrivateProfileString(

  'windows', // []中标题的名字

  'load', // 要写入“=”号前的字符串

  'accca', //要写入的数据

  'c:\forwin95\win.ini' // 调用的文件名

  );

  向.INI文件写入整数

  WritePrivateProfileSection(

  'windows', // []中标题的名字

  'read=100', // 要写入的数据

  'c:\forwin95\win.ini' // 调用的文件名

  );

  上面的方法是调用API函数,下面介绍另一种不用API从.INI文件中获取字符的方法

  var MyIni: TIniFile;

  begin

  MyIni := TIniFile.Create('WIN.INI');//调用的文件名

  edit1.text:=MyIni.ReadString('Desktop', 'Wallpaper', '');//取得字符

  end;

  向.INI文件中写入字符的方法

  var MyIni: TIniFile;

  begin

  MyIni := TIniFile.Create('WIN.INI');//调用的文件名

  DelphiIni.WriteString('Desktop', 'Wallpaper', 'c:\a.bmp');

  end;

  2.转让控制权

  有时由于长时间的循环语句占用了cpu的处理权,无法运行 其他程序,照成死循环。这时用以下命令转让控制权,让操作系统处理其他事件。

  Application.ProcessMessages;

  3.得到执行程序的目录

  SysUtils 单元中有 ExtractFileDir 与 ExtractFilePath两个类似的函数, 用哪一个?没有太大的关系。

  不过有以下的差别: ExtractFilePath 传回值的最後一个字元是反斜杠“/”。

  procedure TForm1.Button1Click(Sender: TObject);

  begin

  ShowMessage(ExtractFileDir(Application.Exename));

  // ie: c:\temp

  ShowMessage(ExtractFilePath(Application.Exename));

  // ie: c:\temp\

  end;

  相同点: 如果执行文件在根目录下(如:C:\SAMPLE.EXE)的话, 两者的传回值相同, 且最后一个字符都是“/”。

  4.打开已注册文件

  打开Windows已经注册的文件其实很简单,根据以下代码定义一个过程:

  procedure URLink(URL:PChar);

  begin

  ShellExecute(0, nil, URL, nil, nil, SW_NORMAL);

  end;

  在要调用的地方使用

  URLink('Readme.txt');

  如果是链接主页的话,那么改用

  URLink('http://qqxw.yeah.net');

  5.得到Windows用户名和序列号

  如何得到Windows的用户名称和产品序列号呢?

  1. 可以用 WNetGetUser() 这个函数来得到 user name;

  2. Windows 95 的产品序号可以用 TRegistry 到 Registry Database 中找出来;

  // 取得用户名称

  function GetUserName: AnsiString;

  var

  lpName: PAnsiChar;

  lpUserName: PAnsiChar;

  lpnLength: DWORD;

  begin

  Result := '';

  lpnLength := 0;

  WNetGetUser(nil, nil, lpnLength); // 取得字串长度

  if lpnLength > 0 then

  begin

  GetMem(lpUserName, lpnLength);

  if WNetGetUser(lpName, lpUserName, lpnLength) = NO_ERROR then

  Result := lpUserName;

  FreeMem(lpUserName, lpnLength);

  end;

  end; { GetUserName }

  // 取得 Windows 产品序号

  function GetWindowsProductID: string;

  var

  reg: TRegistry;

  begin

  Result := '';

  reg := TRegistry.Create;

  with reg do

  begin

  RootKey := HKEY_LOCAL_MACHINE;

  OpenKey('Software\Microsoft\Windows\CurrentVersion', False);

  Result := ReadString('ProductID');

  end;

  reg.Free;

  end;

  6.关闭外部应用程序

  如何在 Delphi 应用程序中, 去关闭外部已开启的应用程序?

  下面给出一段在 Delphi 中关闭“计算器”程序为例:

  var

  HWndCalculator : HWnd;

  begin

  // find the exist calculator window

  HWndCalculator := Winprocs.FindWindow(nil, '计算器'); // close the exist Calculator

  if HWndCalculator <> 0 then

  SendMessage(HWndCalculator, WM_CLOSE, 0, 0);

  end;

  7.查阅可视窗口标题

  下面只是举出一个例子提供参考:

  运用API函数GetWindow()配合GetWindowText()逐一查出各视窗的标题

  1. File | New Project 开始一个新的工程

  2. 在 Form1 中安排 Button 与 Memo 各一

  3. 在 Button1 的 OnClick 事件中撰写程式如下:

  procedure TForm1.Button1Click(Sender: TObject);

  var

  hCurrentWindow: HWnd;

  szText: array[0..254] of char;

  begin

  hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);

  while hCurrentWindow <> 0 do

  begin

  if GetWindowText(hCurrentWindow, @szText, 255)>0 then

  Memo1.Lines.Add(StrPas(@szText));

  hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT);

  end;

  end;

  8.在Delphi编程中创建一个启动闪现窗口

  通常写得好的Windows程序显示一个启动提示或封面,也叫做闪现窗口。由于工程本身创建了程序的主窗口,一般情况下主窗口最先出现, 那么闪现窗口如何出现在主窗口之前。

  如果我们将主窗口的可视(Visible)属性设置为假,于工程启动时,是否能将主窗口暂时隐藏起来,以使闪现屏幕最先出现呢?答案是不能。 因为应用程序自动在适当时候,使Form可视。(注:当一个Form用做子窗口或对话框, 不需要它们时,可视(Visible)属性设为假,可隐藏起Form。)

  那么我们怎么解决这个问题呢?有以下两种方法:

  方法一:调用Showmodal函数来实现。Showmodal方式使一个窗口为激活窗口, 和Show相似,但它令窗口模式化。现举一例说明:

  8.1开始一个新工程。给表格起名为MainForm,MainForm的单元起名为Main, 工程文件起名为Test。

  8.2在MainForm中插入一个Button部件,将其Caption属性设为“关闭”,为该部件的OnClick事件创建一个过程,并在过程的begin和end之间插入Close语句。

  8.3在应用程序添加一个表格,将这个表格起名为MoveForm,MoveForm 的单元起名为Move。

  8.4为便于演示,在MoveForm中插入一个Label部件,设置其Caption 属性为“欢迎进入本系统”。

  8.5建立两个表格之间的关联。在Unit Main的 implementation 中加入语句 uses move;

  再为MainForm创建OnActivate事件。

  procedure TMainForm.FormActivate(sender:TObject);

  begin

  MoveForm.Showmodal;

  end;

  8.6从Component模板的System类别中选择一个计时器(Timer),添加入 MoveForm表格中,设置其Interval属性为3000(可根据需要自定义),再为其OnTimer事件添加语句close;加入一个Timer部件目的是用以控制闪现窗口显示时间。在此, MoveForm显示了3秒钟后关闭,主窗口MainForm自动被激活。

  8.7编译、运行程序,就能得到延迟为3秒的闪现窗口。

  方法二:你可通过修改工程文件中的源代码来实现,这在Delphi 的编程中是很少见的。现举一例具体说明:

  前四步同方法一。

  ⒌选择View/Project Manager,击Option按钮,选择结果Project Option 对话底部的Forms页栏目。注意,MainForm和MoveForm是在Auto-create forms 列表中。选择MoveForm并击右键头按钮,把这个表格移到 Available forms 。 所有的Delphi表格通过缺省方式自动在内存中建立, 因此它们要消耗内存和系统资源。在类似这里(程序运行时创建一个表格)的情况下, 你应该将表格从自动创建列表格中去掉。

  ⒍下一步修改工程的源代码。选择View/Project Source,修改begin和end之间的语句如下:

  程序清单Test.Dpr

  program Test

  uses

  forms,

  Main in 'MAIN.PAS'{MainForm},

  Move in 'Move.PAS'{MoveForm}

  {$R *.RES}

  begin

  MoveForm:=TMoveForm.Create(Application);{Create创建闪现窗口对象}

  MoveForm.Show;

  MoveForm.Update;

  Application.CreateForm(TMainForm,MainForm);

  MoveForm.Hide;

  MoveForm.Free;{Free从内存中释放对象}

  Application.Run;

  end.

  第一条语句创建了对象,该对象存在内存中,但还不能看见, 为了让它出现并更新它的内容,调用对象的Show和Update成员函数:Show和Update。 当闪现窗口使用完后,用Hide函数将它隐藏起来,然后用Free函数释放它所占据的内存。

  7.如果此刻你编译和运行程序,MoveForm窗口一闪而过, 你可能未来得及看清。为使MoveForm窗口显示几秒种,我们可为MainForm的OnCreate 事件创建一个处理程序,延迟MoveForm窗口的显现时间。

  program TMainForm.FormCreate(sender:Tobject);

  var

  currentTime:LongInt;

  begin

  currentTime:=GetTickCount div 1000;

  while ((GetTickCount div 1000)<(currentTime+3) do

  {不做任何事);

  end;

  end.

  GetTickCount函数返回窗口启动后过去的毫秒数,这个值除以1000 转化为秒数。此时你编译运行程序,就能得到一个延迟3秒多的闪现窗口。为闪现窗口添加上Image部件,再对字体及窗口进行修饰,我们就能为应用程序,创建一个精美的封面或在程序启动时显示重要提示

  9.如何用Delphi编ScreenSaver

  屏幕保护程序无非是扩展名换成了.SCR的可执行程序,它接受两种命令行参数:

  -s 运行命令参数

  -c 配置命令参数

  Windows通过向程序发-s命令行参数来启动程序。

  要注意的是:程序的窗口是无边框和标题;窗口大小应与屏幕大小一样;还要注意窗口的事件的处理。

  10.Delphi里如何计算日期

  算时间在delphi中是最容易的,如下:

  var ss : TDateTime

  其实Tdatetime是一个双精度的浮点数,它的小数点前表示天数:

  如, ss := ss + 20 表示从ss开始向后20天,如果 ss = 234.567

  它就表示 234.567天,当然是从公元0年开始计算的!

  11. delphi怎样调用外部EXE文件

  方法一

  uses WinProcs;

  ……

  begin

  WinExec(......);

  ……

  end.

  和调用Pascal库函数没什么两样。

  方法二

  用ShellExecute更好,在USES段加入SHELLAPI,使用时如:

  执行"c:\myapp\myapp.exe"参数为"-s"

  ShellExecute(handle,'open','c:\myapp\myapp.exe','-s','',SW_SHOWNORMAL);

  第一个参数为父窗口句柄;

  第二个参数为打开方式(OPEN,PRINT两种);

  第三个参数为执行文件全路径;

  第四个参数为执行文件参数;

  第五个参数为执行文件开始运行时的初始目录;

  第六个参数为为执行文件运行方式(SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,

  SW_RESTORE,SW_SHOW,SW_SHOWDEFAULT,SW_SHOWMAXIMIZED,SW_SHOWMINIMIZED,

  SW_SHOWMINNOACTIVE,SW_SHOWNA,SW_SHOWNOACTIVATE,SW_SHOWNORMAL);

  具体请看帮助。另外,如果为字符串参数,其中包含变量或运算的必需用PCHAR()函数。

  12. Win95/98下监控运行的其他程序

  参照下面这段程序,就搞定了啦。^-^

  uses ... TLHelp32, ...

  type

  TForm1 = class(TForm)

  ...

  end;

  var

  Form1: TForm1;

  l : Tlist; ////返回的东东在"L"这个TList中。

  type

  TProcessInfo = Record

  ExeFile : String;

  ProcessID : DWORD;

  end;

  pProcessInfo = ^TProcessInfo;

  implementation

  {$R *.DFM}

  procedure TForm1.FormCreate(Sender: TObject);

  var p : pProcessInfo;

  i : integer;

  ContinueLoop:BOOL;

  var

  FSnapshotHandle:THandle;

  FProcessEntry32:TProcessEntry32;

  begin

  l := TList.Create;

  l.Clear;

  FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

  FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);

  ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);

  while integer(ContinueLoop)<>0 do

  begin

  New(p);

  p.ExeFile := FProcessEntry32.szExeFile;

  p.ProcessID := FProcessEntry32.th32ProcessID;

  l.Add(p);

  ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);

  end;

  end;

  procedure TForm1.FormDestroy(Sender: TObject);

  var p : pProcessInfo;

  i : integer;

  begin

  With l do

  for i := Count - 1 DownTo 0 do

  begin p := items[i]; Dispose(p); Delete(i); end;

  end;

  ...

  end.

     

  【相关论坛】 【发表评论】  


网站简介 | 用户注册 | 广告服务 | 招聘信息 | 中文阅读 | Richwin | 联系方式 | 帮助信息 | 网站律师

Copyright © 1996 - 2000 SINA.com, Stone Rich Sight. All Rights Reserved

版权所有 四通利方 新浪网