String 转换 pchar 出现乱码 不知道为什么,一个正常的string类型转换成PCHAR后有字符变成其他的了,or 变成‘#0#0’兄弟们有没有遇到过啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 var ADatabase, AServerName, ALoginName, APassword: string; AConnectString: string; AConnectString := Format('Provider=SQLOLEDB.1;Password=%s;Persist Security ' + 'Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s', [APassword, ALoginName, AServerName, ADatabase]); Result := StrPCopy(AConnectString); function GetConnectString: Pchar;var ADatabase, AServerName, ALoginName, APassword: string; AConnectString: string;begin AConnectString := ''; ADatabase := GetSoftVariable(Pchar('Database')); AServerName := GetSoftVariable(Pchar('ServerName')); ALoginName := GetSoftVariable(Pchar('LoginName')); APassword := GetSoftVariable(Pchar('Password')); if (ADatabase <> '') and (AServerName <> '') and (ALoginName <> '') then AConnectString := Format('Provider=SQLOLEDB.1;Password=%s;Persist Security ' + 'Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s', [APassword, ALoginName, AServerName, ADatabase]); Result := PChar(AConnectString);end;AConnectString 经过PChar函数转换后就不对了 把AConnectString 定义成全局变量,或者返回值改成String这里AConnectString 是函数内部变量,函数返回后, 变量释放了。而程序返回的是个指针,指向AConnectString 的指针,所以,函数结束返回的内容是不对的。 我上面的代码其实是通过DLL,返回连接字符串 日志-病毒-网络-操作系统-安全-c#-asp.net-java-delphi-sql-oracle学习资源 在这里可以找找http://japee.com.cn/jew/bbs.aspx 如果是dll,那这样使用更好:function GetConnectString(buf:Pchar):boolean;...........StrPCopy(buf,AConnectString);把串拷贝到buf中,buf由主程序来申请并管理。 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}function GetConnectString: Pchar;var ADatabase, AServerName, ALoginName, APassword: string;begin ADatabase := StrPas(Pchar('10.137.199.235')); AServerName := StrPas(Pchar('ESSoftDB')); ALoginName := StrPas(Pchar('sa')); APassword := StrPas(Pchar('bachelor')); if (ADatabase <> '') and (AServerName <> '') and (ALoginName <> '') then begin Result := Pchar(Format('Provider=SQLOLEDB.1;Password=%s;Persist Security ' + 'Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s', [APassword, ALoginName, AServerName, ADatabase])); ShowMessage(Result) end;end;procedure TForm1.Button1Click(Sender: TObject);var a: string;begin a := GetConnectString; ShowMessage(a);end;end. 上面的例子 ShowMessage(Result) 正常,ShowMessage(a); 不正常 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function GetConnectString: {Pchar既然接收使用的是String,这里就直接返回String}String; var ADatabase, AServerName, ALoginName, APassword: string; begin ADatabase := '10.137.199.235'; //这就是一个String不需要转 AServerName := 'ESSoftDB'; ALoginName := 'sa'; APassword := 'bachelor'; if (ADatabase <> '') and (AServerName <> '') and (ALoginName <> '') then begin Result := Format('Provider=SQLOLEDB.1;Password=%s;Persist Security ' + 'Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s', [APassword, ALoginName, AServerName, ADatabase])); //Format返回的也是一个String ShowMessage(Result) end; end; procedure TForm1.Button1Click(Sender: TObject); var a: string; begin a := GetConnectString; ShowMessage(a); end; end. 1.ADatabase它就是一個string;2.format處理後也是一個string。綜上:不需要pchar來convert,直接string... Delphi文本编辑器保存后出现字体格式代码 想请教一下,delphi可以做单片机的屏幕显示程序吗? 请教,如何让richedit的行高等于该行字体的实际高度? 自认为较难的问题,看看多少时间可以解决,大家帮忙 关于DELPHI的变量声明问题(初学者)请大家帮忙,在线等待 还是有关于delphi 6.0+ado+odbc后插入,删除,异常的问题 关于重载函数问题 怎么显示动态创建的按钮? 为什么会这样?那该怎么解决呢? (关于读写文件的问题) 用table控件的BatchMove函数转存数据是如何快速简单修改字段名? 急!关于EXCEL打印行数的设置 股票软件
ADatabase, AServerName, ALoginName, APassword: string;
AConnectString: string; AConnectString := Format('Provider=SQLOLEDB.1;Password=%s;Persist Security ' +
'Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s', [APassword, ALoginName,
AServerName, ADatabase]); Result := StrPCopy(AConnectString);
var
ADatabase, AServerName, ALoginName, APassword: string;
AConnectString: string;
begin
AConnectString := '';
ADatabase := GetSoftVariable(Pchar('Database'));
AServerName := GetSoftVariable(Pchar('ServerName'));
ALoginName := GetSoftVariable(Pchar('LoginName'));
APassword := GetSoftVariable(Pchar('Password')); if (ADatabase <> '') and (AServerName <> '') and (ALoginName <> '') then
AConnectString := Format('Provider=SQLOLEDB.1;Password=%s;Persist Security ' +
'Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s', [APassword, ALoginName,
AServerName, ADatabase]); Result := PChar(AConnectString);
end;
AConnectString 经过PChar函数转换后就不对了
而程序返回的是个指针,指向AConnectString 的指针,所以,函数结束返回的内容是不对的。
在这里可以找找http://japee.com.cn/jew/bbs.aspx
如果是dll,那这样使用更好:function GetConnectString(buf:Pchar):boolean;
...........
StrPCopy(buf,AConnectString);把串拷贝到buf中,buf由主程序来申请并管理。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function GetConnectString: Pchar;
var
ADatabase, AServerName, ALoginName, APassword: string;
begin
ADatabase := StrPas(Pchar('10.137.199.235'));
AServerName := StrPas(Pchar('ESSoftDB'));
ALoginName := StrPas(Pchar('sa'));
APassword := StrPas(Pchar('bachelor'));
if (ADatabase <> '') and (AServerName <> '') and (ALoginName <> '') then begin
Result := Pchar(Format('Provider=SQLOLEDB.1;Password=%s;Persist Security ' +
'Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s', [APassword,
ALoginName, AServerName, ADatabase]));
ShowMessage(Result)
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
a: string;
begin
a := GetConnectString;
ShowMessage(a);
end;
end.
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} function GetConnectString: {Pchar既然接收使用的是String,这里就直接返回String}String;
var
ADatabase, AServerName, ALoginName, APassword: string;
begin
ADatabase := '10.137.199.235'; //这就是一个String不需要转
AServerName := 'ESSoftDB';
ALoginName := 'sa';
APassword := 'bachelor';
if (ADatabase <> '') and (AServerName <> '') and (ALoginName <> '') then begin
Result := Format('Provider=SQLOLEDB.1;Password=%s;Persist Security ' +
'Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s', [APassword,
ALoginName, AServerName, ADatabase])); //Format返回的也是一个String
ShowMessage(Result)
end;
end; procedure TForm1.Button1Click(Sender: TObject);
var
a: string;
begin
a := GetConnectString;
ShowMessage(a);
end;
end.
2.format處理後也是一個string。
綜上:不需要pchar來convert,直接string...