相关疑难解决方法(0)

在Delphi中初始化哪些变量?

所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是.我还听说记录成员(也是基于堆栈的)也没有初始化.编译器警告局部变量未初始化([DCC警告] W1036变量'x'可能尚未初始化),但不会对记录成员发出警告.所以我决定进行测试.

对于所有记录成员,我总是从Integers得到0而从布尔都得到.

我尝试打开和关闭各种编译器选项(调试,优化等),但没有区别.我的所有记录成员都正在初始化.

我错过了什么?我正在使用Delphi 2009 Update 2.

program TestInitialization;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TR = Record
  Public
    i1, i2, i3, i4, i5: Integer;
    a: array[0..10] of Integer;
    b1, b2, b3, b4, b5: Boolean;
    s: String;
  End;

var
  r: TR;
  x: Integer;

begin
  try
    WriteLn('Testing record. . . .');
    WriteLn('i1 ',R.i1);
    WriteLn('i2 ',R.i2);
    WriteLn('i3 ',R.i3);
    WriteLn('i4 ',R.i4);
    WriteLn('i5 ',R.i5);

    Writeln('S ',R.s);

    Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' …
Run Code Online (Sandbox Code Playgroud)

delphi variables initialization delphi-2009

32
推荐指数
2
解决办法
8540
查看次数

Delphi中"结果"的默认值是多少?

函数的Result变量是否有任何保证的默认值,如0,''或nil?或者结果总是在使用前初始化?

我有一个函数返回一个这样的字符串:

function Foo(): String
begin
    while {...} do
    Result := Result + 'boingbumtschak';
end;
Run Code Online (Sandbox Code Playgroud)

它运行正常,但现在我得到一些字符串,其中包含之前调用该函数的内容.当我Result := ''在开头添加一个,它没关系.我什么时候应该初始化Result变量,什么时候不需要?(字符串,基元,类实例(零))

delphi

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

"class var"是否初始化为零?

我知道,在Delphi中,实例变量和全局变量被初始化为零(之前已经提到过).

但是,静态变量(class var)呢?我希望类变量初始化为零,就像全局变量一样.但我已经看到太多新的Delphi编译器功能仍然是半生不熟的假设它工作,没有文件实际上声明保证.

帮助没有"class var"的索引条目."Fields"主题提到了类字段,但未指定它们是否在程序启动时初始化.显而易见的初始化它们(class var X: Integer = 0;)的明显修复不会编译("';'期望但'='找到").

类变量是否初始化为零?有文件明确说明这一点吗?

delphi class-variables

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

Delphi + Indy导致高页面错误和RAM使用

我遇到一个奇怪的问题.

我使用Delphi和Indy上传和备份一些文件.它在许多计算机上运行得很好(Win7 64bit,WinXP).CPU使用率低于1%和最大值.RAM为20MB.

但是有一台计算机(Win 2008 R2)存在问题,我无法找到原因.CPU使用率为5-20%,内存需要100MB +,并且增加了很多.此外,"页面错误"上升很多,例如.每秒10万(我的电脑没有增加)

代码很简单

var
  IdHTTP: TIdHTTP;
  IdPostData: TIdMultiPartFormDataStream;
  sResponse: string;
begin
  IdHTTP := TIdHTTP.Create(nil);
  IdPostData:=TIdMultiPartFormDataStream.Create;

  try
    IdPostData.AddFile('file', 'C:\data.dat', '');

    sResponse:=IdHTTP.Post('http://web.com', IdPostData);

    ShowMessage(sResponse);
  finally
    IdHTTP.Free;
    IdPostData.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么"页面错误"增加了很多?是否有可能存在硬件问题?怎么找到它?

delphi indy page-fault

8
推荐指数
1
解决办法
546
查看次数

delphi中的变量初始值

我相信在delphi中局部整数变量没有初始化为零.初始值是在该存储器位置发生的任何事情.因此,在第一次单击按钮时,下面的代码中,第一条消息显示整数值.为什么第二次点击它不会显示3而是显示相同的整数值?每次单击按钮时,它都会继续显示相同的整数值.仅当我停止并重新启动程序时,该值才不同.3存储在哪里,因为看起来每次在同一程序运行中单击按钮时使用相同的内存位置?

procedure TForm1.Button1Click(Sender: TObject);

var
int1 : integer;

begin
   showmessage(inttostr(int1)) ;
   int1 := 3;
end;

end.
Run Code Online (Sandbox Code Playgroud)

delphi

6
推荐指数
2
解决办法
5673
查看次数

当变量未初始化时,会产生简单的代码

今天有一位朋友问我下面的代码:

var
  a: Integer;
begin
  ShowMessage(IntToStr(a));
end;
Run Code Online (Sandbox Code Playgroud)

这是局部变量,尚未初始化,好吗?

将代码放在按钮组件的OnClick事件中,然后以下面三种不同的方式运行代码:

  1. 单击按钮,查看结果,结果= 1635841
  2. 按Enter键,查看结果,结果= 1
  3. 按Space键查看结果,reuslt = 1636097

我在两台不同的计算机上测试代码并看到相同的结果,对此有何看法?

delphi

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

组件编写 - 如何正确处理错误输入的Object Inspector值?

快速问题我找不到任何信息.

在我创建的一个组件上,我有一个Integer类型的值.

我只需要允许在Object Inspector中输入的值在0-10之间,任何超出此范围的内容都应显示一条消息,说明输入的值不合适,然后将焦点返回给Delphi Object Inspector .

例:

TMyComponent = class(TComponent)
private
  FRangeVal: Integer;
  procedure SetRangeVal(const Value: Integer);
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property RangeVal: Integer read FRangeVal write SetRangeVal default 0;
end;

...

procedure SetRangeVal(const Value: Integer);
var
  OldValue: Integer;
begin
  OldValue := Value;
  if (Value < 0) or (Value > 10) then
  begin
    MessageDlg('Please enter a value between 0-10', mtError, [mbOK], 0);
    // FRangeVal := OldValue; ?? revert to the last value that worked …
Run Code Online (Sandbox Code Playgroud)

delphi

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

为什么Assigned对未初始化的变量返回true?

我看了很多帖子在论坛上指点一下,Assigned功能,Free性能,FreeAndNil功能等......我已经知道自由功能不去除指针引用到分配的对象,FreeAndNil做它...所有的帖子我看了对待这个问题的考虑Create方法已经被执行,或者换句话说,考虑已经创建的对象.

我的问题是:为什么Assigned函数对于未初始化的对象变量返回true?

举个例子:

procedure TForm1.FormCreate(Sender: TObject);
var
  Qry: TADOQuery;    
begin
  if Assigned(Qry) then
    ShowMessage('Assigned')
  else
    ShowMessage('Unassigned');

  Qry := TADOQuery.Create(nil);

  if Assigned(Qry) then
    ShowMessage('Assigned')
  else
    ShowMessage('Unassigned');
end;
Run Code Online (Sandbox Code Playgroud)

该示例显示"已分配"两次!

结论:在Qry声明之后,在创建方法执行之前,指针Qry就不是NIL!

如果我把Qry := nil;第一行放到上面的程序中,一切正常......它显示'未分配'和'已分配'.

为什么??

有没有什么安全的方法可以知道类变量是否已经执行了create方法?

delphi variables null pointers

6
推荐指数
3
解决办法
1092
查看次数

如何在delphi XE和XE4中初始化对象

我上课了

type
  TLoadOption = class
  private
    FAutoSearch: Boolean;
  public
    property AutoSearch: Boolean read FAutoSearch write FAutoSearch;
  end;
Run Code Online (Sandbox Code Playgroud)

在其中一个函数中,我在堆栈中创建类的对象

procedure MyView.InitializeForm(const aMsg: MyMsg);
//---------------------------------------------------------------------------
var
  Options: TLoadOption;
begin

  if aMsg.OptionalObject <> nil then
   Options := aMsg.OptionalObject as TLoadOption;

  if Assigned(Options) and Options.AutoSearch then
    DoRefresh;
end;
Run Code Online (Sandbox Code Playgroud)

我没有在aMsg中传递任何内容,所以理想情况下没有设置选项.

在Delphi XE中默认选项设置为nil,因此不会调用此DoRefresh但是当我在Delpi XE4中执行相同的代码时,选项会使用一些随机值进行初始化,并且AutoSearch始终变为true,这会导致调用此DoRefresh函数,这是不需要.

我想知道是否有任何编译器选项将默认值设置为未初始化的变量.我现在唯一的解决方案就是这样

 procedure MyView.InitializeForm(const aMsg: MyMsg);
    //---------------------------------------------------------------------------
    var
      Options: TLoadOption;
    begin
      Options := nil;

      if aMsg.OptionalObject <> nil then
       Options := aMsg.OptionalObject as TLoadOption;

      if Assigned(Options) and Options.AutoSearch then
        DoRefresh;
    end;
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

delphi delphi-xe delphi-xe4

6
推荐指数
3
解决办法
554
查看次数

Delphi 和 Nullable 类型

我正在将一些 C# 代码转换为 Delphi。

在 c# 中,我有 Nullabe 类型:

System.Nullable<T> variable
Run Code Online (Sandbox Code Playgroud)

或者

T? variable
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用一些东西:

int?[] arr = new int?[10];
Run Code Online (Sandbox Code Playgroud)

是否有一些与它等效的 Delphi VCL?

c# delphi

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