定义一个结构,
  s= packed record
      a:integer;
      b:string;
      c:real;
      .
      .
      .
  end;
 结构的大小为90个字节
我要进行的操作是:把这个结构放到内存中去,然后对它进行读或者写,
 问题:1:怎么申请内存块?
       2:我读取或写其中的任意一个值,怎么定位?
       3:我要把结构按照每16个字节或32个字节来划分,放到另外一个内存块中(这个块是以16或32个字节为单位的)?
       4:我在操作时候最应该注意那些问题?   再说一遍,分不够了,我再加!!!

解决方案 »

  1.   

    你可定意一個類!在它的公有部分定意以上的各種變量!
    例如:
      Twjh = class
      public
        s:string;
        i:integer;
      end;
    到時這樣使用:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      wjh1:Twjh;
    begin
      wjh1:=Twjh.Create;
      wjh1.s:='fdsf';
      showmessage(wjh1.s)
    end;
      

  2.   

    为什么要这么麻烦?s= packed record
          a:integer;
          b:string;
          c:real;
          .
          .
          .
      end;
      PS = ^S;
    ss: Ps;  new(SS);//分配内存;
      SS.a := 100;
      ss.b := 'abc';
      ...........
      

  3.   

    type
      PRecord = ^TMyRecord;
      TMyRecord = record
        a: Integer;
        b: String;
        c: Real;
    end;var
      MyList: TList;
      PR: PRecord;procedure TForm1.FormShow(Sender: TObject);
    begin
      MyList := TList.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      MyList.Free;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      New(PR);
      PR.a := 1;
      PR.b := 'Name';
      PR.c := 100;
      MyList.Add(PR);
      //...
    end;MyList.Insert(Index,Item);//挿入
    MyList.IndexOf(Item);     //定位(注:具体的使用方法看看TList)
      

  4.   

    b:string;
    这里b这是一个指针,字符串内容没有包含,只是将指针读入内存,而指针是可变的,你这样读入没有含义。你可以考虑用动态数组或TMemoryStream
      

  5.   

    作个广告,呵呵
    到我个人主页 www.yixel.com
    下载LexLib,使用lxcPackage.pas里面的TPackage类,看是否能够解决楼主的燃眉之急
    可以运行时根据字段名称(是string类型的哦~~)来读写字段,也可以运行时生成某个结构体(可以是纯动态的,甚至是你编写代码的时候无法预知的结构),
      

  6.   

    1:怎么申请内存块?
     TPackage类中用实例的PackageInstance属性来申请、释放某个结构大小的内存块,或者用lxcMemoryManager.pas中的不同的内存类来分配不同类型的内存
    2:我读取或写其中的任意一个值,怎么定位?
     TPackage的Access******系列属性
    3:我要把结构按照每16个字节或32个字节来划分,放到另外一个内存块中(这个块是以16或32个字节为单位的)?
     没相隔16/32个字节用CopyMemory来复制 
    4:我在操作时候最应该注意那些问题?
      用完TPackage后别忘了Free
      

  7.   

    首先,record中的 b: String;String 在delphi中是一个指针,故而,在动态数组申请内存的时候应该首先申请数组的内存,而后再为string单独获得长度。这样的话,你还不如将b:String的申明改成b:pchar或者array[0..xxx]of char.
    2:我读取或写其中的任意一个值,怎么定位?
    你可以参见 Eastunfail(龙子龙孙)==(恶鱼杀手) 的方法
    3:我要把结构按照每16个字节或32个字节来划分,放到另外一个内存块中(这个块是以16或32个字节为单位的)?
    这个问题有点问题:)因为String是一个指针,呵呵,copymemory将只会将指针放到新的结构中,而不会将内容复制。如果使用arrau[0..xxx]of char的方式,就没有这个问题。
    4:我在操作时候最应该注意那些问题?
    个人觉得一定要实现上面的功能,最好自己定义一个类,那样的话,你的灵活度可能很高。
      

  8.   

    delphijoe(delphijoe)你用CopyMemory复制内存结果把指针放到新结构中了,那说明你用错了,你把指针的指针传给CopyMemory了
      

  9.   

    如果你直接用ShortString而不是String的话,你就能够非常简单的操作它了。
      

  10.   

    首先,record中的 b: String;String 在delphi中是一个指针,故而,在动态数组申请内存的时候应该首先申请数组的内存,而后再为string单独获得长度。这样的话,你还不如将b:String的申明改成b:pchar或者array[0..xxx]of char.
    ------------------------------------------------------------
    楼主定死90字节了,你这样不太好吧?