小编Nas*_*out的帖子

如何在delphi中排除用作数组索引的枚举类型的第一个元素?

我想排除此枚举类型的第一个值

type
  TEnum = (val0, val1, val2, val3, val4);
Run Code Online (Sandbox Code Playgroud)

为了制作这个数组

TBValues: array [low(TEnum)..High(TEnum)] of boolean;
Run Code Online (Sandbox Code Playgroud)

仅包含最后的n-1个值(在本例中为n = 5).

我试过这个:

TBValues: array [low(TEnum)+1..High(TEnum)] of boolean; 
Run Code Online (Sandbox Code Playgroud)

但我想在这种情况下不允许进行算术运算,因为我收到了这个编译错误

E2010不兼容类型:'Int64'和'TEnum'

这该怎么做?

delphi

11
推荐指数
1
解决办法
237
查看次数

在Stream.read中使用Int64大小的Longint计数是不是很危险?

我正在检查TMemoryStream课程并找到以下例程:

procedure TMemoryStream.LoadFromStream(Stream: TStream);
var
  Count: Longint;
begin
  Stream.Position := 0;
  Count := Stream.Size; // <-- assigning Int64 to Longint
  SetSize(Count);
  if Count <> 0 then Stream.ReadBuffer(FMemory^, Count);
end;
Run Code Online (Sandbox Code Playgroud)

我已经看到了很多将Int64分配给Longint的模式.

我的理解是在32位和64位Windows 中Longint是4个字节并且Int64是8个字节,所以如果我的文件大小是$1 FFFF FFFF == 8589934591 == 8 GB那么这个例程将无法读取,因为最终计数将是$ FFFF FFFF == -1.

我不明白这是如何允许的,也许不予考虑(可能没有多少人试图读取8 GB以上的文件).

delphi delphi-10-seattle

9
推荐指数
1
解决办法
284
查看次数

如何覆盖调用以在TEdit中显示CapsLock提示窗口?

基本上我有这个问题:TEdit中的CapsLock密码消息在视觉上无法使用VCL样式.

我想要做的不是解决问题,如答案或评论中所示.

我想完全禁用那个丑陋的提示窗口.而是显示一个图像,让用户知道帽子被锁定.

像这样

在此输入图像描述

delphi delphi-10-seattle

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

如何创建具有特定像素格式的FMX.Graphics.TBitmap?

可能我缺少了一些东西,但是找不到找到创建具有特定像素格式的FMX位图的方法。更具体地说,我需要FMX.Graphics.TBitmap使用pixel format 创建BGR_565。构造函数没有定义PixelFormat的选项。该属性PixelFormat为只读(与的VCL版本不同TBitmap)。

delphi bitmap pixelformat firemonkey

5
推荐指数
0
解决办法
982
查看次数

为什么在“重载”方法中将参数类型从“ const”切换为“ var”时无法传递“ Child”类实例

MCVE:

从切换参数类型时下面的代码不与错误编译constvarout在重载方法Train的类的TAnimalTrainer

但如果指定为non,则会编译。

[dcc32错误] Project14.dpr(41):E2250没有可使用这些参数调用的“火车”的重载版本

program Project14;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type    
  TAnimal = class
  private
  FName: string;   
  end;

  TDog = class(TAnimal)
  public
    constructor Create(Name: string);
  end;

  TAnimalTrainer = record // class or record
  public
    procedure Train({const}var aA: TAnimal); overload; // class method or not
    procedure Train(const aName: string); overload;
  end;

{ TAnimalTrainer }

procedure TAnimalTrainer.Train(const aName: string);
var
  Dog: TDog;
begin
  Dog := nil;
  try
    Dog := TDog.Create(aName); …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-10.2-tokyo

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

编译器如何处理case语句?

在案例陈述下的文件中,它说:

caseList表示的每个值在case语句中必须是唯一的;

如图所示,

case I of
  1..5: Caption := 'Low';
  6..9: Caption := 'High';
  0, 10..99: Caption := 'Out of range';
else
  Caption := ;
end
Run Code Online (Sandbox Code Playgroud)

相当于嵌套条件:

if I in [1..5] then
  Caption := 'Low';
else if I in [6..10] then
  Caption := 'High';
else if (I = 0) or (I in [10..99]) then
  Caption := 'Out of range'
else
  Caption := ;
Run Code Online (Sandbox Code Playgroud)

所以第一个引用表明它被处理成一个集合(在这里阅读评论至少有一个人与我在一起).

现在我知道这部分了

其中selectorExpression是小于32位的序数类型的任何表达式

与套的属性相矛盾,因为它提到下套:

基类型可以具有不超过256个可能的值,并且它们的顺序必须介于0到255之间

真正困扰我的是为什么在caseList中拥有唯一值是必要的.如果它等同于if语句,那么第二个值将不会被测试,因为编译器已经找到了先前的匹配?

delphi if-statement switch-statement

4
推荐指数
2
解决办法
434
查看次数

如何在delphi中的一个容器中存储不同的方法指针?

我有以下方法指针

type
  TMethod1 = procedure(aValue: TType1) of object;
  TMethod2 = procedure(aValue: TType2) of object;
  .
  .
  TMethodN = procedure(aValue: TTypeN) of object;
Run Code Online (Sandbox Code Playgroud)

我想将它们存放在一个容器中.

我找到了这个答案,其中一个指针TMethod1用于存储一个方法,然后调用它.但是,我宁愿不使用它,原因如下:

  • 它分配了新的内存块,然后我应该决定何时释放它(从来没有将它从一个区域中取出).

  • 它假设所有方法都有相同的定义,这不是我的情况.

  • 这是一种方法.我有一个他们的阵列,我不知道我将如何维持这样的存储.

文档中有一个使用TMethod方法的例子,但是以不同的方式不再需要上面的第二个假设.在调用该方法的最后一步中,我必须做一个不安全的类型转换,这也是我想要远离的东西.

我该如何做到这一点?

澄清我将如何使用这些方法:

我有一个

procedure DoWork(aData: TType1; method: TMethod1);
begin
  store aData in a field;
  store method in my container; 
end;
Run Code Online (Sandbox Code Playgroud)

然后,处理aData和调用method.

delphi

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

使用这样的例外是否有风险?

我有以下功能

function calculate(s:string):integer;
begin
  try
    strtoint(s);
    do_something;
  except
    result:=-1;    
  end;
end;
Run Code Online (Sandbox Code Playgroud)

使用这样的例外会有什么后果吗?

delphi exception

0
推荐指数
1
解决办法
450
查看次数

如何在不知道其名称的情况下访问组件的属性?

有没有办法在不知道其名称的情况下使用在运行时创建的组件的属性?我的意思是你已经完成了这个.

with TPanel.Create(self) do
  begin
  Name := 'Panel' + IntToStr(ComponentCount + 1);
  Height := 50;
  Width := 100;
  Top := 30;
  Left := 30;
  Parent := self;
  end;
Run Code Online (Sandbox Code Playgroud)

delphi

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