

Delphi11中遇到的错误
AnsiChar,AnsiString,WideChart,String,PWideChar,PAnsichar,Unicode,UnicodeString,char,pchar区别
AnsiChar 和 AnsiString区别 ,两者都是ANSI字符,占1字节
AnsiChar每个字符占1个字节,如:aa: array[0..63] of AnsiChar; //aa数组中每个字符占1个字节
AnsiString是动态的一个字符串,而字符串中每个字符用1个字节表示
WideChart和String, 两者都是Unicode 字符,即UnicodeString类型
WideChar每个字符占2个字节,如:aa: array[0..63] of WideChar; //aa数组中每个字符占1个字节
String是动态的一个字符串,而字串中每个字符用2个字节表示,也是Unicode或UnicodeString
PWideChar和PAnsichar,则是两种的指针
Char,PChar旧版才用,相当于AnsiChar,PAnsiChar,新版为兼容System中定义,PChar=PWideChar
Ansichar转String,直接string(p^.h_Name)
String转AsnsiChar,例:PAnsiChar(AnsiString(edit1.txt)),//新版edit默认为string,先转为Ansi编码,再转为PAnsiChar
1. [dcc32 Error] FunU.pas(50): E2010 Incompatible types: 'PWideChar' and 'PAnsiChar'
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^); //这句提示上面的错误,原因是p2申明为pchar类型, 将p2申明为PAnsiChar类型
修改:var p2:pchar, 改为var p2:PAnsiChar 如果为中文则改为PWideChar类型
lpRemoteName := PAnsiChar(AnsiString('\\' + CheckIP)); // 这行也提示这个错误,经点击LpRemoteName跳到Winapi.WinSock单元查看其为PWideChar字符
2. [dcc32 Warning] FunU.pas(31): W1057 Implicit string cast from 'AnsiChar' to 'string'
原因:你可能隐式的将AnsiChar转为了String类型,虽然delphi默认string为AnsiChar类型,而delphi2009以后string默认为UnicodeString(UTF-16编码)类型
解决方法:新版直接在前面加String函数显示转为换String(UnicodeSTring)
将:Result := p^.h_Name;改为Result := string(p^.h_Name);
3. [dcc32 Error] FunU.pas(76): E2010 Incompatible types: 'PAnsiChar' and 'array[0..63] of Char'
GetHostName(Buffer, SizeOf(Buffer)); //这句的提示上面的错误,查找发现Buffer定义的char类型,再看所有引用Buffer的行都提示这个错误
解决:点击GetHostName跳到Winapi.WinSock单元发现GetHostName的buffer形参为MarshaledAString,经搜索发现MarshaledAString为AnsiChar类型
将Buffer: array[0..63] of Char;改为:Buffer: array[0..63] of AnsiChar; //所有引用Buffer的行都提示这个错误
4. [dcc32 Warning] MainU.pas(229): W1044 Suspicious typecast of string to PAnsiChar
WinExec(pchar(str), SW_SHOWMAXIMIZED) //这句提示上面的错误,原因新版delphi中没有Pchar类型,鼠标移动WinExec上等一下出现的提示框第一个参数为PAnsiChar类型
改为:WinExec(PAnsichar(AnsiString(str)), SW_SHOWMAXIMIZED) //先把Str转为Ansi编码,再转为指针就可以了
5. [dcc32 Error] HighCanU.pas(440): E2010 Incompatible types: 'PWideChar' and 'string'
if CopyFile(sf1,df1)=True then Memo1.Lines.Add('备份文件'+sf1+'成功!'); //这句提示上面的错误
改为:if CopyFile(PWideChar(sf1),PWideChar(df1),False ) =True then Memo1.Lines.Add('备份文件'+sf1+'成功!');
注:delphi11中CopyFile的调用三个参加都要加,D7时只给两个参数就可以了
5. 获取内存列表信息的函数提示Cound not convert variant of type (Null) into type (OleStr)
//不管它,只有在虚拟机上运行才提示这个
6. [dcc32 Warning] MainU.pas(1453): W1036 Variable 'list' might not have been initialized
list := TStringList.Create; //原因这句要写到try外面,不能写到try里面云
7. 有目录打不开,如:C:\Users\tieguo\Recent,主要是调用DirectoryExists判断符号链接目录时要多加一个参数False,否则目录是否存在再shell打开的就会找不到目录
如:if DirectoryExists(path) then改为if DirectoryExists(path,False) then
8. 通过Findwindows查找当前窗口句柄的要用Self.Caption而不能用Application.title
Holld:=Self.caption
Found := FindWindow(nil, PChar(Hold));
9. 找不到函数所用的单元,右击Refactor--Find Unit,输入函数名或类名就可以找到所在的单元
10. 调用框架单元中的方法时提示[dcc32 Error] MainU.pas(55): E2076 This form of method call only allowed for class methods or constructor 这个方法仅用于类方法或构造函数
TFrameFr1.ListBox1ItemClick(Sender,Item); //这句提示上面的错误,原因ListBox1ItemClick是个实例的方法,而TFrameFr1是个类,
//已在单元文件的Type处声明FrameFr11:TFrameFr1 即framefr11为TFrameFr1类的实例,
改为: FrameFr11.ListBox1ItemClick(Sender,Item);
注:这里的框架单元名为FrameU,窗体名为framefr1,引用该框架的单元uses处已加上FrameU,Type处FrameFr11:TFrameFr1,表明FrameFr11为框架窗体FrameFr1,注意引用前加T
var
WideStr: PWideChar;
AnsiStr: PAnsiChar;
BufSize: Integer;
begin
WideStr := ...; // 获取或声明PWideChar类型的字符串
BufSize := WideCharToMultiByte(CP_ACP, 0, WideStr, -1, nil, 0, nil, nil);
GetMem(AnsiStr, BufSize);
try
WideCharToMultiByte(CP_ACP, 0, WideStr, -1, AnsiStr, BufSize, nil, nil);
// 使用AnsiStr...
finally
FreeMem(AnsiStr);
end;
end;