主题:求教:如何简单的读取特殊格式数据
twxz
[专家分:60] 发布于 2006-08-12 23:13:00
由于工作原因现打算给一个老程序写一个扩展程序:
有一特殊数据文件,有具体存储数据结构,但由于部分数据是以2进制存放,所以无法使用常规的读取函数
为了兼容其他现有常规编程控件
现在需要连接DataSource,有人说要重新封装
在下不明,望达人解救!!!!
数据结构:
USERS char 10
password char 16
date1 4字节
data2 3字节
回复列表 (共3个回复)
沙发
dodolon [专家分:400] 发布于 2006-08-17 05:12:00
无法使用常规的读取函数? 你所谓的“特殊数据文件”到底是数据库表还是常规磁盘文件?如果是数据库表,这个问题就不是问题了。如果是常规文件,下面的处理方法可供参考,但对指针操作要熟悉喔!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TData1 = array[0..3] of Byte;
TData2 = array[0..2] of Byte;
TItem = packed record
USER : array[0..9] of Char;
password : array[0..15] of Char;
data1 : TData1;
data2 : TData2;
end;
PItems = ^TItems;
TItems = array[0..0] of TItem; //Windows内核经常采用的技术喔! 编译选项中Range Checking可不能打钩!
var
PData: PItems;
MemStream: TMemoryStream;
ItemCount: Integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
MemStream:=TMemoryStream.Create;
MemStream.LoadFromFile('DataFileName');
ItemCount:=MemStream.Size div SizeOf(TItem);
PData:=MemStream.Memory;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
User,Password: string;
D1: TData1;
D2: TData2;
begin
for i:=0 to ItemCount-1 do
begin
User:=StrPas(PData^[i].User);
Password:=StrPas(PData^[i].Password);
D1:=PData^[i].data1;
D2:=PData^[i].data2;
//你要如何处理这个记录,
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MemStream.Free;
end;
end.
采用者给分!
板凳
twxz [专家分:60] 发布于 2006-08-21 01:16:00
谢谢,代码我先看看
感谢高人的帮助
我说的是指在一个二进制文件中存储的数据库
是常规文件,呵呵~~~~谢谢先~~~~~
3 楼
twxz [专家分:60] 发布于 2006-08-21 01:25:00
上面代码看了
因为我准备开发的东东最终需要在可视的环境下操作
为了简便起见,打算是要开发个组件(DLL或者OCX)除了上述功能
还要最好能连接TDataSource组件以便最后开发能使用到标准组件,
并且降低维护成本
不知道高手能否抽空提出好的解决方案,谢谢先
另外,由于高手的代码确实解决了我满大的一个问题,先谢谢了,同时评分30感激不尽!!!
我来回复