我想排除此枚举类型的第一个值
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'
这该怎么做?
我正在检查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以上的文件).
基本上我有这个问题:TEdit中的CapsLock密码消息在视觉上无法使用VCL样式.
我想要做的不是解决问题,如答案或评论中所示.
我想完全禁用那个丑陋的提示窗口.而是显示一个图像,让用户知道帽子被锁定.
像这样
可能我缺少了一些东西,但是找不到找到创建具有特定像素格式的FMX位图的方法。更具体地说,我需要FMX.Graphics.TBitmap使用pixel format 创建BGR_565。构造函数没有定义PixelFormat的选项。该属性PixelFormat为只读(与的VCL版本不同TBitmap)。
MCVE:
从切换参数类型时下面的代码不与错误编译const到var或out在重载方法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) 在案例陈述下的文件中,它说:
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语句,那么第二个值将不会被测试,因为编译器已经找到了先前的匹配?
我有以下方法指针
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.
我有以下功能
function calculate(s:string):integer;
begin
try
strtoint(s);
do_something;
except
result:=-1;
end;
end;
Run Code Online (Sandbox Code Playgroud)
使用这样的例外会有什么后果吗?
有没有办法在不知道其名称的情况下使用在运行时创建的组件的属性?我的意思是你已经完成了这个.
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)