我需要将数组类型声明标记为已弃用(实际上不仅仅是一个),以帮助将代码迁移到更高级和灵活的TArray<T>泛型类型.
我试过这个:
type
TArrayChars = array of Char deprecated;
Run Code Online (Sandbox Code Playgroud)
但是我收到了编译错误: E2029 ';' expected but identifier 'deprecated' found
如果声明的类型不是数组,则同样有效,例如:
type
TFieldChars = set of Char deprecated;
Run Code Online (Sandbox Code Playgroud)
请注意,这应该是可行的设计.
我错过了什么?
这似乎是德尔福的一个错误(至少10.1柏林和10.2东京).
我接受的答案提出了一个简洁的解决方法,即:
type
TArrayCharsOld = array of Char;
TArrayChars = TArrayCharsOld deprecated;
Run Code Online (Sandbox Code Playgroud)
我将向Embarcadero提交一份错误报告.
这是我提交的Embarcadero质量控制问题:https: //quality.embarcadero.com/browse/RSP-18316
类似于if 语句中将整数变量与整数列表进行比较的任何方法,但在 Delphi 中,如何测试整数变量是否包含在整数的静态“列表”(宽松地说 - 预定义的集合)中(也许是if语句中的const列表或显式值列表)?
现在我会做这样的事情:
if (x = 1) or
(x = 2263) or
(x = 263553) or
(x = whatever_int) then
begin
//do something;
end;
Run Code Online (Sandbox Code Playgroud)
但我试图避免冗长的or条件序列。
我正在使用 Delphi XE6,所以如果有新的东西可以以干净的方式实现这一点,请告诉我。
让我们假设这些声明:
type
TMyRec = record
Name : String;
Age : Integer;
Married : Boolean;
end;
TMyRecArray = Array[0..3] of TMyRec;
const
RecArray: TMyRecArray = ((Name: 'John' ; Age: 25; Married: False),
(Name: 'Wendy'; Age: 32 ),
(Name: 'Nick' ; Married: True ),
( Age: 19; Married: False));
Run Code Online (Sandbox Code Playgroud)
最后三个数组行中未列出的记录元素是否使用默认值自动初始化?或者(可以)它们包含随机数据?
Embarcadero的docwiki没有就此发表任何官方消息.
这是我的情况:我有一个文本文件,其中包含许多等长字符串,表示要加载到SQL DB表中的记录,所以我必须从这些字符串生成SQL代码.
我在那个数据库上有一个表(我们称之为"格式化表")告诉我字符串是如何格式化的以及加载它们的位置(该表的每个记录包含目标表名,字段名,数据位置和长度)从文本文件中引用字符串).
我已经以一种我认为每个Delphi程序员都熟知的方式解决了这个问题,使用该Copy(string, pos, length)函数并根据"格式化表"中的信息迭代每个字段.
这很有效,但速度很慢,特别是当我们谈论具有一百万或更多行的源文本文件时,每行代表几十甚至几百个数据字段.
我现在要做的是以一种它们看起来已经分裂的方式"看到"源字符串,避免Copy()不断创建新字符串的功能,从原始字符串复制内容,分配和释放内存等等.我所说的是"我拥有整个字符串,让我们在一个步骤中以一种代表每个'片段'(字段)的方式看待它,而不是从它创建子串".
什么可以解决我的问题将是某种方式来定义动态结构,如动态记录或动态数组(不是Delphy称之为动态数组,更像是"动态静态数组")以按顺序"叠加"在字符串上从这个角度"观察"它...我不知道我对这个解释是否足够清楚......但是Delphi(据我所知)并没有实现这种动态结构.
除了缺乏活力之外,这是一个(静态)代码,可以满足我的需求.
procedure TForm1.FormCreate(Sender: TObject);
type
PDecodeStr = ^TDecodeStr;
TDecodeStr = record
s1: Array[0..3] of AnsiChar;
s2: Array[0..9] of AnsiChar;
s3: Array[0..4] of AnsiChar;
s4: Array[0..7] of AnsiChar;
s5: Array[0..2] of AnsiChar;
end;
var
cWholeStr: AnsiString;
begin
cWholeStr := '123456789012345678901234567890';
Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s1);
Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s2);
Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s3);
Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s4);
Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s5);
end;
Run Code Online (Sandbox Code Playgroud)
有关如何解决这个问题的任何想法?
提前致谢.