码农的笔记

Delphi虽好,但已不流行; 博客真好,可以做笔记

博客园 首页 新随笔 联系 订阅 管理

-------开发环境Delphi7----此篇仅供参考---

 

-----------------

这篇适用于Delphi7 ,因为Xe版的就不一样,好坑啊,具体原因暂时不清楚,以后弄明白了再写上来

 

 

--------------------

Unit

  1 unit Unit1;
  2 
  3 interface
  4 
  5 uses
  6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7   Dialogs, StdCtrls;
  8 
  9 type
 10   TmyClass=class
 11   private
 12     FName:string;
 13     FAge:Word;
 14   end;
 15 
 16    TmyClass_A=class(TmyClass)
 17    private
 18      FColor:String;
 19    property
 20      Color:string read FColor write FColor;
 21   end;
 22   TMyClass_X=class
 23     A:string;
 24     B:string;
 25     C:string;
 26   end;
 27 
 28   TForm1 = class(TForm)
 29     Button1: TButton;
 30     Memo1: TMemo;
 31     Button2: TButton;
 32     procedure Button1Click(Sender: TObject);
 33     procedure Button2Click(Sender: TObject);
 34   private
 35     { Private declarations }
 36   public
 37     { Public declarations }
 38   end;
 39 
 40 var
 41   Form1: TForm1;
 42 
 43 implementation
 44 
 45 {$R *.dfm}
 46 {以下例子说明:只想用浅显的东西理解强制转换这玩意 ,到底符不符合科学,俺就不管了}
 47 
 48 procedure TForm1.Button1Click(Sender: TObject);
 49 var
 50   vByte:Byte; //占用一个字节
 51   vChar:Char;//占用一个字节
 52   vInt:Integer;//占用四个字节
 53   vDou:Double;//占用8个字节
 54 begin
 55   memo1.Clear;
 56   //////先给vByte赋值,然后强制转换
 57   vByte:=65;//只能保存0..255之间的数字
 58   memo1.Lines.Add(Char(vByte)); //显示的是A  //表象:把vByte的内容强制转化为了Char类型,这个vByte的值真的改变了吗?不,没有改变,看下面
 59   memo1.Lines.Add(IntToStr(vByte));//vByte还是65
 60   //好像有点明白了,所谓的强制转换只不过是以某种类型去访问而已,用Char类型去访问Byte类型,没有真实的把把vByte的内容改变的
 61   vInt:=Integer(vByte);//vInt:=vByte 这样也可以的
 62   memo1.Lines.Add(IntToStr(vInt));
 63   vDou:=vByte;// Double(vByte)这个不能这样转换 ,浮点类型的转换比较特殊,为此还是用vDou:=vByte,这个编译器会实现转换的
 64 
 65   memo1.Lines.Add('----------------');
 66   //////////
 67   vInt:=1124;//这个超过了一个字节
 68   vChar:=Char(vInt); //用char类型去访问integer,把访问到的数据保存到vchar变量当中
 69   memo1.Lines.Add(vChar);//显示小写的b,因为char只能只能访问一个字节的内容这个1124超过了一个字节,vChar=Char(1124-1024),就是一个小写的b
 70   //看这个vByte就知道了上面vChar为啥是b了
 71   vByte:=vInt;//
 72   memo1.Lines.Add(IntToStr(vByte)); //显示100
 73 
 74   memo1.Lines.Add('----------------');
 75   /////////浮点类型很特殊,浮点类型有阶码之类的东西,不太熟,就不卖弄了
 76   vDou:=4095.3203125; //十进制的4095.3203125等于16进制的FFF.52
 77   //vByte:=vDou;//Double不能这么转化
 78   //vChar:=Char(vDou) 这个也不允许
 79   //不用试了,常规的要把浮点类型转化为整数、byte类型是不行的
 80   vInt:=Trunc(vDou); //这样了,把整数部分拿出来了
 81   Memo1.Lines.Add(IntToStr(vInt));
 82 
 83   ////好像没有说明白...........
 84   { 上面说到过这个
 85   vInt:=1124;//这个超过了一个字节
 86   vChar:=Char(vInt);
 87   用Char类型去访问Integer类型,那它只能容纳它那一字节的东西,也就是说它只能访问到一个字节的空间 1124的二进制是10001100100
 88   Char只能访问这个10001100100的后8位也就是01100100 ,这个01100100也就是十进制的100了
 89 
 90   Char读取Integer把范围变小了,但是Integer访问byte时,范围变大了,但是Byte最大也是255,这个integer访问Byte的变量,读到的也不会超过255
 91   }
 92 end;
 93 
 94 procedure TForm1.Button2Click(Sender: TObject);
 95 var
 96   vMyClass:TmyClass;
 97   vMyClass_X:TMyClass_X;
 98   Bool:Boolean;
 99 begin
100   try
101     vMyClass_X:=TMyClass_X.Create;
102     vMyClass:=TmyClass.Create;
103     vMyClass.FName:='Name_00';
104     TmyClass_A(vMyClass).Color:='';
105     ShowMessage(TmyClass_A(vMyClass).Color); //这里要报错的,强制转换,对啊,是强制转换,
106     //强制转化的本质不是真的把某个类型的实例转换为另一个类型的实例,只是以某个类型的作用范围去访问另一个类型的实例而已
107     //用这个TmyClass_A类型去访问TmyClass类型的实例vMyClass,TmyClass类没有FColor,vMyClass也不会有FColor,
108     //用这个TmyClass_A的作用范围访问 TmyClass类型的实例vMyClass,vMyClass没有FColor,这样访问是会报错的
109     //就算编译成功,还是会报错的
110     //编译成功不意味着没有错误
111     //这里报错的原因是vMyClass只有两个Field,而这个TmyClass_A有三个Field,TmyClass_A的字段分别是:FName,FAge,FColor
112     //以这个TmyClass_A类型去访问了vMyClass对象的FColor,FColor在TmyClass中不存在,意味着TmyClass_A(vMyClass).FColor访问到的是一个不安全的地址
113     //访问到不安全的地址很有可能会报错(Delphi7直接报错,DelphiXE释放vMyClass报错,DelphiXE6不报任何异常),
114     //可能不报错的原因:可能是这些Delphi不同版本对 对象内的内存不安全访问的处理机制不一样;还有就是下面代码中的一种情况:情况1
115 
116     ShowMessage(TmyClass_A(vMyClass).FName); //这里就是对的 //因为都有FName
117     //情况1  开始
118     TmyClass_A(vMyClass_X).Color:='紫色'; //本人猜测这么赋值其实刚好赋值给了vMyClass_X的第三个Field也就是赋值给了vMyClass_X.C;
119     ShowMessage(vMyClass_X.C);//紫色,充分证明猜想正确,TmyClass_A的实例中FColor排在第三个, vMyClass_X对象C也是排在第三个
120     //充分证明了所谓的类型转换,其实没有真的把类型转掉,只不过是以某种类型的作用范围去访问另一个类型的实例而已
121     ShowMessage(TmyClass_A(vMyClass_X).Color);
122     //情况1  结束
123   finally
124     try
125       FreeAndNil(vMyClass);
126     except
127       Bool:=True;
128       FreeAndNil(vMyClass_X);
129     end;
130     if not Bool then
131       FreeAndNil(vMyClass_X);
132   end;
133 end;
134 end.

 

 

 

 

Form

object Form1: TForm1
Left = 919
Top = 353
BorderStyle = bsDialog
Caption = 'Form1'
ClientHeight = 368
ClientWidth = 199
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 54
Top = 264
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object Memo1: TMemo
Left = 8
Top = 0
Width = 185
Height = 241
ImeName = '中文(简体) - 搜狗拼音输入法'
ScrollBars = ssBoth
TabOrder = 1
end
object Button2: TButton
Left = 56
Top = 320
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 2
OnClick = Button2Click
end
end

posted on 2021-08-19 11:10  码农的笔记  阅读(295)  评论(0编辑  收藏  举报