奇怪的问题,程序很简单,大家应该都看得懂,为什么出问题就莫名其妙了。

dawnxiao 2003-08-04 04:16:53
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
ItemIDs : array of PWideChar;
public
{ Public declarations }
end;

var
Form1: TForm1;
const ItemsNum : Longint = 8;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
I : Integer;
begin
SetLength(ItemIDs, ItemsNum);

For I := 0 To 7 do
begin
ItemIDs[I] := PWideChar(WideString('Tag'+IntToStr(I+1)));
//showmessage(ItemIDs[I]);
end;

{ItemIDs[0] := PWideChar(WideString('Tag1'));
ItemIDs[1] := PWideChar(WideString('Tag2'));
ItemIDs[2] := PWideChar(WideString('Tag3'));
ItemIDs[3] := PWideChar(WideString('Tag4'));
ItemIDs[4] := PWideChar(WideString('Tag5'));
ItemIDs[5] := PWideChar(WideString('Tag6'));
ItemIDs[6] := PWideChar(WideString('Tag7'));
ItemIDs[7] := PWideChar(WideString('Tag8'));}

For I:=0 To ItemsNum-1 do showmessage(ItemIDs[I]);

end;

end.

用循环赋值,数组里面的值莫名其妙,直接赋值的话就正常。
希望懂得人指教!
...全文
50 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawnxiao 2003-08-04
  • 打赏
  • 举报
回复
感谢感谢。解贴!
firetoucher 2003-08-04
  • 打赏
  • 举报
回复
另外,记住在退出的时候释放掉ItemIDs[I]
firetoucher 2003-08-04
  • 打赏
  • 举报
回复
For I := 0 To 7 do
begin
Getmem(PChar(ItemIDs[I]),20);
ItemIDs[I] := PWideChar(StringToWideChar('Tag'+IntToStr(I+1),ItemIDs[I],20));
end;
dawnxiao 2003-08-04
  • 打赏
  • 举报
回复
to:firetoucher(风焱)
还是不太明白,代码写出来看看好么。
IORILI 2003-08-04
  • 打赏
  • 举报
回复
我刚才试了 没问题呀
firetoucher 2003-08-04
  • 打赏
  • 举报
回复
不对!所有的ItemIDs应该先获得内存GetMem,然后进行字符串的拷贝,而不应该用指针直接指向,你这样 ItemIDs指向的是同一个地址!
你用(ItemIDs[0])[3]:='a';然后再showmessage就知道了!
firetoucher 2003-08-04
  • 打赏
  • 举报
回复
不对!所有的ItemIDs应该先获得内存GetMem,然后进行字符串的拷贝,而不应该用指针直接指向,你这样 ItemIDs指向的是同一个地址!
你用(ItemIDs[0])[3]:='a';然后再showmessage就知道了!
dawnxiao 2003-08-04
  • 打赏
  • 举报
回复
ItemIDs[I] := PWideChar(WideString(concat('Tag',IntToStr(I+1))));
结果一样。
IORILI 2003-08-04
  • 打赏
  • 举报
回复
ItemIDs[I] := PWideChar(WideString('Tag'+IntToStr(I+1)));错了
应该用合并字符串
dawnxiao 2003-08-04
  • 打赏
  • 举报
回复
这个数组是作为参数传入一个方法。参数类型就是PWideChar。不能改。
fengjn 2003-08-04
  • 打赏
  • 举报
回复
使用panischar应该不会出现这种现象吧

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧