小编Rob*_*edy的帖子

为什么TEnumerable <T>使用传递方法?

TEnumerable<T>,所有Generics.Collections容器类的基类都有一个非常奇怪的声明.它看起来像这样:

type
  TEnumerable<T> = class abstract
  protected
    function DoGetEnumerator: TEnumerator<T>; virtual; abstract;
  public
    function GetEnumerator: TEnumerator<T>;
  end;

function TEnumerable<T>.GetEnumerator: TEnumerator<T>;
begin
  Result := DoGetEnumerator;
end;
Run Code Online (Sandbox Code Playgroud)

TEnumerator<T> 同样声明一个公共的MoveNext方法和一个私有的DoMoveNext函数,而MoveNext除了调用DoMoveNext之外什么都不做.

除了添加额外的函数调用开销,使调用堆栈更长,并且在尝试从这些基类继承的编码器的头脑中产生混淆之外,任何人都可以向我解释这个服务的目的吗?这种结构化方式是否有任何实际优势,因为如果有,我看不到它......

delphi generics delphi-2009 data-structures

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

如何在不使用Vidalia的情况下强制Tor使用新身份?

我在我的项目中使用Tor.如何强制Tor使用我程序中的新标识?

delphi tor

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

如何暂时禁用"返回值可能未定义"警告?

我想在我的代码中禁用特定警告(W1035),因为我认为编译器对此警告是错误的:

function TfrmNagScreen.Run: TOption;
begin
  if ShowModal = mrOk then
    Result := TOption(rdgAction.EditValue)
  else
    Abort
end;
Run Code Online (Sandbox Code Playgroud)

因为Abort投掷,结果不可能是未定义的EAbort.

我试过了:

  • {$WARN 1035 Off}:显然这仅适用于某些特定错误(请参阅文档)
  • {$W-1035}:什么都不做

我知道我可以在项目选项中全局关闭警告,或使用{$WARNINGS OFF},但这不是这里的意图.

编辑:我现在已经将QC作为#89744了.

delphi compiler-directives delphi-2007 suppress-warnings

12
推荐指数
2
解决办法
524
查看次数

我在哪里定义用{$ IFDEF}测试的符号?

当我在代码中使用Delphi指令时,例如:

{$IFDEF something}
.
.
.
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

我在哪里为项目分配"某事"这个词?我在一些地方试过项目选项,但它没有用.猜猜我找不到正确的.

delphi compiler-directives delphi-2009

12
推荐指数
5
解决办法
9237
查看次数

如何检测用户何时完成编辑TStringGrid单元格?

我想在用户完成输入数据时返回字符串网格中单元格的内容.按下键盘上的Enter键或单击或双击另一个单元格时,用户完成.

在Lazarus中有一种FinishedCellEditing的方法,但在Delphi中则没有.如何在Delphi中检测到它?

delphi events tstringgrid

12
推荐指数
2
解决办法
1万
查看次数

Delphi的简单类型是否安全?

我声明了两个全局变量:

var
  gIsRunning: Boolean = False;
  gLogCounter: Integer = 0;
Run Code Online (Sandbox Code Playgroud)

这些变量仅在主线程中写入,并在其他线程中读取.在这种情况下,这些变量是否安全?

delphi multithreading thread-safety

12
推荐指数
4
解决办法
7696
查看次数

当程序在地址0处与异常0xc0000005崩溃时,我该怎么办?

我的Delphi程序作为NT服务运行,运行良好超过2个月,然后突然停止并生成崩溃转储:

错误应用程序名称:tca_shctisvc_ip.exe,版本:7.1.0.1843,时间戳:0x2a425e19错误模块名称:未知,版本:0.0.0.0,时间戳:0x00000000异常代码:0xc0000005错误偏移量:0x00000000

根据Windows事件日志中的信息,没有可用的真实地址.我能够将迷你转储加载到WinDbg中,它说有一个例外,但发现了堆栈帧的问题.一个不同的工具(Viewminidump)能够显示正在运行的线程的堆栈.

我从哪里开始解决此问题?

delphi crash debugging

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

如何删除TStringGrid行?

我有一个TStringGrid,我想删除选定的行.我试过的基本内容只删除了最后一行.如何删除任意行?

delphi tstringgrid

12
推荐指数
2
解决办法
2万
查看次数

为什么我能够从类外部访问私有类变量,我该如何防止它?

我正在使用此代码

type
 TSomeClass = class(TOBject)
 private
  class var InstanceCount : integer;
  class var TotalInstanceCount : integer;
 public
  class function instances: integer;
  class function totalInstances: integer;
  constructor Create;
  destructor Destroy;
end;

constructor TSomeClass.Create;
begin
 inherited Create;
 Inc(InstanceCount);
 Inc(TotalInstanceCount);
end;

destructor TSomeClass.Destroy;
begin
 Dec(InstanceCount);
 inherited;
end;

class function TSomeClass.instances;
begin
  Result := InstanceCount;
end;

class function TSomeClass.totalInstances;
begin
  Result := TotalInstanceCount;
end;
Run Code Online (Sandbox Code Playgroud)

我想创建一个实例计数器,并将一些类变量设置为私有.问题很简单,看看这张图:

在此输入图像描述

正如您在红色框中看到的那样,我声明为私有的类变量.我不希望它们出现.我只希望公共类函数能够显示计数器.我能做什么?

delphi access-modifiers

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

如何指定外部控制台程序的窗口位置?

在我的Win32 VCL应用程序中,我使用ShellExecute来启动一些较小的Delphi控制台应用程序.有没有办法控制那些控制台窗口的位置?我想以屏幕为中心启动它们.

delphi console-application

11
推荐指数
2
解决办法
3990
查看次数