首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 在类中使用Record类型的问题
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 15:11:26 楼主
    代码部分:
    type
      RecPersonArch = Record
        ID: string;
        Name: string;
        ...
      end;

      TPersonArch = Class
      private
        FRPersonArch: RecPersonArch;
        ...... 
      public
        property RPersonArch: RecPersonArch read FRPersonArch write FRPersonArch;
        ......
      end;

    .........
      
    procedure SetPersonID(sPersonID: string);
    var
      PersonArch: TPersonArch;
    begin
      PersonArch:= TPersonArch.Create(nil);
      try
        PersonArch.RPersonArch.ID := sPersonID;
      finally
        PersonArch.Free;
      end;
    end;

    .........

    问题:在语法检查的时候报Left side can not be assigned to,请问各位我在类中不是已经将整个RPersonArch制成可读写的状态了吗,为什么还会有这个问题??谢谢。


    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 15:31:071楼 得分:0
    没人能帮忙嘛??是写法的问题吗??自己先顶下。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • do2008
    • 等级:
    发表于:2008-03-21 15:50:242楼 得分:0
    解决方法1:
    var
      PersonArch: TPersonArch;

      TempRPersonArch: RecPersonArch; //定义一个临时的结构体成员 
    begin
      PersonArch:= TPersonArch.Create();
      try
        TempRPersonArch.id :=  sPersonID;
        PersonArch.RPersonArch:= TempRPersonArch;//间接赋值
      finally
        PersonArch.Free;
      end;
    end;

    解决方法2:
    在类中输出一个接口函数,

      TPersonArch = Class
      private
        FRPersonArch: RecPersonArch;
        ...... 
      public
        property RPersonArch: RecPersonArch read FRPersonArch write FRPersonArch;
        ......
      public
        function fun_SetRPersonArchID(aId:String);
      end; 


    function TPersonArch.fun_SetRPersonArchID(aId:String);
    begin

       //不用这一句>>PersonArch.RPersonArch.ID := sPersonID; 
       FRPersonArch.ID := sPersonID; 
    end;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 15:52:373楼 得分:0
    //这样写
    property RPersonArch: RecPersonArch read FRPersonArch write SETRPersonArch; 

    procedure SetRPersonArch(val:string);
    begin
      FRPersonArch.ID:=val;
    end;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lihuasoft
    • 等级:
    发表于:2008-03-21 15:53:064楼 得分:0
    Delphi(Pascal) code
    //大体看了一下,不知这样行不 var x: RecPersonArch; //...... x.ID := 'abc'; x.Name:= '12345657'; PersonArch.RPersonArch := X; //......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 16:07:525楼 得分:0
    晕,你的可写状态是指 FRPersonArch

    var
      rec: RecPersonArch; 
    begin
      PersonArch.RPersonArch:= rec; // 可以直接赋整个记录值,但不能对记录里面的数据赋值。
    end;

    建议你用指针

      PRecPersonArch = ^RecPersonArch;
      RecPersonArch = Record 
        ID: string; 
        Name: string; 
        ... 
      end; 

      TPersonArch = Class 
      private 
        FRPersonArch: RecPersonArch; 
        function Get: PRecPersonArch; 
      public 
        property RPersonArch: PRecPersonArch read Get; 
        ...... 
      end; 

    ......... 
       
    function Get: PRecPersonArch;
    begin
      Result:= @FRPersonArch;
    end;

    procedure SetPersonID(sPersonID: string); 
    var 
      PersonArch: TPersonArch; 
    begin 
      PersonArch:= TPersonArch.Create(nil); 
      try 
        PersonArch.RPersonArch^.ID := sPersonID;  // 这样就可以
      finally 
        PersonArch.Free; 
      end; 
    end; 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ysai
    • 等级:
    发表于:2008-03-21 16:07:556楼 得分:0
    http://www.delphibbs.com/keylife/iblog_show.asp?xid=6094
    用这种写法
    type 
      PRecPersonArch = ^RecPersonArch;
      RecPersonArch = Record 
        ID: string; 
        Name: string; 
        ... 
      end; 

    赋值:
    PRecPersonArch(@PersonArch.RPersonArch)^.ID := ......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 16:09:517楼 得分:0
    感谢大家的发言,不过我的record中的字段太多,不太适合做接口函数。
    做一个Temp的变量似乎是比较好,不过不知道是不是我的系统问题,用CopyMemory的时候有时候会出错。
    其实,如果把record改成class,并将所有变量都声明称public,也能解决这个问题。
    我特想知道,是什么原因造成record在Class会变成只能读的。
    record的声明的出来的结构体为什么不能和普通的变量一样用嘛??
    C中的Struct有这个问题吗??
    请大家帮我解惑。谢谢。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 16:10:528楼 得分:0
    6楼的书写更加简洁些。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 16:12:219楼 得分:0
    记录中包含了string类型的话,你直接对该record copymemory肯定是不对的。
    string本身也可以当作是一个指针,你自己sizeof(string)看看不管多长的string都是4个字节。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 16:16:0310楼 得分:0
    感谢slxx0712为我找出了一个让我迷惑的CopyMemory的问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 17:35:3211楼 得分:0
    记录直接赋值给属性是会这样的,解决方法上面都说了,一用指针,二用Set方法赋值。

    但是我建议还是用对象比较好,实体对象比记录好的是:1、可以带方法;2、多态
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-21 19:44:3612楼 得分:0
    说错了:
    2、继承
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-25 09:24:5213楼 得分:0
    type 
      RecPersonArch = Record 
        ID: string; 
        Name: string; 
        ... 
      end;
    应该改为
    type 
      RecPersonArch = Record 
        ID: string; 
        Name: string[1024]; 
        ... 
      end;
    string类在Record里面是要定长的,你的写法不行.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-01 06:06:3614楼 得分:0
    以后需再关注,现在先帮你顶一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-01 06:32:3615楼 得分:0
    lz要干嘛?
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved