我总是将动态数组的初始化与终结器配对,形式为
finally
SetLength(Array, 0);
end;
Run Code Online (Sandbox Code Playgroud)
确切地知道数组何时被“销毁”感觉更自然,并且如果需要的话,可以通过已经拥有“最终”可用的方式更平滑地从数组过渡到 TList。
然而这种方法使源代码更加缩进。这种方法有什么缺点吗——可读性、可维护性、可扩展性、性能、易出错性?
我写的示例代码:
var
A1: array of Integer;
A2: array on Boolean;
A3: array of string;
begin
SetLength(A1, 10);
try
...
SetLength(A2, 20);
try
...
SetLength(A3, 30);
try
...
finally
SetLength(A3, 0);
end;
finally
SetLength(A2, 0);
end;
finnally
SetLength(A1, 0);
end;
end;
Run Code Online (Sandbox Code Playgroud) 您好,我一直在编码,到目前为止,在WinXP中的Delphi 2007中开发和编译没有问题,直到Win7中的Delphi XE7。
我不知道为什么会这样。
错误指向的行
....
if(tS<>'') then
begin
Result:=StrToFloat(StringReplace(String(tS),'.',DecimalSeparator,[]));
Invalid:=False;
end;
....
Run Code Online (Sandbox Code Playgroud)
错误:
1) [dcc32 Error] UtilNumString.pas(321): E2003 Undeclared identifier: 'DecimalSeparator'
2) [dcc32 Error] UtilNumString.pas(321): E2250 There is no overloaded version of 'StringReplace' that can be called with these arguments
Run Code Online (Sandbox Code Playgroud)
请亲指教。谢谢
我在 Delphi Firemonkey XE7 中为应用程序创建了一个 Stringgrid,并用我的 MySQL 数据库中的数据填充它。为了放大字体大小,我使用了以下代码:
procedure TFormSearchRecipient.sgRecipientDrawColumnCell(Sender: TObject;
const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var b : TRectF; border: integer;
begin
//following leaves in the end a border so that the marked item can be seen
b := bounds;
border:= 2;
b.Top := b.Top + border;
b.Left := b.Left - border;
b.Height := b.Height - 2 * border;
b.Width := b.Width - 2 * border; …Run Code Online (Sandbox Code Playgroud) TWebBrowser下面是一个在 VCL 应用程序中托管控件的简单程序:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Browser: TWebBrowser;
begin
Browser := TWebBrowser.Create(Self);
TOleControl(Browser).Parent := Self;
Browser.Align := alClient;
Browser.Navigate('http://www.bbc.co.uk/');
end;
end.
Run Code Online (Sandbox Code Playgroud)
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 587
ClientWidth = 928
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = …Run Code Online (Sandbox Code Playgroud) 我有一个 Ansi 字符串,用于存储二进制数据 - 0-255 范围内的字节(我知道它应该是一个字节数组左右,但它们之间没有太大区别)。
我想通过 Indy MIME (TIdEncoderMIME.EncodeString / TIdDecoderMIME.DecodeString) 传递这个“二进制字符串”并获得人类可读的ANSI字符串。
我认为如果我使用 IndyTextEncoding_8Bit 编码,Encode/DecodeString 的输出将是一个仅包含 ANSI 字符的字符串。但是我错了!
那么,如何使用 Indy Mime 编码二进制数据(类似于application/octet-stream)?
静态数组允许定义它们的下限和上限:
StaticArray : array[5..7] of Integer;
Run Code Online (Sandbox Code Playgroud)
我不知道如何在运行时对动态数组做同样的事情。
例如,如果我需要从静态数组复制元素,保持相同的索引,我不知道如何将其下限设置为Low(StaticArray)和上限设置为High(StaticArray):
var
StaticArray : array[5..7] of Integer;
DynamicArray : array of Integer;
i : integer;
begin
//initializing static array
StaticArray[5] := 1;
StaticArray[6] := 2;
StaticArray[7] := 3;
//setting the same length and bounds to the dynamic array
//?
//copying elements
i := 0;
for i := Low(StaticArray) to High(StaticArray) do
DynamicArray[i] := StaticArray[i];
end;
Run Code Online (Sandbox Code Playgroud)
有没有办法设置动态数组的下限/0上限,或者它们是否总是具有下限和Length(Array) - 1上限?
我有一个Firemonkey XE7安卓应用程序,它在Android 4.x上运行完美
但是我在Android 5上测试了它并且它打开了但是一段时间后它关闭了.
程序中唯一能做的就是一个简单ShowMessage();的文件.
我使用了这样的文件地址:
filePath := System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim;
Run Code Online (Sandbox Code Playgroud)
问题是我的文件路径ShowMessage()还是什么?
我需要检测应用程序是否在Win32/64上运行.
更新:人们报告依赖[HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0]键并不是一个好主意.
我有一个ScrollBox对象,我在其中插入了一些对象:align:= TalignLayout.Bottom和parent:= scrollbox,对象插入成功,但滚动框不滚动或显示ScrollBars,任何类型的帮助将非常感激谢谢你的关心
使用标志(基于这篇文章)
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
Run Code Online (Sandbox Code Playgroud)
和
IMAGE_FILE_NET_RUN_FROM_SWAP
Run Code Online (Sandbox Code Playgroud)
当可执行文件位于LAN路径或可移动设备中时,可以将可执行文件加载到内存中.
即使exe在本地光盘上,有没有办法实现相同的目的?
我知道几乎没有性能提升,但要"摆脱光盘"这是一个想法.我没有在文档中找到这样的编译器选项.
delphi ×10
delphi-xe7 ×10
firemonkey ×3
32bit-64bit ×1
arrays ×1
encoding ×1
finalization ×1
header ×1
indy ×1
mime ×1
stringgrid ×1
twebbrowser ×1