数据查找问题(50分)

  • 主题发起人 主题发起人 新余万为清
  • 开始时间 开始时间

新余万为清

Unregistered / Unconfirmed
GUEST, unregistred user!
我想不用数据库实现通讯录的功能,从文本文件中读取地区、邮编、电话区号。
格式如:
北京,100000,010
上海,200000,020
请问各位如何实现在文本文件中任意查找指定记录?如何插入记录?删除记录?
 
为什么要用文本文件呢?用ACCESS数据库不是很方便吗?
如果要用文本文件,可以在每个字段前加上一个标识符,在程序中通过判断
标识符来区别字段。我刚学DELPHI时编过一个类似的程序,当时我是利用
UCDOS 7.0中现成的区号邮编文件来做的,不过源程序我现在找不到了,你
如果需要的话,我可以将执行程序和数据文件发给你。
 
用stringlist
 
自定义一记录类型,然后用记录文件进行操作。
 
用文本文件就是要利用现成的区号邮编,每个字段前加上一个标识符好象不行,我市要根据地名来查电话等,或根据电话来查其他。有没有别的办法??
 
用Delphi 操作ACCESS数据库如何实现?
 
在BDE中设置好ACCESS数据库的别名,然后就可以在DELPHI中操作了,
关键是BDE发布比较麻烦,最好是通过DAO或者是ADO来操作ACCESS数据
库。
 
要是数据不多,又不想用数据库,可以用ini文件

[telno]
北京=100000,010
上海=200000,020

用访问ini的方法查找、插入删除,很容易
 
ODBC里有Text Files的引擎的
 
看样子也没几个记录的,用ini好了,又方便用,可以用 TIniFile 来控制它
 
这是我几年以前些的程序,看能否满足你的要求。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, Menus;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
MainMenu1: TMainMenu;
dhGL: TMenuItem;
dhHelp: TMenuItem;
dhAppend: TMenuItem;
dhExit: TMenuItem;
dhAbout: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure dhExitClick(Sender: TObject);
procedure dhAppendClick(Sender: TObject);
procedure dhAboutClick(Sender: TObject);
{procedure Button2Click(Sender: TObject);}
private
{ Private declarations }
public
{ Public declarations }
end;

Type D=Record
XM:String[28];
DH:String[18];
end;
Var
DH :File of D;
DhAdd:File of d;
Dm:D;
SumNumber:Integer;//当前总电话的个数
Ydh:array[1..9999] of d;//该电话簿最大容量为9999个电话号码
Form1: TForm1;

implementation

uses dhAbout, addUnit2;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
Var
I:Integer;
S:String;
begin
GetDir(0,s);
AssignFile(Dh,S+'/Dh.DAT');//电话数据文件名为Dh.DAT
AssignFile(DhAdd,S+'/DhAdd.DAT');//新增的电话数据文件名为DhAdd.DAT
Reset(dh);
ReSet(DhAdd);
I:=1;
With StringGrid1 Do
Begin
Cells[0,0]:=' 序号';
Cells[1,0]:=' 姓名';
Cells[2,0]:=' 电话号码';
ColWidths[0]:=40;
ColWidths[1]:=110;
ColWidths[2]:=130;

while not Eof(DhAdd) Do
begin
Read (DhAdd,Dm);
Cells[0,I]:=Format('%4d',);
Cells[1,I]:=Format('%10s',[Trim(dm.xm)]) ;
Cells[2,I]:=Format('%10s',[Trim(Dm.dh)]) ;
Ydh.Xm :=Trim(dm.xm);
Ydh.Dh :=Trim(dm.dh);
Inc(I); // I:=I+1;
end;

While Not Eof(Dh) Do
Begin
Read(Dh,Dm);
Cells[0,I]:=Format('%4d',);
Cells[1,I]:=Format('%10s',[Trim(dm.xm)]) ;
Cells[2,I]:=Format('%10s',[Trim(Dm.dh)]) ;
Ydh.Xm :=Trim(dm.xm);
Ydh.Dh :=Trim(dm.dh);
Inc(I); //:=I+1;
End;
SumNumber:=I-1;
RowCount :=SumNumber+1;
end;
CloseFile(Dh);
CloseFile(DhAdd);
Form1.ActiveControl := Edit1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Var
I,N,Nmb:Integer;
S:String;
begin
With StringGrid1 Do
BEGIN
{如没有输入任何查询内容,则返回全部}
If Edit1.text='' Then
begin
for I :=1 to SumNumber do
begin
Cells[0,I]:=Format('%4d',);
Cells[1,I]:=Format('%10s',[Ydh.XM]) ;
Cells[2,I]:=Format('%10s',[Ydh.dh]) ;
end;
RowCount :=SumNumber+1;
end;

If (Key=#13) And (Edit1.Text<>'') Then
Begin
Nmb := StrToIntDef(Edit1.Text, 1010110452);

//***** 处理输入字符即输入姓名的情况 *********//
If Nmb=1010110452 Then
begin
S:=Edit1.Text;
N:=0;
Cols[0].Clear;
Cols[1].Clear;
Cols[2].Clear;
Cells[0,0]:=' 序号';
Cells[1,0]:=' 姓名';
Cells[2,0]:=' 电话号码';
for I := 1 to SumNumber do
begin
If Pos(S,Ydh.XM)>0 Then
begin
N:=N+1;
Cells[0,N]:=Format('%4d',[N]);
Cells[1,N]:=Format('%10s',[Ydh.XM]) ;
Cells[2,N]:=Format('%10s',[Ydh.dh]) ;
end;
end;
If n<1 then
begin
RowCount :=2;
Cells[1,1]:='没找到!' ;
Cells[2,1]:='';
end
else StringGrid1.RowCount :=N+1;

end;
//******* 处理输入数字的情况***************//
If Nmb<>1010110452 Then
begin
S:=Edit1.Text;
N:=0;
Cols[0].Clear;
Cols[1].Clear;
Cols[2].Clear;
Cells[0,0]:=' 序号';
Cells[1,0]:=' 姓名';
Cells[2,0]:=' 电话号码';
for I := 1 to SumNumber do
begin
If Pos(S,Ydh.DH)>0 Then
begin
N:=N+1;
Cells[0,N]:=Format('%4d',[N]);
Cells[1,N]:=Format('%10s',[Ydh.XM]) ;
Cells[2,N]:=Format('%10s',[Ydh.dh]) ;
end;
end;
If n<1 then
begin
RowCount :=2;
Cells[1,1]:='没找到!' ;
Cells[2,1]:='';
end
else StringGrid1.RowCount :=N+1;
end;
end;
END;
end;

procedure TForm1.dhExitClick(Sender: TObject);
begin
Close;
end;

procedure TForm1.dhAppendClick(Sender: TObject);
begin
frmAdd.ShowModal;
end;


{Type rD=Record
X:String[28];
H:String[18];
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
xDH :File of rD;
xDm:rD;
I:Integer;
begin
AssignFile(xDh,'xDh.DAT');//电话数据文件名为xDh.DAT
ReWrite(xdh);
for I:= 4 to SumNumber do
begin
xDm.X :=Ydh.XM;
xDm.H :=Ydh.DH;
Write(xDh,xDm);
end;
CloseFile(xDh);
end;}

procedure TForm1.dhAboutClick(Sender: TObject);
begin
AboutBox.ShowModal;
end;

end.
 
太麻烦了吧!在C:/Program Files/Borland/Delphi5/Demos/Db/Textdata
目录下有文本数据查询控件,使用文本文件象数据库一样操作,十分方便,安装
控件TextDataSet后,可以作用TextDataSet1.Locate(..),TextDataSet1.append
和TextDataSet1.delete来查询、删除、增加,如在同一行中模糊查询,请查询已答
问题,如何进行查询..
 
我同意LSS的意见,使用现成的效率比较高,如果有什么不满足你要求的,
你可以自己修改。
 
Thank 小刚!!
用访问ini的方法查找、插入删除?具体步骤怎么做??
 
用 TIniFile

TIniFile.Create('文件名.ini');
第一次运行时,如果文件不要创建在windows目录下,
而是要在当前目录下创建,记住文件名一定要“./文件.ini”这样,否则会在windows目
录下创建

读写:
TIniFile.ReadInteger
TIniFile.WriteInteger
TIniFile.ReadString
TIniFile.WriteStrig
等等

删除一行:
TIniFile.DeleteKey
 
PIPI老兄:
能否给我一个用 TIniFile实现的例子!
如果能成功,我会重谢你的!!!
 
RedBeret请将执行程序和数据文件发给我!
 
我也正想做这么个东西,可我要在BC++4.5下做(没办法,是修改别人的程序,加上点数据查找的功能),也是想通过txt文件做,不知谁有例子?
其实我想就是个通讯录的例子吧。。
 
后退
顶部