小编Sal*_*dor的帖子

在Delphi 64位项目中使用in运算符

我正在将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)

delphi 64-bit delphi-xe2

6
推荐指数
2
解决办法
980
查看次数

如何在运行时向ActnPopup.TPopupActionBar组件添加标准操作?

我正在使用该ActnPopup.TPopupActionBar组件,我想添加一些标准操作,如TFileOpen,TFileOpenWith等.问题是如何在运行时将这些操作添加到TPopupActionBar中?

delphi delphi-xe

6
推荐指数
1
解决办法
1005
查看次数

TRttiMethod.Invoke函数在重载方法中不起作用?

我正在使用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)

delphi rtti delphi-xe2

6
推荐指数
1
解决办法
3731
查看次数

如何在WS_EX_LAYERED表单上绘制控件?

我正在使用这个代码做一个透明的纯色形式.

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)

delphi winapi

6
推荐指数
1
解决办法
4170
查看次数

一个TIdHTTPServer组件可以同时处理http和https请求吗?

我正在使用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 http indy

6
推荐指数
1
解决办法
2339
查看次数

如何从命令行部署OSX或IOS Delphi项目?

我正在使用像这样的脚本构建我的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项目吗?

delphi delphi-xe4

6
推荐指数
1
解决办法
1508
查看次数

使用Indy组件下载,暂停和恢复下载

实际上我正在使用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)

delphi indy

5
推荐指数
2
解决办法
4452
查看次数

使用delphi以编程方式执行防病毒程序

我写了一个小应用程序来使用indy组件传输文件,现在我想在传输完成时启动防病毒程序来检查文件.

如何在下载完成后执行客户端安装的防病毒程序?

更新 我需要在下载文件时执行类似于firefox的操作,然后执行机器中安装的防病毒软件.

提前致谢.

delphi delphi-7 antivirus-integration windows-xp-sp2

5
推荐指数
1
解决办法
1082
查看次数

如何确定字符串中的所有字符是否相等

我需要知道,如果在一个字符串中的所有字符都相等(由相同的字符组成).函数必须返回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)

delphi string delphi-7

5
推荐指数
2
解决办法
2298
查看次数

如何使用rtti列出属性的属性?

我目前正在使用此代码,但没有列出任何内容.我错过了什么?

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 attributes rtti delphi-2010 delphi-xe

5
推荐指数
1
解决办法
2121
查看次数