小编Rob*_*edy的帖子

为什么TGeneric <Base>和TGeneric <Descendant>不兼容?

我已经开始在Delphi 2010中使用泛型,但在编译这段代码时我遇到了问题:

TThreadBase = class( TThread )
...
end;

TThreadBaseList<T: TThreadBase> = class( TObjectList<T> )
...
end;

TDataProviderThread = class( TThreadBase )
...
end;

TDataCore = class( TInterfacedObject, IDataCore )
private
  FProviders: TThreadBaseList<TDataProviderThread>;
...
end;
Run Code Online (Sandbox Code Playgroud)

然后我有一些嵌套的过程:

procedure MakeAllThreadsActive(aThreads: TThreadBaseList<TThreadBase>);
begin
...
end;
Run Code Online (Sandbox Code Playgroud)

最后我想在TDataCore类的代码中调用这个嵌套过程:

MakeAllThreadsActive(FProviders);
Run Code Online (Sandbox Code Playgroud)

但编译器不想编译它,它说('<>'括号被'()'替换):

[DCC错误] LSCore.pas(494):E2010不兼容类型:'TThreadBaseList(TThreadBase)'和'TThreadBaseList(TDataProviderThread)'

虽然TDataProviderThread是TThreadBase的后代,但我不明白它.

我不得不通过艰难的类型转换来修复它:

MakeAllThreadsActive(TThreadBaseList<TThreadBase>(FProviders));
Run Code Online (Sandbox Code Playgroud)

有人知道为什么编译器会说这个错误吗?

delphi generics delphi-2010

13
推荐指数
2
解决办法
1402
查看次数

是否可以更改虚拟字符串树中行的颜色?

我想更改虚拟字符串树的特定行中的文本颜色.可能吗?

delphi virtualtreeview

13
推荐指数
2
解决办法
5602
查看次数

如何从给定的基色生成多个阴影?

我想设计一个图表并设置一个样本的颜色.与Excel中的相同:

替代文字

是否有某种公式或算法可以从给定的阴影或颜色生成下一个颜色?

delphi colors

13
推荐指数
2
解决办法
2504
查看次数

如何检查多个变量是否等于相同的值?

如何比较多个项目?例如,我想检查所有变量A,B和C是否等于char'X'或者所有三个都等于'O'.(如果其中两个是X而一个是O则应该返回false.)

我试过了:

if (A, B, C == 'X' || A, B, C == 'O') 
  {
    //Do whatever
  }
Run Code Online (Sandbox Code Playgroud)

但它不起作用.做这个的最好方式是什么?

c++

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

如何防止"结束进程树"终止我已启动的程序?

我试图使用ShellExecute从Delphi XE2中的另一个应用程序'one.exe'执行EXE'two.exe'.

ShellExecute(0, 'open', 'two.exe', nil, nil, SW_NORMAL);
Run Code Online (Sandbox Code Playgroud)

它工作正常,但每当我从任务管理器的进程选项卡终止应用程序'one.exe'(父应用程序)时,使用"结束进程树"选项,应用程序'two.exe'也会被终止.

如何阻止我的ShellExecuted应用程序像这样终止?

delphi delphi-xe2

13
推荐指数
2
解决办法
1086
查看次数

基本的Delphi类型如何相互关联?

Delphi长期以来支持一些基本的数字类型,我想知道它们是如何相互关联的.

在Delphi 2007中,我发现了这些声明(有些是冲突的,有些只是别名):

Types.pas:

DWORD = LongWord;
Largeint = Int64;
Run Code Online (Sandbox Code Playgroud)

getmem.inc:

DWORD = Integer;
Run Code Online (Sandbox Code Playgroud)

Windows.pas:

DWORD = Types.DWORD;
SHORT = Smallint;
UINT = LongWord;
ULONG = Cardinal;
LONGLONG = Int64;
TLargeInteger = Int64;
ULONGLONG = UInt64;
Run Code Online (Sandbox Code Playgroud)

这让我想到基本签名数字类型是SmallInt,Integer和Int64.无符号,有Byte,WORD和UInt64.但Cardinal和LongWord有什么区别?(顺便说一下,这些类型的原始和预期外壳是什么?)

是否有一个有符号8位整数(Int8)的类型?

// Int8 = ?unknown?;
UInt8 = Byte;
Int16 = SmallInt;
UInt16 = Word;
Int32 = Integer;
UInt32 = LongWord;
// Int64 already exists
// UInt64 already exists
Run Code Online (Sandbox Code Playgroud)

最后,我应该如何定义Int和UInt,特别是关于C/C++兼容性以及将来切换到其他平台(可能还有64位)?(当然,一个相关的问题是如何在64位Delphi中定义各种数字类型?)

delphi types

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

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

我想在我的代码中禁用特定警告(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
查看次数

如何在具有严格doctype的HTML页面中查看阿拉伯语/波斯语数字?

我有一个从右到左的HTML页面.当我不使用任何doctype时,我的数字是阿拉伯语/波斯语,但是当我使用严格模式时,他们会转向英语.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Final//EN">
Run Code Online (Sandbox Code Playgroud)

在添加doctype之前:

在添加doctype之前

添加doctype后:

添加doctype后

我也将这些元标记添加到我的页面:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Language" content="fa" />
Run Code Online (Sandbox Code Playgroud)

那么如何在具有严格doctype的页面中查看阿拉伯数字(在IE中,因为Firefox无论如何都不显示阿拉伯数字)?

html doctype numbers xhtml-1.0-strict arabic

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

为什么在调用Dispose之前必须转换为特定的指针类型?

假设我有一个TList类的实例(BDS 2006,所以这是一个指针类型列表).我放入列表的每个指针都引用New()函数分配的内存.因此,当我想清除列表时,我必须遍历它并处理每个项目,对吧?但如何正确地做到这一点?我是否必须将每个处理过的物品投射到它的实际类型?

type
  TMyRec = record
    Field1: string;
    Field2: integer;
  end;
  PMyRec = ^TMyRec;

  ...

  var
    MyList: TList;
    MyRecPointer: PMyRec;
  begin
    ...
    New(MyRecPointer);
    ...
    MyList.Add(MyRecPointer);
    ...

    for i := 0 to MyList.Count - 1 do
      Dispose(PMyRec(MyList[x]));        

    MyList.Clear();
  end;
Run Code Online (Sandbox Code Playgroud)

请查看最后的for循环.我将每个项目投射到PMyRec以处置内存.这有必要吗?我知道Dispose()函数有一个Pointer参数,所以在这种情况下,转换似乎很愚蠢,但我仍然不确定.因为Dispose()函数如何知道在获得一般指针类型时要处理多少内存?

这是第二种方法(没有类型转换):

for i := 0 to MyList.Count - 1 do
  Dispose(MyList[x]);  
Run Code Online (Sandbox Code Playgroud)

如果有人解释我该怎么做以及为什么,我将不胜感激.非常感谢.

delphi pointers dispose casting

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