请个家庭小医生——编个《生活小偏方》

编程爱好者

本期为大家介绍的这个生活实用程序名叫《生活小偏方》,它的主要功能包括:1.按内科、外科、妇科、儿科、皮肤科等进行分类罗列各类小疾病的症状,选择一个症状后在界面下方显示此症状的治疗方式;2.查询偏方:输入生病的症状能够快速查询出治疗方法;3.增加偏方:如果从朋友那里得知一个实用的偏方,允许录入到系统里,并且可以新建一个“科室”; 4.修改偏方:发觉系统的偏方有误或者有更好的治疗方法,用户可以进行修改。下面我们一起来看看这款软件,它采用Delphi7.0编写。

一、浏览偏方

如图1,点击“一览偏方”,在界面左下方显示一个目录树结构,分别为内科、外科、儿科、妇科、皮肤科、五官科、美容、防病保健知识、食物相克,点击一个“科室”进行展开,系统罗列了属于此科目的常见症状,点击一个症状后,界面下方显示此症状的治疗方法。比如展开内科,点击“打嗝”,界面下方立即显示治疗方法。

36-g15-1-1.jpg
图1

制作难点之一:目录树的形成

在制作软件前,首先要有一个数据库life.mdb,表中有三个字段subject、name、treat,分别存放科室、症状、治疗方法。前期工作是建立好数据库并把信息写到数据库中备用。点击“一览偏方”后将显示目录树结构,也就是从life.mdb数据库中把相关数据提出来加载到目录树中,此操作在Form的OnShow事件中完成。

procedure TForm1.FormShow(Sender: TObject);

var

aNode:TTreeNode;

i,j:integer;

kind,tmpkind:string;

begin

SendMessage(ListBox1.Handle,LB_Set

HorizontalExtent,5000, longint(0));

ADODataSet_life.Close;

ADODataSet_life.CommandText:='selec

t distinct subject from 01 ';

ADODataSet_life.Open;

ADODataSet_life.First;

for i:=0 to ADODataSet_life.RecordCou

nt-1 do

begin

kind:=ADODataSet_life.FieldByName('subject').AsString;

aNode := TreeView1.Items.AddChild(nil,kind) ;

ADODataSet.Close;

ADODataSet.CommandText:='select na

me from 01 where subject=''' + kind + '''';

ADODataSet.Open;

ADODataSet.First;

for j:=0 to ADODataSet.RecordCount-1 do

begin

tmpkind:=ADODataSet.FieldByName('name').AsString;

TreeView1.Items.AddChild(aNode,tmpk

ind);

ADODataSet.Next;

end;

ADODataSet_life.Next;

end;

end;

制作难点之二:窗体的拖动

由于此窗体设置为无标题,运行后窗体是不能拖动的,如何实现窗体的拖动呢?方法有多种,这里介绍最直接也最简单的一种:软件使用一张背景图片,图片大小与窗体大小一致,然后在图片的OnMo

useUp事件中加入如下代码即可:

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

Shift: TShiftState; X, Y: Integer);

begin

ReleaseCapture;

Perform(WM_SYSCOMMAND, $F012, 0);

end;

这样当鼠标在Image1上时,按下鼠标不放进行拖动就可以把窗体拖动到任何位置了。

二、查询偏方

如图2,点击“查询偏方”,然后输入需要查询的症状,点击“查询”按钮即可。如果数据库中有此症状,界面下方将显示其详细信息。这里的症状支持模糊查询,比如输入的为“打鼾”或者“鼾”,查询结果为包含“鼾”的所有症状。

36-g15-1-2.jpg
图2

制作难点:模糊查询

procedure TForm1.LbButton3Click(Sender: TObject);

var

tmp1,tmp2,tmp3,tmp4:string;

begin

tmp1:=Edit1.Text;

ADODataSet.Close;

ADODataSet.CommandText:='select * from 01 where name like ''%'+tmp1+'%''';//模糊查询的关键:查找症状包含输入框的字符串

ADODataSet.Open;

ADODataSet.First;

tmp2:=ADODataSet.FieldByName('subj

ect').AsString;

tmp3:=ADODataSet.FieldByName('treat').AsString;

tmp4:=ADODataSet.FieldByName('name').AsString;

Memo3.Clear;//找到后把Memo清空并把查询结果显示出来

Memo3.Lines.Add('科目:'+tmp2);

Memo3.Lines.Add('');

Memo3.Lines.Add('症状:'+tmp4);

Memo3.Lines.Add('');

Memo3.Lines.Add(tmp3);

Memo3.SelStart := 0;//显示记录后把光标定位到首行

Memo3.SelLength := 0;

end;

三、修改偏方

如图3 ,在下拉列表框中选择一个科目,选择后,在ListBox列表框中显示系统已有的全部属于此科目的症状,点击一个症状后,在界面最下方的Memo中显示治疗方法,在这里进行修改后,点击“修改”按钮即可。

36-g15-1-4.jpg
图3

制作难点之一:ListBox的横向滚动条

在Delphi7.0中,ListBox属性设置页中没有横向滚动条的选择项,如果某一行的字超出了列表框的宽度用户就看不见了,那么在这里就需要给ListBox添加横向滚动条,方法如下:

在FormOnShow事件中加入下面这行代码:

SendMessage(ListBox1.Handle,LB_Set

HorizontalExtent,5000, longint(0));

制作难点之二:全局变量的灵活使用

当点击ListBox中的一个症状后,界面下方的Memo就把01表中的相关字段的值读出来进行显示,当点击“修改”按钮后,再把Memo1的值写回到数据库中,修改按钮的代码为:

procedure TForm1.LbButton4Click(Sen

der: TObject);

var

tmp1:string;

begin

ADODataSet.Close;

ADODataSet.CommandText:='select * from 01 where treat=''' + tmpmemo + '''';

ADODataSet.Open;

ADODataSet.First;

ADODataSet.Edit;

ADODataSet.FieldByName('treat').AsSt

ring:=Memo2.Lines.Text;

ADODataSet.Post;

MessageDlg('恭喜恭喜,增加成功!', mtInformation,[mbOk], 0);

end;

这里的tmpmemo就是一个全局变量,这个变量的赋值是在ListBox的OnClick事件中,当Memo显示字段值之后给这个变量赋值:

tmpmemo:=ADODataSet.FieldByName('treat').AsString ;

当点击ListBox列表框后,Memo显示了相关字段的值,并把这个值赋给tmpmemo存储起来。这时对Memo的内容进行修改,修改后,点击“修改”按钮。此时修改按钮的commandText对应到数据库中定位那条记录,定位后对治疗方法进行修改,那么定位记录也就是在数据库中找到Memo最初显示的字符串的值,我们把这个值赋给了全局变量tmpmemo,事情一下就好办了。

ADODataSet.CommandText:='select * from 01 where treat=''' + tmpmemo + '''';

这一句就能定位记录了。

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

此软件的编写主要使用了TreeView控件和对数据库的操作,值得注意的是全局变量的灵活运用。