小编Mik*_*nni的帖子

容量是否在向量中复制?

请使用以下代码:

std::vector<int> a;
a.reserve(65536);
std::vector<int> b(a);  //NOTE: b is constructed from a

a.reserve(65536); // no reallocation
b.reserve(65536);
Run Code Online (Sandbox Code Playgroud)

是否复制了容量?最后一行会有重新分配吗?标准是否对此有所说明或是否保持沉默?

c++ vector

52
推荐指数
2
解决办法
1678
查看次数

应该在调用函数之前初始化变量吗?

当我调用函数来获取值时,我通常初始化varible,以防函数失败或不返回任何内容,我想避免处理未初始化的变量.我对字符串,整数或任何其他类型都这样做.

整数变量的示例:

vPropValue := 0;
vPropValue := GetPropValue(vObject,'Height');

IF vPropValue > 0 Then
...
Run Code Online (Sandbox Code Playgroud)

这是我最常用的方式.

我知道我可以使用:

If GetPropValue(vObject,'Height') > 0 Then
...
Run Code Online (Sandbox Code Playgroud)

但是在第一个例子中,我避免多次调用函数,如果我稍后需要在代码中再次得到结果.

对于字符串也是一样的(即使我知道本地字符串被初始化为空字符串,而整数不是可以保存任何值)

vName := '';
vName := GetObjectName(vObject,'ObjectName');

IF Trim(vPropStrValue) <> '' Then
...
Run Code Online (Sandbox Code Playgroud)

我知道我可以采取措施避免重复的值赋值,比如确保函数在所有内容都失败时返回0.但是我有100多个函数而且我不能依赖我从来没有弄错过函数如何处理所有事情而且我确定有些人不会返回0,如果一切都失败了.

我试图理解为什么这不是理想的做法以及如何最好地避免它.

编辑

以下是函数未返回正确值或0的示例:

function GetValue(vType:integer):integer;
begin
   if vType=1 then
    Result:=100
   else if (vType>2) and (vType<=9) then
     Result:=200;

end;

procedure TForm1.Button1Click(Sender: TObject);
var vValue:integer;
begin

  vValue:=GetValue(11);
  Button1.Caption:=IntToStr(vValue);

end;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,函数返回的值是一些随机数.

在这种情况下,初始化似乎是有效的方法.或不?

编辑2:

正如大卫在他的回答中指出的那样,正确的是,有一个警告

[dcc32 Warning] Unit1.pas(33): W1035 Return value of function 'GetValue' might be …
Run Code Online (Sandbox Code Playgroud)

delphi variable-initialization delphi-xe7

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

PHP使用什么类型的数组?

我可以array像这样在PHP中定义一个:

$array = array();
Run Code Online (Sandbox Code Playgroud)

在C++中,我们有两种数组.

  1. 第一种是固定大小的数组,例如:

    int arr[4]; // 4 ints, hardcoded size
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二种是动态大小的数组

    std::vector<int> v; // can grow and shrink at runtime
    
    Run Code Online (Sandbox Code Playgroud)

PHP使用什么类型的数组?PHP中是两种数组吗?如果是的话,你能给我举个例子吗?

php arrays

10
推荐指数
2
解决办法
1535
查看次数

ARC:TNetEncoding.GetBase64Encoding中是否存在内存泄漏?

下面是原始的Delphi源代码TNetEncoding.GetBase64Encoding.但我怀疑是否会出现内存泄漏AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil

 TNetEncoding = class
  private
    class var
      FBase64Encoding: TNetEncoding;
Run Code Online (Sandbox Code Playgroud)

class function TNetEncoding.GetBase64Encoding: TNetEncoding;
var
  LEncoding: TBase64Encoding;
begin
  if FBase64Encoding = nil then
  begin
    LEncoding := TBase64Encoding.Create;
    if AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil then
      LEncoding.Free;
{$IFDEF AUTOREFCOUNT}
    FBase64Encoding.__ObjAddRef;
{$ENDIF AUTOREFCOUNT}
  end;
  Result := FBase64Encoding;
end;
Run Code Online (Sandbox Code Playgroud)

我认为必须写成:

class function TNetEncoding.GetBase64Encoding: TNetEncoding;
var
  LEncoding: TBase64Encoding;
begin
  if FBase64Encoding = nil then
  begin
    LEncoding := TBase64Encoding.Create;
    if AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil then
      LEncoding.Free
{$IFDEF AUTOREFCOUNT} …
Run Code Online (Sandbox Code Playgroud)

delphi base64 encoding

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

有什么方法可以加速TPNGImage上的SaveToStream?

我有一个函数将TBitmap(我绘制)转换为TPngImage,然后将其保存为流,因此其他方法可以使用它.使用Png是因为它为报告输出创建了较小的图像(excel,html).问题是SaveToStream似乎花费了太多时间,比将TBitmap转换为TPngImage或使用带有png的TStream多15倍.这是代码:

var
 BitmapImage: TBitmap;      
 PNGImage: TPngImage;
 PngStream: TStream;        
begin
  // draw on BitmapImage
  ...
  PNGImage := TPngImage.Create;
  PNGStream := TMemoryStream.Create;
  Try
     PNGImage.Assign(BitmapPicture.Bitmap); // Step 1: assign TBitmap to PNG
     PNGImage.SaveToStream(PNGStream);  // Step 2: save PNG to stream
     WS.Shapes.AddPicture(PNGStream,PNGImage.Width,PNGImage.Height); // Step 3: Add PNG from Stream to Excel
  finally
     PNGImage.Free;
     PNGStream.Free;
  end;
...
Run Code Online (Sandbox Code Playgroud)

这是用70000张图像测试的,这里是时间:
步骤1:7秒

第2步:93秒

第3步:6秒

为什么保存到Stream这么慢?有什么建议可以优化吗?

使用Delphi XE7

编辑

这是带有简单bmp的示例(MCVE),它将转换为PNG,然后保存到流中.只是为了另一个验证,我添加了SaveToFile,当然需要更长时间,但它保存到磁盘,所以我认为可以接受.

img1.bmp为49.5KB,保存的PNG为661字节.链接到img1.bmp = http://www.filedropper.com/img1_1

TMemoryStreamAccess = class(TMemoryStream)
  end;

procedure TForm1.Button1Click(Sender: TObject);
var BitmapImage:TBitmap;
  PNGImage:TPngImage;
  PNGStream:TMemoryStream;//TStream;
  i,t1,t2,t3,t4,t5,t6: Integer;
  vFileName:string;
begin

  BitmapImage:=TBitmap.Create; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe7

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

如何在Virtual Treeview中隐藏展开/折叠按钮?

我使用VirtualStringTree(VST)来显示分组的数据,标题详细信息.我需要有一个选项允许用户展开,折叠标题以查看详细信息,在某些情况下我需要将数据显示为静态视图,在这里他们无法展开,折叠,只能看到完整展开的树:

以下是用户可以展开的示例,使用子节点折叠节点:

在此输入图像描述

这是一个示例,当我想阻止用户展开/折叠节点并始终看到所有展开(或显示的任何内容):

在此输入图像描述

在此测试中,我通过'允许展开/折叠/复选框控制.

我通过添加以下内容来防止展开,折

Allowed:=CheckBox1.Checked;
Run Code Online (Sandbox Code Playgroud)

进入OnCollapsing/OnExpanding:

procedure TMainForm.VSTCollapsing(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var Allowed: Boolean);
begin
  Allowed:=CheckBox1.Checked;
end;

procedure TMainForm.VSTExpanding(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var Allowed: Boolean);
begin
  Allowed:=CheckBox1.Checked;
end;
Run Code Online (Sandbox Code Playgroud)

我还基于复选框显示/隐藏TreeLines

procedure TMainForm.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked then
    VST.TreeOptions.PaintOptions:=VST.TreeOptions.PaintOptions + [toShowTreeLines]
  else
    VST.TreeOptions.PaintOptions:=VST.TreeOptions.PaintOptions - [toShowTreeLines];
end;
Run Code Online (Sandbox Code Playgroud)

当我想阻止用户展开,折叠节点时,如何隐藏这个小加号.有什么建议?


编辑:

为了清除与表单图标的混淆,这是来自Virtual Treeivew 5演示库的演示项目.IDE中的表单具有Delphi XE7图标,在运行项目时会出现这个旧图标.不知道为什么.只是想确保我使用XE7而不是任何旧的Delphi版本,其中相同的解决方案可能不适用.

在IDE中,图标如果为XE7图标:

在此输入图像描述

delphi virtualtreeview delphi-xe7

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

如果我修复W1050警告提示,CharInSet比IN慢得多?

我在我的项目中使用了很多IN,并且我有很多这些警告:

[DCC警告] Unit1.pas(40):W1050 WideChar在集合表达式中减少为字节char.考虑在SysUtils单元中使用CharInSet函数.

我做了一个快速测试,使用CharInSet而不是IN从65%-100%慢:

if s1[i] in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] then
Run Code Online (Sandbox Code Playgroud)

VS

if CharInSet(s1[i], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']) then
Run Code Online (Sandbox Code Playgroud)

这是2个测试的代码,一个用于循环通过较短的字符串,一个循环通过一个大字符串:

在表单上添加2个按钮我测试了这个短字符串:

procedure TForm1.Button1Click(Sender: TObject);
var s1: string;
  t1, t2: TStopWatch;
  a, i, cnt, vMaxLoop: …
Run Code Online (Sandbox Code Playgroud)

delphi performance delphi-xe7

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

为什么RAD Studio Seattle 10会安装Windows 10 SDK?(它是否适用于较新的SDK?)

在C++ Builder Seattle 10 Update 1安装结束时,Embarcadero的主要设置启动了一个名为Microsoft Windows 10 SDK Installer的附加嵌入式安装程序.这就是它的样子,万一你忘记了:

在此输入图像描述

然后,此安装程序开始安装原始RTM Windows 10 SDK,如下所示:

在此输入图像描述

为什么C++ Builder会安装它?C++ Builder如何与SDK链接 - 它究竟使用了什么?如果我安装一个较新的Windows SDK(例如2015年11月发布的那个),它会起作用吗?(很难想象如何,因为在IDE中设置所有内容以使用文件C:\Program Files (x86)\Embarcadero\Studio\17.0\include\windows\sdk,这些文件包括Embarcadero对SDK所做的更改,例如特殊的bcc32 pragma语句.)

我已经分析了RAD Studio的安装文件,试图弄清楚发生了什么,但我没有一个很好的答案为什么他们正在做他们做的事情:

  • 在RAD Studio ISO上,检查7-Zip中的``\ Install\Setup.exe`.
  • 有一个setup.res文件; 打开里面的7-Zip也.
  • 在里面setup.res你会发现MSSDKInstall.exe你在上面第一个截图中看到的内容.在7-Zip内打开它.
  • 然后,您将看到几个文件:
    • MSSDKInstall.msi:如果你用Orca打开它,你会发现这是一个非常简单的安装程序,它将一些蓝牙头文件安装到Embarcadero include目录中.
    • OFFLINE目录:包含显然使用了微星8个不同的Windows SDK头文件:BluetoothAPIs.h,bluetoothleapis.h,bthdef.h,bthledef.h,bthsdpdef.h,no_sal2.h,winapifamily.h,ws2bth.h.

另外看来,这个单独的安装程序与主要的RAD Studio安装程序冲突.主安装程序还会安装这些相同的头文件.然后运行此安装程序,并替换这些文件.然后它出于某种未知原因启动官方Microsoft Windows 10 SDK安装程序.如果卸载Embarcadero SDK安装程序包,则会完全删除这8个头文件(因此会发生冲突).

所以:(1)为什么他们不在主安装中只包含那8个头文件 - 这一切的重点是什么,(2)为什么他们启动官方的Microsoft Windows 10 …

delphi c++builder delphi-10-seattle

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

如何在我的 JavaFX 应用程序中的任何位置检测 SPACE KeyEvent?

我想检测KeyEvent,无论什么元素具有焦点在我的JavaFX应用程序-尤其是,我要检测的SPACE关键。我尝试向Scene与我的窗口相对应的监听器添加一个监听器:

scene.setOnKeyPressed(ev -> {
    if (ev.getCode() == KeyCode.SPACE) {
        System.out.println("GOOD");
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,如果我有一个具有焦点的特定节点(如 aListViewButton),则不会检测到它。

SPACE无论用户在我的应用程序中做什么,我如何检测按键何时被按下?我不打算中断正在接收的任何节点KeyEvent- 我只是想知道它是否发生。一种(丑陋的)解决方案是将侦听器添加到我的所有节点,但如果可能的话,我宁愿不这样做。

java javafx keyevent

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

如何在末尾用零排序整数数组?

我需要按整数字段对数组进行排序,1-n在开头排序,最后为零:0,0,3,1,2 - > 1,2,3,0,0

我不知道如何一次性排序,所以我尝试了两种,但它没有产生正确的结果:

它确实在最后添加了零,但它弄乱了1-n个有序物品:

0,0,3,1,2 - >(第一种)0,0,1,2,3 - >(第二种)2,3,1,0,0

procedure TForm2.Button1Click(Sender: TObject);
var
  Arr: TArray<integer>;
begin
  SetLength(Arr, 5);
  Arr[0] := 0;
  Arr[1] := 0;
  Arr[2] := 3;
  Arr[3] := 1;
  Arr[4] := 2;

  // First sort: Sort 1-n
  TArray.Sort<integer>(Arr, TComparer<integer>.Construct(function(const Left, Right: integer): Integer
    begin
      if Left < Right then
        Result := -1
      else if Left > Right then
        Result := 1
      else
        Result := 0;
    end
    ));

  // Second sort: Put zeros at the end
  TArray.Sort<integer>(Arr, TComparer<integer>.Construct(function(const …
Run Code Online (Sandbox Code Playgroud)

arrays delphi sorting integer delphi-10.1-berlin

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