学了好多不了解的知识:

  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. s1 : String;
  4. s2 : String[];
  5. begin
  6. s1:='ç1很好';
  7. ShowMessage(s1); // 这里显示正常
  8. s2:=s1;
  9. ShowMessage(s2); // 这里显示乱码。
  10. // 问这个问题的原因是,在一个recode pack 里定义了String[255],但是使用Unicode字符给它赋值的时候,就乱码了,这该怎么办?
  11. // 原因是String[255]还是被翻译成单字节字符,即使在Delphi 2010里也是如此
  12. // 有没有办法定义一个类似 s2: UnicodeString[255]; 或者s2: WideString[255]这样的东西,好放在record里面使用
  13. end;
  14.  
  15. procedure TForm1.Button2Click(Sender: TObject);
  16. var
  17. S: ShortString; { 255个字符长度,256个字节}
  18. S1: String[]; { S1S的字符类型一样,通过使用String声明字符串并且在String后面用中括号规定字符个数的形式定义字符串}
  19. Len: Integer;
  20. begin
  21. S := 'Hello';
  22. Len := Ord(S[]); { Len现在包含S的长度为5Ord函数可以把一个字符类型转换为整数类型}
  23. ShowMessage(IntToStr(Len));
  24. Len := SizeOf(S); { Len现在包含的是ShortString类型的大小,为256字节,并不是字符串的长度}
  25. ShowMessage(IntToStr(Len));
  26. ShowMessage(IntToStr(Length(s1)));
  27. end;
  28.  
  29. procedure TForm1.Button3Click(Sender: TObject);
  30. var
  31. DirName :Array [..] of Char;
  32. myname : String;
  33. begin
  34. myname := 'very good';
  35. // DirName := myname; // 这里赋值通不过
  36. // DirName := PChar(myname); // 这里赋值通不过
  37. // PAnsiChar StrPCopy(PAnsiChar Dest, const AnsiString Source);
  38. // PWideChar StrPCopy(PWideChar Dest, const UnicodeString Source);
  39. StrPCopy(dirname, myname); //
  40. ShowMessage(DirName); // 这样才可以
  41. end;
  42.  
  43. procedure TForm1.Button4Click(Sender: TObject);
  44. var
  45. S: ShortString;
  46. S1: String[];
  47. begin
  48. S := 'Hello';
  49. ShowMessage(IntToStr(Length(s)));
  50. ShowMessage(IntToStr(Length(s1))); // 这里显示内容不定,因为S1没有进行初始化
  51. end;
  52.  
  53. procedure TForm1.Button5Click(Sender: TObject);
  54. var
  55. S: ShortString;
  56. S1: String[]; // String[255]的长度,不乘以2。它还是会被翻译成Byte
  57. S3: String;
  58. S4: Array [..] of Char; // 并没有在前后预留什么空间
  59. begin
  60. S := 'Hello';
  61. ShowMessage(IntToStr(Length(s))); //
  62. PWord(@S)^ := ;
  63. ShowMessage(IntToStr(Length(S))); // 100,因为自动管理的长度值被改了
  64. PWord(@S1)^ := ;
  65. ShowMessage(IntToStr(Length(S1))); // 200,因为自动管理的长度值被改了
  66.  
  67. SetLength(S3, );
  68.  
  69. ShowMessage(IntToStr(SizeOf(s))); // 256,之所以多了1,是因为有长度管理
  70. ShowMessage(IntToStr(SizeOf(s1))); // 256,之所以多了1,是因为有长度管理(还是最后一个字符是#0?不太可能)
  71. ShowMessage(IntToStr(SizeOf(s3))); //
  72. ShowMessage(IntToStr(SizeOf(s4))); //
  73. ShowMessage(s4); // 内容不定,因为没有初始化
  74. end;
  75.  
  76. // 删掉Array里的某个字符,相当于Delete函数
  77. procedure ArrayDelete(var pArray: array of Char; const nIndex, nCount: Integer);
  78. begin
  79. // Move ( const SourcePointer; var DestinationPointer; CopyCount : Integer ) ;
  80. Move(pArray[nIndex + nCount], pArray[nIndex], (StrLen(pArray) - nCount + ) * SizeOf(Char));
  81. end;
  82.  
  83. procedure TForm1.Button6Click(Sender: TObject);
  84. var
  85. a: array[..] of Char;
  86. begin
  87. a := '';
  88. ArrayDelete(a, , );
  89. ShowMessage(a);
  90. end;

lstrcpy
你也可以用windows单元里的lstrcpy函数。
这个是windows提供的等价strcpy的函数。
性能比strcpy低,但是有异常处理。

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

var
DirName : String[255]
begin
// 若干赋值
Delete(DirName, Length(DirName), 1);
end;

现在改成:
var
DirName : Array [0..254] of Char
begin
// 这个Delete应该怎么写?没有初始化的字符,默认都是#0?
end;

比方说S1是Array [0..255] of Char
目前S1的值是MyName
我就是想把最后一个字符去掉,改成MyNam

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

应该是错误的办法:
move(a[1], a[0], strlen(a)*sizeof(char));
去看tlist的delete方法

可能的办法:
a[5] := 0;

聪明办法:
procedure ArrayDelete(var pArray: array of Char; const nIndex, nCount: Integer);
begin
Move(pArray[nIndex + nCount], pArray[nIndex], (StrLen(pArray) - nCount + 1) * SizeOf(Char));
end;

var
a: array[0..255] of Char;
begin
a := '123456789';
ArrayDelete(a, 2, 2);
ShowMessage(a);
end;

笨办法:
mystring:=DirName;
mystring:=LeftStr(mystring, Length(mystring)-1);
StrPCopy(DirName, mystring);

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

疑问:
1. Array数组没有用完的时候,后面的字符会被初始化成什么?什么才是字符串准确终止?
2. String可否包含#0?应该可以。另外要学会使用String的头部数据。
3. 据说AnsiString和UnicodeString可以相互赋值
4. move只是移动内存数据 不会覆盖不被移动的区域
那a这个array是如何感受到,它的字符串变短了呢?
array不是有一个前缀,这样才能知道当前array用了多长的空间

学习了:
1. 新学了StrLen、Delete函数
2. 移动开发,String下标从0开始

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

procedure TForm1.Button7Click(Sender: TObject);
var
S1: Array [0..255] of Char;
S2: String[255];
begin
S1:='0123456789';
S1[3]:=#0;
ShowMessage(String(S1)); // 012,我估计是转换到String的时候,碰到#0就停了。但其实S1的长度仍是10

S2:='0123456789';;
Byte(S2[0]) := 3;
ShowMessage(String(S2)); // 012,修改S2的长度管理,人工强行变成只使用了3个字符。
end;

这说明,array看到#0就停止。String[255]则是有一个前缀在管理使用的长度

这样就截断字符串了,就是你说的Delete,而且不考虑删除中间

最后一个小小问题:Array有一个前缀来管理使用的长度吗?
回答:没有。但是array of Char又有了。

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

type
T = packed record
A: char;
B: string[5];
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
ShowMessage(IntToStr(SizeOf(T)));
end;

答案是8,即2+1+5

String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串(内含许多实验测试)的更多相关文章

  1. 程序包需要 NuGet 客户端版本“2.12”或更高版本,但当前的 NuGet 版本为“2.8.50313.46”

    由于安装install-package newtonsoft.json 会出现需要 NuGet 客户端版本“2.12”或更高版本来安装,于是换成旧版的newtonsoft.json   PM> ...

  2. html5调用本机摄像头兼容谷歌浏览器高版本,谷歌浏览器低版本,火狐浏览器

    做这个功能的时候在网上查了一些资料,代码如下,在这个代码在谷歌浏览器46版本是没问题的,在火狐浏览器也行,但是在谷歌浏览器高版本下是不兼容的 <div id="body"&g ...

  3. jquery里把数组转换成json的方法

    首先来看,jquery里自带的,和json相关的函数: 1.$.parseJSON  :  用来解析JSON字符串,返回一个对象. 什么叫“JSON字符串”? 比如: var a={name:&quo ...

  4. 记一次如何解决低版本jar包里面的bug,不适宜替换成高版本的经历

    背景:目前正在迭代开发的项目,应用户要求新增一个电子文档转换的功能,即将不标准的excel文件转换为标准的excel文件(标准模板). 选择:pio ,本项目里面本来就有poi的jar包 问题:项目里 ...

  5. CDH6 高版本hbase+solr实现二级索引

    之前的环境是单独下载的CDH组件包搭建的集群,但是因为hadoop版本过低导致漏洞无法修复,重新搭建高版本集群环境. 新集群环境: 主要组件:hadoop,hbase,zookeeper,Key-Va ...

  6. 关于JDK高版本下RMI、LDAP+JNDI bypass的一点笔记

    1.关于RMI 只启用RMI服务时,这时候RMI客户端能够去打服务端,有两种情况,第一种就是利用服务端本地的gadget,具体要看服务端pom.xml文件 比如yso中yso工具中已经集合了很多gad ...

  7. java高版本下各种JNDI Bypass方法复现

    目录 0 前言 1 Java高版本JNDI绕过的源代码分析 1.1 思路一的源码分析 1.2 思路二的源码分析 2 基于本地工厂类的利用方法 2.1 org.apache.naming.factory ...

  8. Java反序列化中jndi注入的高版本jdk绕过

    群里大佬们打哈哈的内容,菜鸡拿出来整理学习一下,炒点冷饭. 主要包含以下三个部分: jndi注入原理 jndi注入与反序列化 jndi注入与jdk版本 jndi注入原理: JNDI(Java Name ...

  9. 警惕!高版本VS发布时预编译导致Mono中Razor找不到视图

    早前一段时间,一位朋友在Q群里面找到我,说它按照<Linux.NET学习手记>的操作,把一个ASP.NET MVC 4.0的项目部署到Mono之后出现Razor无法找到视图的现象.当时费了 ...

随机推荐

  1. Citrix 服务器虚拟化之二 Xenserver加域管理

    Citrix 服务器虚拟化之二   Xenserver加域管理 如果要使用多个用户和用户组来管理XenServer服务器,就必须使用 Active Directory 用户账户进行身份验证.XenSe ...

  2. [置顶] HMM Tutorial 隐马尔科夫模型

    有一个月没有写博客了,这一个月系统的学习了HMM model.  上周周五做了个report 感觉还好.  所以把Slide贴上来.

  3. 谁能告诉我war包的作用及使用方法。。。。。。

    链接地址:http://zhidao.baidu.com/link?url=iliyTcmsTKb1K4gHMtWUsRIBaXglyOKIQsWwdrgvydvnaUHLe0KEoHvLVz8tLY ...

  4. java--多线程之Runnable

    引读: 上一篇博文中讲了Thread的继承,存在一个问题就是,如果类本身已经继承了某个父类,又要继承Thread,导致多重继承. [但是我们知道接口是实现多重继承的重要方式].java提供了Runna ...

  5. Rfc2898DeriveBytes解密如何通过java实现

    原文 Rfc2898DeriveBytes解密如何通过java实现 这个找了半天,还是不太懂,密码一点不懂,直接上来问了 Rfc2898DeriveBytes对应的是PBKDF2WithHmacSHA ...

  6. 获取客户端IPAsp.Net

    #region 获取客户端IP地址 /// <summary> /// 获取客户端IP地址 /// </summary> /// <returns></ret ...

  7. OGR 官方文档

    OGR 官方文档 http://www.gdal.org/ogr/index.html The OGR Simple Features Library is a C++ open source lib ...

  8. poll系统调用的内核态实现机制分析

    版权所有,转载请标明出处   All right reserved,Copyright by 徐行而至 浅唱而归 前面已经比较详尽的分析了系统调用引发的内核执行过程,本文将继续分析一下linux2.6 ...

  9. 真机iOS SDK升级后xcode不能进行真机调试 怎么办

    今天升级了一下iPod的SDK到iOS8,xcode仅仅能支持到7.1,真机调试遇到问题???以下是解决的方法! 找到xcode,点击右键.打开显示包内容,按路径Contents/Develpoer/ ...

  10. C# - 接口的继承

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...