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

操作方法:如图,界面上方有“装修必读”、“装修技巧”、“装修误区”等几个图标,点击其中一个图标后,界面下方就显示出关于此部分的知识集合,点击两个箭头按钮可以翻看前一条记录或后一条记录,如点击“绿色家装”后,界面下方显示此板块页面的第一条记录(文章),文章标题为《家装杀手之二——甲醛》,文章内容在标题下方显示。点击文章标题右侧的箭头按钮可以翻看前面的文章或后面的文章。
特色功能:软件有自动记忆功能,当关闭软件后,程序记录下此界面,下次启动软件时自动显示最后一次退出软件时的界面。由于有的文章比较长,在文章内容框里单击鼠标左键一次,可以实现自动滚屏,再单击鼠标一次取消自动滚屏功能。
制作难点之一:软件的自动记忆功能
软件的自动记忆功能其实就是使用了读写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实现自动滚屏的方法,熟练掌握后对大家开发阅读器类型的软件将有较大的帮助。