精明装修靠自己——编个《家装小助手》

编程爱好者

本期为大家介绍的这个生活实用程序名叫《家装小助手》,它为大家介绍了许多家装方面的知识,按内容划分为了六大部分:装修必读、装修技巧、装修误区、绿色家装、我扮我家、选购指南。下面我们一起来看看这款软件,它采用Delphi7.0编写。

38-g15-1-1.jpg

操作方法:如图,界面上方有“装修必读”、“装修技巧”、“装修误区”等几个图标,点击其中一个图标后,界面下方就显示出关于此部分的知识集合,点击两个箭头按钮可以翻看前一条记录或后一条记录,如点击“绿色家装”后,界面下方显示此板块页面的第一条记录(文章),文章标题为《家装杀手之二——甲醛》,文章内容在标题下方显示。点击文章标题右侧的箭头按钮可以翻看前面的文章或后面的文章。

特色功能:软件有自动记忆功能,当关闭软件后,程序记录下此界面,下次启动软件时自动显示最后一次退出软件时的界面。由于有的文章比较长,在文章内容框里单击鼠标左键一次,可以实现自动滚屏,再单击鼠标一次取消自动滚屏功能。

制作难点之一:软件的自动记忆功能

软件的自动记忆功能其实就是使用了读写ini文件的方法。ini文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以如VB、VC、VFP、Delphi等都提供了读写ini文件的方法,其中Delp

hi中操作ini文件,最为简洁,这是因为Delp

hi提供了一个TInifile类,使我们可以非常灵活地处理ini文件,下面简单介绍有关ini的知识和如何读写ini:

1. ini文件的结构

;注释

[小节名]

关键字=值

...

ini文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值。

值的类型有三种:字符串、整型数值和布尔值。其中字符串存储在ini文件中时没有引号,布尔真值用1表示,布尔假值用0表示。注释以分号“;”开头。

2.定义

(1)在Interface的Uses节增加IniFiles;

(2)在Var变量定义部分增加一行:

MyIniFile: TIniFile;

然后,就可以对变量MyIniFile进行创建、打开、读取、写入等操作了。

在本程序中,先在项目文件所在的文件夹内新建一个文本文件,然后更改文件名为myapp,更改扩展名为ini。启动Delph

i7.0,打开此程序。由于在关闭程序时要记忆关闭时的界面,在主窗体右上角的关闭按钮的OnMouseUp事件中写入:

procedure TForm1.Image11MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

MyIniFile: TIniFile;

begin

Image11.Left:=509;

Image11.Top:=5;

MyIniFile := TIniFile.Create(ExtractFile

Path(Paramstr(0))+'myapp.ini');

myinifile.Writestring('SqlConn','ConnSt

ring',Label1.Caption);//把文章标题写到ini文件中,然后关闭应用程序

Application.Terminate;

end;

我们到Windows资源管理器中打开myapp.ini文件,看到的内容为:

[SqlConn]

ConnString=专家教您装修时如何省建材

此时我们已经对ini的写入成功了,下面将在程序启动时读取ini,显示此文章标题,并确定此文章标题所对应的文章内容,在Form1.OnShow事件中,这里先对数据库进行说明,采用Access建立的数据库,共六张表,表名分别为read1、skill、miss、green、myhome、buy。每张表都由两个字段构成:title、content,第一个字段为文章标题,第二个字段为文章内容。

procedure TForm1.FormShow(Sender: TObject);

var

MyIniFile: TIniFile;

strConn:string;

title:string;

begin

MyIniFile := TIniFile.Create(ExtractFi

lePath(Paramstr(0))+'myapp.ini');

title:= myinifile.readstring('SqlConn','ConnString','');//把ini的“专家教您装修时如何省建材”读取出来赋给

title变量

Label1.caption:=title;//显示标题

ADODataSet.Close;

ADODataSet.CommandText:= 'select * from read1 where title=''' + title + '''';//在表read1中查询记录中是否有满足字段title的值为“专家教您装修时如何省建材”的记录

ADODataSet.Open;

if ADODataSet.RecordCount>0 then//如果有则把此记录的content的值显示在memo中

begin

Memo1.Lines.Add(ADODataSet.FieldBy

Name('content').AsString);

Memo1.SelStart := 0;

Memo1.SelLength := 0;

exit;

end;

if ADODataSet.RecordCount<1 then//如果没有满足的记录,查询下一张表是否有满足条件的记录

begin

ADODataSet.Close;

ADODataSet.CommandText:= 'select * from skill where title=''' + title + '''';

ADODataSet.Open;

if ADODataSet.RecordCount>0 then

begin

Memo1.Lines.Add(ADODataSet.FieldBy

Name('content').AsString);

Memo1.SelStart := 0;

Memo1.SelLength := 0;

exit;

end;

……………………

end;

制作难点之二:实现自动滚屏效果

当Memo显示文章内容时,在Memo中单击鼠标左键,文章像网页一样开始自动滚屏,再次点击鼠标左键,滚屏停止。实现方法是:

1.在窗体上添加一个时钟控件,设置属性Interval为100,Enable设置为false,在Uses中引用StrUtils,并定义一个全局变量flag(布尔类型)。

procedure TForm1.Timer1Timer(Sender

: TObject);

var

x,x1:PRect;//定义两个指针变量

begin

new(x);

new(x1);

x^ := Memo1.ClientRect;

x1^ := Memo1.ClientRect;

ScrollWindow(Memo1.Handle,0,-1,x,x1);//调用函数进行一行滚屏,ScrollWindo

w函数的作用是滚动窗口客户区的全部或一部分

end;

2.在Memo的OnMouseDown中写如下代码:

procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

flag:=not flag;//flag取反

if flag=true then timer1.Enabled:=true;//如果为真,则开始滚屏,为假,则停止滚屏

if flag=false then timer1.Enabled:=false;

end;

制作难点之三:让关闭程序更合理

这算一个小技巧吧,当关闭窗体时,可以按下“Alt+F4”,也可以点击主窗体右上角的关闭按钮。如果在关闭按钮的OnMo

useUp中,向ini中写数据,那么当按下“Alt+F4”时也应当向ini写数据,也就是Form的OnClose事件,需要调用Image的OnMouseU

p,但OnMouseUp不是一个方法,而是一个事件,因此需要做一些处理:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

var

a:TMouseButton;

b:TShiftState;

begin

image11.OnMouseUp(self,a,b,10,20);

end;

以上程序下载网址:http://www.cpcw.com/xz/38shenghuo.rar

此软件向大家介绍了如何在Delphi中读写ini的方法和Memo实现自动滚屏的方法,熟练掌握后对大家开发阅读器类型的软件将有较大的帮助。