回 帖 发 新 帖 刷新版面

主题:求教:如何简单的读取特殊格式数据

由于工作原因现打算给一个老程序写一个扩展程序:
有一特殊数据文件,有具体存储数据结构,但由于部分数据是以2进制存放,所以无法使用常规的读取函数
为了兼容其他现有常规编程控件
现在需要连接DataSource,有人说要重新封装
在下不明,望达人解救!!!!

数据结构:
USERS  char 10
password char 16
date1   4字节
data2   3字节

回复列表 (共3个回复)

沙发

无法使用常规的读取函数? 你所谓的“特殊数据文件”到底是数据库表还是常规磁盘文件?如果是数据库表,这个问题就不是问题了。如果是常规文件,下面的处理方法可供参考,但对指针操作要熟悉喔!

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.

采用者给分!

板凳

谢谢,代码我先看看

感谢高人的帮助

我说的是指在一个二进制文件中存储的数据库
是常规文件,呵呵~~~~谢谢先~~~~~

3 楼

上面代码看了
因为我准备开发的东东最终需要在可视的环境下操作
为了简便起见,打算是要开发个组件(DLL或者OCX)除了上述功能
还要最好能连接TDataSource组件以便最后开发能使用到标准组件,
并且降低维护成本

不知道高手能否抽空提出好的解决方案,谢谢先

另外,由于高手的代码确实解决了我满大的一个问题,先谢谢了,同时评分30感激不尽!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册