小编klu*_*udg的帖子

Delphi中绝对路径和相对路径之间的转换

是否有标准函数在Delphi中执行绝对的< - >相对路径转换?

例如:

  • '基地'路径是 'C:\Projects\Project1\'
  • 相对路径是 '..\Shared\somefile.pas'
  • 绝对路径是 'C:\Projects\Shared\somefile.pas'

我正在寻找这样的东西:

function AbsToRel(const AbsPath, BasePath: string): string;
// '..\Shared\somefile.pas' =
//   AbsToRel('C:\Projects\Shared\somefile.pas', 'C:\Projects\Project1\')  
function RelToAbs(const RelPath, BasePath: string): string;
// 'C:\Projects\Shared\somefile.pas' =
//   RelToAbs('..\Shared\somefile.pas', 'C:\Projects\Project1\')  
Run Code Online (Sandbox Code Playgroud)

delphi path

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

Delphi中的数组和压缩数组有什么区别吗?

在C/C++中你总是有

SizeOf(array[N] of T) = N * SizeOf(T);
Run Code Online (Sandbox Code Playgroud)

在Pascal/Delphi中,您可以使用'packed array'来确保上面的断言是正确的,但'packed'说明符对Delphi中的数组有什么实际价值吗?我无法创建一个'unpacked'数组的例子,数组似乎总是'打包':

type
  A = array[0..2] of Byte;
  B = array[0..99] of A;
  C = packed record
    C1, C2, C3: Byte;
  end;
  D = array[0..99] of C;

procedure TForm10.Button1Click(Sender: TObject);
begin
  Assert(SizeOf(A) = 3);
  Assert(SizeOf(B) = 300);
  Assert(SizeOf(D) = 300);
end;
Run Code Online (Sandbox Code Playgroud)

(C/C++结构和Delphi记录是不同的 - 它们可以'解包',因此由于字段的对齐,结构的大小大于字段大小的总和.)

arrays delphi alignment packed

15
推荐指数
1
解决办法
4551
查看次数

Delphi保留字和标识符

在Delphi中声明变量让我想到了一件我无法理解的事情.

问题是这样的:声明字符串,一个可以观察到string的一个保留字,同时宣布其他数据类型,比如整数数据类型修饰符是不是保留字,但一个标识符(即Integer,资本我告诉等等).

事实上,德尔福让你去的定义Integer,你发现它是包含在系统单元内,但它是唯一的代表,因为有评论指出,一些常量(像True),标识符(像Integer),函数和过程直接内置到编译器中.

我无法弄清楚这种选择背后的原因.

有人可以帮忙吗?


对类型stringInteger类型之间差异的一点解释.下一个代码

type
  Integer = Char;

var
  I: Integer;

begin
  I:= 'A';
  ShowMessage(I);
end;
Run Code Online (Sandbox Code Playgroud)

是正确的,并按预期工作,而下一行

type
  string = Integer;
Run Code Online (Sandbox Code Playgroud)

给出编译时错误.

delphi programming-languages

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

DUnit测试层次结构

目前我在DUnit中使用2级测试层次结构(测试项目 - >测试用例 - >测试方法;参见下面的示例).是否有可能引入第三级甚至更多级别?

DUnit示例

delphi dunit

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

输入重载函数参数的提升

请考虑以下代码:

program Promote;

{$APPTYPE CONSOLE}

uses
  SysUtils;

{$HINTS OFF}

type
  MyWord = record
    FValue: LongWord;
    class operator Implicit(AValue: LongWord): MyWord;
  end;

class operator MyWord.Implicit(AValue: LongWord): MyWord;
begin
  Result.FValue:= AValue;
end;

procedure Test(AValue: MyWord); overload;
begin
  Writeln('MyWord');
end;

procedure Test(AValue: UInt64); overload;
begin
  Writeln('UInt64');
end;

var
  LW: LongWord;

begin
  Test(LW);
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

当我运行它(Delphi XE)时,我看到编译器将LongWord参数提升为UInt64(内置类型),而不是MyWord(用户定义的类型).

我是否可以假设Delphi编译器总是将内置类型提升为内置类型(如果在编译器本身中实现了此类提升)?

更一般地说,在这种情况下控制类型促销的规则是什么(比如我们有2个内置类型,或2个用户定义类型等)?

delphi type-promotion

13
推荐指数
1
解决办法
311
查看次数

如何检测Free Pascal/Lazarus中的内存泄漏?

Delphi中,我通常会编写一个简单的泄漏测试,如下所示:

program MemLeak;

{$APPTYPE CONSOLE}

uses
    SysUtils;

procedure Leak;
begin
    { Put leaking code here. }
end;

begin
    ReportMemoryLeaksOnShutdown:= True;
    try
        Leak;
    except
        on E: Exception do
            Writeln(E.ClassName, ': ', E.Message);
    end;
end.
Run Code Online (Sandbox Code Playgroud)

如何检测Free Pascal/Lazarus中的内存泄漏?

delphi memory-leaks freepascal lazarus

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

Win64上的接口委派

文档指出接口委派仅适用于Win32.目前我无法测试它,是否在64位编译器中停止了文档错误或接口委托?

delphi interface delegation delphi-xe2

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

纠正'in'运算符的使用

请考虑以下过程

procedure InTests;
var
  N, K: Integer;

begin
  N:= 1111;
  if N in [6, 8, 10]          // this is correct, readable and effective code
    then ShowMessage('OK');

  K:= 11;
  if N in [6, 8, 10, K]       // this is correct but less effective
    then ShowMessage('OK');   //  (compiler creates local 16-bytes set var)

  K:= 1111;
  if N in [6, 8, 10, K]       // this is a bug (K > 255)
    then ShowMessage('OK');
end;
Run Code Online (Sandbox Code Playgroud)

in运营商而不是if

  if (N = 6) or …
Run Code Online (Sandbox Code Playgroud)

delphi

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

什么是Free Pascal相当于Delphi的TStopWatch?

我需要在Free Pascal中实现简单的性能基准测试.在Delphi中我使用的TStopWatch是Diagnostics单元的记录,我可以在Free Pascal/Lazarus中使用什么?

delphi freepascal stopwatch lazarus

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

64位编译器中的浮点支持

我们应该从64位Delphi编译器中的浮点支持中得到什么?

  • 64位编译器是否会使用SSE来实现浮点运算?

  • 64位编译器是否支持当前的80位浮点类型(扩展)?

这些问题密切相关,所以我将它们作为一个问题提出来.

delphi delphi-xe2

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