⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9909.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 2 页
字号:

                   《编 程 技 术》

         一份属于广大编程爱好者的电子杂志

                   第九期 99/05/23


<本期栏目>
 *刊首语*
 *技术文档*
    Delphi中的INI文件编程
    用VB实现文件查找功能
    如何制作Windows自定义边框的对话框
    VB4.0为应用程序创建快捷方式
    模拟键盘输入实现程序的自动演示
    绘制花瓣图形的小程序
 *疑难杂症*

*****************************************************

<刊首语>
    
    自本刊创刊至今,我收到不少向我提问的信件,非常抱歉
的是由于能力所限实在无法回答这些问题。为此从本期开始本
刊开设“疑难杂症”栏目,如果您在编程的时候有什么疑难问
题,就请把问题发往yaozheng@kali.com.cn 主题为“提问”,
我会把问题放在杂志上的,希望编程高手们能不吝赐教,也希
望这个栏目能成为大家交流的场所。
    另外,如果您在编程时有什么经验技巧或者有些不错的文
章的话,欢迎您能投稿(抱歉的是我付不起稿费:-) )。

*****************************************************
*****************************************************

<技术文档>

                            Delphi中的INI文件编程 

                       湖北省枝江市委办公室   曹祖权
 
---- INI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化
的编程一族,如VB、VC、VFP、Delphi等都提供了读写INI文件的方法,其中Delphi中操作INI
文件,最为简洁,这是因为Delphi3提供了一个TInifile类,使我们可以非常灵活的处理INI
文件。
一、有必要了解INI文件的结构:
    ;注释
    [小节名]
    关键字=值
    ...
---- INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值。 
---- 值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时没有引
号,布尔真值用1表示,布尔假值用0表示。 
---- 注释以分号“;”开头。 
二、定义
---- 1、在Interface的Uses节增加IniFiles; 
---- 2、在Var变量定义部分增加一行: 
       myinifile:Tinifile;
---- 然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。 
三、打开INI文件
    myinifile:=Tinifile.create('program.ini');
---- 上面这一行语句将会为变量myinifile与具体的文件 program.ini建立联系,然后,就
可以通过变量myinifile,来读写program.ini文件中的关键字的值了。 
---- 值得注意的是,如果括号中的文件名没有指明路径的话,那么这个Program.ini文件会
存储在Windows目录中,把Program.ini文件存储在应用程序当前目录中的方法是:为其指定
完整的路径及文件名。下面的两条语句可以完成这个功能: 
Filename:=ExtractFilePath(Paramstr
(0))+'program.ini';
myinifile:=Tinifile.Create(filename);
四、读取关键字的值
---- 针对INI文件支持的字符串、整型数值、布尔值三种数据类型,TINIfiles类提供了三种
不同的对象方法来读取INI文件中关键字的值。 
---- 假设已定义变量vs、vi、vb分别为string、 integer、boolean类型。 
vs:=myinifile.Readstring
('小节名','关键字',缺省值);
vi:=myinifile.Readinteger
('小节名','关键字',缺省值);
vb:=myinifile.Readbool
('小节名','关键字',缺省值);
---- 其中缺省值为该INI文件不存在该关键字时返回的缺省值。 
五、写入INI文件
---- 同样的,TInifile类也提供了三种不同的对象方法,向INI文件写入字符串、整型数及
布尔类型的关键字。 
myinifile.writestring('小节名','关键字',变量或字符串值);
myinifile.writeinteger('小节名','关键字',变量或整型数值);
myinifile.writebool('小节名','关键字',变量或True或False);
---- 当这个INI文件不存在时,上面的语句还会自动创建该INI文件。 
六、删除关键字
---- 除了可用写入方法增加一个关键字,Tinifile类还提供了一个删除关键字的对象方法: 
myinifile.DeleteKey('小节名','关键字');
七、小节操作
---- 增加一个小节可用写入的方法来完成,删除一个小节可用下面的对象方法: 
    myinifile.EraseSection('小节名');
---- 另外Tinifile类还提供了三种对象方法来对小节进行操作: 
---- myinifile.readsection('小节名',TStrings变量);可将指定小节中的所有关键字名读
取至一个字符串列表变量中; 
---- myinifile.readsections(TStrings变量);可将INI文件中所有小节名读取至一个字符
串列表变量中去。 
---- myinifile.readsectionvalues('小节名',TStrings变量);可将INI文件中指定小节的
所有行(包括关键字、=、值)读取至一个字符串列表变量中去。 
八、释放
在适当的位置用下面的语句释放myinifile:
    myinifile.distory;
九、一个实例
---- 下面用一个简单的例子(如图),演示了建立、读取、存贮INI文件的方法。myini.ini
文件中包含有“程序参数”小节,和用户名称(字符串)、是否正式用户(布尔值)和已运
行时间(整型值)三个关键字。程序在窗体建立读取这些数据,并在窗体释放时写myini.ini
文件。 
---- 附源程序清单 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, 
Controls, Forms, Dialogs,inifiles,StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Timer1: TTimer;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation
var
  myinifile:TInifile;
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  filename:string;
begin
  filename:=ExtractFilePath(paramstr(0))+'myini.ini';
  myinifile:=TInifile.Create(filename);
  edit1.Text:= myinifile.readstring
('程序参数','用户名称','缺省的用户名称');
  edit2.text:= inttostr(myinifile.readinteger
('程序参数','已运行时间',0));
  checkbox1.Checked:= myinifile.readbool
('程序参数','是否正式用户',False);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  myinifile.writestring('程序参数','用户名称',edit1.Text);
  myinifile.writeinteger('程序参数','已运行时间',
strtoint(edit2.text));
  myinifile.writebool('程序参数','是否正式用户',
checkbox1.Checked);
  myinifile.Destroy;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  edit2.Text:=inttostr(strtoint(edit2.text)+1);
end;

end.
---- 程序在Pwin95、Delphi3下调试通过。 
 
*****************************************************

                      用VB实现文件查找功能

  在VB中要实现查找文件功能,我们可以利用VB的DIR函数进行递归来实现。每次
使用DIR函数后,比较是否有要查找的文件,再检查是否有子目录,若有,利用递归
继续查找,这样可对整个盘进行查找。
  下面是一个例子,查找DOS目录下的所有EXE文件,统计EXE文件的数目并列出文
件名。本程序会查找当前路径下的所有文件和子目录,与WIN95的“包含子文件夹”
的查找功能类似。
程序与注释如下:
1.在窗体中加一命令按钮Command1,Caption=查找示例,双击此按钮,写如下代码:
Private Sub Command1-Click()
Dim ff() As String′定义一个字符串数组用来保存找到的文件名称
Dim fn As Long′保存找到的文件数目
fn=TreeSearch(″C:%%dos″,″*.exe″,ff())
Print″找到文件数目为″;fn
For i=1 To fn
Print ff(i)
Next
End Sub
2.插入一模块Modulel.bas,写如下代码:
Option Explicit
Public Function TreeSearch(ByVal sPath As String,ByVal sFileSpec As String,sFiles() As String)
As Long
Static 1Files As Long′文件数目
Dim sDir   As String
Dim sSubDirs() As String′存放子目录名称
Dim 1Index As Long
If Right(sPath,1)<>″%%″Then sPath=sPath&″%%″
sDir=Dir(sPath & sFileSpec)
′获得当前目录下文件名和数目
Do While Len(sDir)
1Files=1Files+1
ReDim Preserve sFiles(1 To 1Files)
sFiles(1Files)=sPath&sDir
sDir=Dir
Loop
′获得当前目录下的子目录名称
1Index=0
sDir=Dir(sPath&″*.*″,16)
Do While Len(sDir)
If Left(sDir,1)<>″.″Then ′skip.and..
′找出子目录名
If GetAttr(sPath & sDir)And vbDirectory Then
1Index=lIndex +1
′保存子目录名
Redim Preserve sSubDirs(1 To 1Index)
sSubDirs(1Index)=sPath & sDir &″%%″
End If
End If
sDir=dir
Loop
For 1Index=1 To 1Index
′查找每一个子目录下文件,这里利用了递归
Call TreeSearch(sSubDirs(1Index),sFileSpec,sFiles())
Next 1Index
TreeSearch=1Files
End Function
3.保存文件,按F5运行,单击命令按钮即可。
程序运行环境:VB 4.0 (32位),中文WIN95。
                
*****************************************************

                如何制作Windows自定义边框的对话框 

               哈尔滨工程大学计算机系研(150001) 贾巍 


    在Windows应用程序中,对话框是应用最广泛也是比较难控制其风格(外表)的一类窗口。
Windows 3.x所提供的传统的对话框一般都有一个单调的蓝色的边框和白色窗口背景,即使采
用Borland C++所提供的BorDlg风格的对话框,用自定义控制(BWCC)来美化对话框的背景及内
容,呆板的边框还是一成不变的。相信用过Windows 95的朋友在享受其强大功能的同时,一定
也为它所提供的具有立体感的界面而感叹吧。事实上,在Windows 3.x中,我们也是可以作出
更美观的窗口来的,中文之星2.0就是一个很好的例子。 

    要想按自己的意愿来绘制一个普通窗口或对话框的边界,一般来说有两种方法:一种是在
系统绘制边框之后再在其上重新绘制一遍;另一种是彻底接管对边框的绘制权,禁止系统的干
涉。前一种方法对于含有菜单的窗口较为适应,能够保证窗口始终以自定义方式出现,但是在
窗口更新时,这种方式会产生闪烁现象;第二种方式比较适应于没有菜单的窗口,更新时不会
发生闪烁现象,但是如果处理不好有时系统会暂时重新获得绘制权,使得窗口以另外一种形象
出现。下面作者要介绍的方法将结合使用这两种方法,以求取得较好的效果。 

在一个窗口的边界(非用户区)需要重画时,窗口将接到消息WM_NCPAINT,通常该消息将被传送
给窗口的DefWndProc函数进行缺省的处理,我们只要使应用程序处理这个消息而不是交给
Windows就可以实现第二种方法。由于对话框有许多普通窗口不具有的特性,因此如果希望比
较完善地控制对话框的风格,还要适当用第一种方式做辅助。作者采取的做法为每当对话框
被激活时都重画一遍。 

下面就是笔者基于以上思想而编制的一个边界有立体效果的对话框类。将该类做成通用的动
态连接库就可以供其他程序使用。 

//以下为头文件说明 

#if !defined(_NEW_STYLE_DIALOG_) 

#define _NEW_STYLE_DIALOG_ 

#include <owl.h> 

extern PTModule TheModule; 

_CLASSDEF(TNewDialog) 

class TNewDialog : public TDialog { 

HPEN DarkGrayPen,LightGrayPen; 

HPEN WhitePen,BlackPen; 

HBRUSH LightGrayBrush,BlueBrush; 

HBRUSH NullBrush; 

void CreateDrawObject(void); 

public: 

TNewDialog(PTWindowsObject AParent, LPSTR AName, PTModule AModule = NULL) 

:TDialog(AParent,AName,AModule) 

{ CreateDrawObject(); } 

TNewDialog(PTWindowsObject AParent, int 

ResourceId, PTModule AModule = NULL) 

:TDialog(AParent,ResourceId,AMod-ule) 

{ CreateDrawObject(); } 

~TNewDialog(); 

virtual void WMNCPaint(RTMessage Msg) 

=[WM_FIRST+WM_NCPAINT]; 

virtual void WMActivate(RTMessage Msg) 

=[WM_FIRST+WM_ACTIVATE]; 

void DrawFrame(); }; 

#endif 

//以下为动态连接库和类成员函数体 

#include "newdlg.h" 

PTModule TheModule; 

int FAR PASCAL LibMain(HINSTANCE hIn-stance, WORD , WORD , LPSTR lpCmd -Line) 

{ 

int TheStatus; 

TheModule = new TModule("NEWDL-GDLL",hInstance, lpCmdLine); 

TheStatus = TheModule->Status; 

if ( TheStatus != 0 ) { 

delete TheModule; 

TheModule = NULL; } 

return (TheStatus == 0); 

} 

int FAR PASCAL WEP ( int /*bSystemExit*/ ) 

{return 1;} 

TNewDialog::~TNewDialog() 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -