我正在将Delphi项目移植到64位,并且我遇到了一行代码,其中包含IN运算符.
编译器引发此错误
E2010不兼容类型:'整数'和'Int64'
我写了这个示例应用程序来复制问题.
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
Var
I : Integer;
L : Array of string;
begin
try
if I in [0, High(L)] then
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常32位,但为什么不用Delphi XE2 64位编译?我该如何解决这个问题?
*更新*
似乎我的帖子引起了很多混淆(对不起),只是为了解释我移植的原始代码更复杂,我只是将这段代码作为样本来说明问题.原始代码使用in运算符来检查一个值(小于255)是否属于一组值(所有次要或等于255),如此
i in [0,1,3,50,60,70,80,127,High(LArray)]
Run Code Online (Sandbox Code Playgroud) 我正在使用该ActnPopup.TPopupActionBar组件,我想添加一些标准操作,如TFileOpen,TFileOpenWith等.问题是如何在运行时将这些操作添加到TPopupActionBar中?
我正在使用TRttiMethod.Invoke函数创建类的实例,但是当构造函数或方法重载时,rtti不会调用正确的方法.
我写了一个示例应用来说明我的问题.
program ProjectFoo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Rtti,
System.SysUtils;
type
TFoo=class
public
constructor Create(Value : Integer);overload;
constructor Create(const Value : string);overload;
function Bar(value : integer) : Integer; overload;
function Bar(const value : string) : string; overload;
end;
{ TFoo }
constructor TFoo.Create(Value: Integer);
begin
Writeln(Value);
end;
function TFoo.Bar(value: integer): Integer;
begin
Writeln(Value);
Result:=value;
end;
function TFoo.Bar(const value: string): string;
begin
Writeln(Value);
Result:=value;
end;
constructor TFoo.Create(const Value: string);
begin
Writeln(Value);
end;
var
c : TRttiContext;
t : …Run Code Online (Sandbox Code Playgroud) 我正在使用这个代码做一个透明的纯色形式.
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
BlendFunction: TBlendFunction;
BitmapPos: TPoint;
BitmapSize: TSize;
exStyle: DWORD;
Bitmap: TBitmap;
begin
exStyle := GetWindowLongA(Handle, GWL_EXSTYLE);
if (exStyle and WS_EX_LAYERED = 0) then
SetWindowLong(Handle, GWL_EXSTYLE, exStyle or WS_EX_LAYERED);
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat …Run Code Online (Sandbox Code Playgroud) 我正在使用TIdHTTPServer组件,到目前为止工作正常,但是当我使用此代码添加SSL支持时
SSLHandler:= TIdServerIOHandlerSSLOpenSSL.Create(nil);
SSLHandler.SSLOptions.CertFile := 'foo.pem';
SSLHandler.SSLOptions.KeyFile := 'foo.pem';
SSLHandler.SSLOptions.RootCertFile := 'foo.pem';
SSLHandler.SSLOptions.Method := sslvSSLv23;
SSLHandler.SSLOptions.Mode := sslmServer;
SSLHandler.SSLOptions.VerifyDepth := 1;
SSLHandler.SSLOptions.VerifyMode := [sslvrfPeer,sslvrfFailIfNoPeerCert,sslvrfClientOnce];
idHttpServer1.IOHandler := SSLHandler;
IdHTTPServer1.Bindings.Add.Port := 80;
IdHTTPServer1.Bindings.Add.Port := 443;
IdHTTPServer1.Active := True;
Run Code Online (Sandbox Code Playgroud)
服务器只处理https请求,如果我发送http请求,则抛出此异常
Error accepting connection with SSL. error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request
问题是:我可以使用单个TIdHTTPServer组件来处理http和https请求吗?如果答案是肯定如何做到这一点?如果答案为否,我必须创建两个TIdHTTPServer实例,一个用于http,另一个用于https?
我正在使用像这样的脚本构建我的Delphi应用程序
call "C:\Program Files (x86)\Embarcadero\RAD Studio\11.0\bin\rsvars.bat"
msbuild.exe "C:\Projects\Foo\Bar.dproj"
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个选项将应用程序部署到OSX(或IOS)系统修改这样的脚本,那么可以从命令行部署OSX或IOS Delphi项目吗?
实际上我正在使用TIdHTTP组件从互联网上下载文件.我想知道是否可能暂停并使用此组件恢复下载o也许是另一个indy组件.
这是我目前的代码,这适用于下载文件(没有恢复),但是.现在我想暂停下载关闭我的应用程序,当我的应用程序重新启动后,从最后保存的位置恢复下载.
var
Http: TIdHTTP;
MS : TMemoryStream;
begin
Result:= True;
Http := TIdHTTP.Create(nil);
MS := TMemoryStream.Create;
try
try
Http.OnWork:= HttpWork;//this event give me the actual progress of the download process
Http.Head(Url);
FSize := Http.Response.ContentLength;
AddLog('Downloading File '+GetURLFilename(Url)+' - '+FormatFloat('#,',FSize)+' Bytes');
Http.Get(Url, MS);
MS.SaveToFile(LocalFile);
except
on E : Exception do
Begin
Result:=False;
AddLog(E.Message);
end;
end;
finally
Http.Free;
MS.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud) 我写了一个小应用程序来使用indy组件传输文件,现在我想在传输完成时启动防病毒程序来检查文件.
如何在下载完成后执行客户端安装的防病毒程序?
更新 我需要在下载文件时执行类似于firefox的操作,然后执行机器中安装的防病毒软件.
提前致谢.
我需要知道,如果在一个字符串中的所有字符都相等(由相同的字符组成).函数必须返回true或false,具体取决于字符串的所有元素是否等于特定的char.
我写了这个功能很好,但我正在寻找一个更优化(最快)的解决方案,字符串可以有数千个字符.
function AllElementsAreEqual(Element:Char;Str:String):Boolean;
var
i : Integer;
begin
Result:=True;
if Str<>'' then
for i:=1 to Length(Str) do
if Str[i]<>Element then
begin
Result:= False;
exit;
end;
end;
Run Code Online (Sandbox Code Playgroud)
UPDATE
最终使用了Barry Kelly Suggestion并添加了inline指令,性能得到了显着提升.
function AllElementsAreEqual(Const Element:Char;Str:String):Boolean;inline;
type
ArrayInt = Array of Integer;
var
i : Integer;
Delta: Integer;
List : ArrayInt;
Test : Integer;
begin
Result:=True;
Delta:=(Length(Str) mod 4);
if Delta<>0 then
Str:=Str+StringOfChar(Element,4-Delta);
Test:=Ord(Element) + Ord(Element) shl 8 + Ord(Element) shl 16 + Ord(Element) shl 24;
List:=ArrayInt(@(Str[1]));
for i:=0 to …Run Code Online (Sandbox Code Playgroud) 我目前正在使用此代码,但没有列出任何内容.我错过了什么?
program ListAttrs;
{$APPTYPE CONSOLE}
uses
Rtti,
SysUtils;
type
TPerson = class
private
FName: String;
FAge: Integer;
public
[NonEmptyString('Must provide a Name')]
property Name : String read FName write FName;
[MinimumInteger(18, 'Must be at least 18 years old')]
[MaximumInteger(65, 'Must be no older than 65 years')]
property Age : Integer read FAge write FAge;
end;
procedure test;
var
ctx : TRttiContext;
lType : TRttiType;
lAttribute: TCustomAttribute;
lProperty : TRttiProperty;
begin
ctx := TRttiContext.Create;
lType := ctx.GetType(TPerson);
for lProperty in lType.GetProperties …Run Code Online (Sandbox Code Playgroud) delphi ×10
delphi-7 ×2
delphi-xe ×2
delphi-xe2 ×2
indy ×2
rtti ×2
64-bit ×1
attributes ×1
delphi-2010 ×1
delphi-xe4 ×1
http ×1
string ×1
winapi ×1