在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
学了好多不了解的知识: procedure TForm1.Button1Click(Sender: TObject); var s1 : String; s2 : String[255]; begin s1:='ç1很好'; ShowMessage(s1); // 这里显示正常 s2:=s1; ShowMessage(s2); // 这里显示乱码。 // 问这个问题的原因是,在一个recode pack 里定义了String[255],但是使用Unicode字符给它赋值的时候,就乱码了,这该怎么办? // 原因是String[255]还是被翻译成单字节字符,即使在Delphi 2010里也是如此 // 有没有办法定义一个类似 s2: UnicodeString[255]; 或者s2: WideString[255]这样的东西,好放在record里面使用 end; procedure TForm1.Button2Click(Sender: TObject); var S: ShortString; { 255个字符长度,256个字节} S1: String[255]; { S1和S的字符类型一样,通过使用String声明字符串并且在String后面用中括号规定字符个数的形式定义字符串} Len: Integer; begin S := 'Hello'; Len := Ord(S[0]); { Len现在包含S的长度为5,Ord函数可以把一个字符类型转换为整数类型} ShowMessage(IntToStr(Len)); Len := SizeOf(S); { Len现在包含的是ShortString类型的大小,为256字节,并不是字符串的长度} ShowMessage(IntToStr(Len)); ShowMessage(IntToStr(Length(s1))); end; procedure TForm1.Button3Click(Sender: TObject); var DirName :Array [0..255] of Char; myname : String; begin myname := 'very good'; // DirName := myname; // 这里赋值通不过 // DirName := PChar(myname); // 这里赋值通不过 // PAnsiChar StrPCopy(PAnsiChar Dest, const AnsiString Source); // PWideChar StrPCopy(PWideChar Dest, const UnicodeString Source); StrPCopy(dirname, myname); // ShowMessage(DirName); // 这样才可以 end; procedure TForm1.Button4Click(Sender: TObject); var S: ShortString; S1: String[255]; begin S := 'Hello'; ShowMessage(IntToStr(Length(s))); ShowMessage(IntToStr(Length(s1))); // 这里显示内容不定,因为S1没有进行初始化 end; procedure TForm1.Button5Click(Sender: TObject); var S: ShortString; S1: String[255]; // String[255]的长度,不乘以2。它还是会被翻译成Byte S3: String; S4: Array [0..255] of Char; // 并没有在前后预留什么空间 begin S := 'Hello'; ShowMessage(IntToStr(Length(s))); // 5 PWord(@S)^ := 100; ShowMessage(IntToStr(Length(S))); // 100,因为自动管理的长度值被改了 PWord(@S1)^ := 200; ShowMessage(IntToStr(Length(S1))); // 200,因为自动管理的长度值被改了 SetLength(S3, 255); ShowMessage(IntToStr(SizeOf(s))); // 256,之所以多了1,是因为有长度管理 ShowMessage(IntToStr(SizeOf(s1))); // 256,之所以多了1,是因为有长度管理(还是最后一个字符是#0?不太可能) ShowMessage(IntToStr(SizeOf(s3))); // 4 ShowMessage(IntToStr(SizeOf(s4))); // 512 ShowMessage(s4); // 内容不定,因为没有初始化 end; // 删掉Array里的某个字符,相当于Delete函数 procedure ArrayDelete(var pArray: array of Char; const nIndex, nCount: Integer); begin // Move ( const SourcePointer; var DestinationPointer; CopyCount : Integer ) ; Move(pArray[nIndex + nCount], pArray[nIndex], (StrLen(pArray) - nCount + 1) * SizeOf(Char)); end; procedure TForm1.Button6Click(Sender: TObject); var a: array[0..255] of Char; begin a := '123456789'; ArrayDelete(a, 2, 3); ShowMessage(a); end; lstrcpy ------------------------------------------------ var 现在改成: 比方说S1是Array [0..255] of Char ------------------------------------------------ 应该是错误的办法: 可能的办法: 聪明办法: var 笨办法: ------------------------------ 疑问:
-------------------------------- procedure TForm1.Button7Click(Sender: TObject); S2:='0123456789';; 这说明,array看到#0就停止。String[255]则是有一个前缀在管理使用的长度 这样就截断字符串了,就是你说的Delete,而且不考虑删除中间 最后一个小小问题:Array有一个前缀来管理使用的长度吗? -------------------------------- type procedure TForm1.Button8Click(Sender: TObject); 答案是8,即2+1+5 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论