dxComponentPrinter1的奇怪问题

时间:2014-09-10 07:06:59

标签: delphi devexpress

这应该可以在“信不信由你”的问题下发布,但是......只要我在表单上放置dxComponentPrinter1(devexpress),我的函数就会停止工作:

Function GetUserFromWindows: string;
Var
   UserName : string;
   UserNameLen : Dword;
Begin
   UserNameLen := 100;
   SetLength(userName, UserNameLen) ;
   If GetUserName(PChar(UserName), UserNameLen) Then
     Result := Copy(UserName,1,UserNameLen - 1)
   Else
     Result := 'Unknown';
end;

当我删除它(dxComponentPrinter1)时,它可以正常工作。当dxComponentPrinter1在表单上时,我得到的错误是:

  

[dcc32错误] Unit3.pas(101):E2034实际参数太多[dcc32   错误] Unit3.pas(101):E2012表达式必须是BOOLEAN

Delphi XE6以红线突出显示:

  

GetUserName(PChar(UserName),UserNameLen)

如果我删除该功能,那么一切都编译好了。没错。 以前有人遇到过这个吗?

1 个答案:

答案 0 :(得分:4)

将组件添加到表单时,devExpress单元将添加到uses子句中。此单元定义了您的代码现在看到的名为GetUserName的函数,而不是您要在Windows单元中声明的函数。

您可以通过完全限定对GetUserName的调用来处理此问题。任

Windows.GetUserName

Winapi.Windows.GetUserName

取决于您在使用它时命名Windows单位的方式。

就个人而言,我希望看到这个GetUserFromWindows函数在低级单元而不是GUI单元中声明。

如果你想创建一个读取用户名并可以处理任意长度名称的函数,那么你可以选择这个可能过度工程的版本:

function UserName: string;
var
  Len: DWORD;
begin
  Len := 0;
  Win32Check(not GetUserName(nil, Len) and (GetLastError=ERROR_INSUFFICIENT_BUFFER));
  SetLength(Result, Len-1);
  Win32Check(GetUserName(PChar(Result), Len));
end;

请注意,我在这里没有完全限定,因为我假设您将此函数移动到不使用dexExpress UI组件的其他单元。