相关疑难解决方法(0)

初始化字符串函数结果?

我刚刚调试了一个函数,它返回一个让我担心的字符串.我一直认为返回字符串的函数的隐式Result变量在函数调用开始时将为空,但以下(简化)代码产生了意外的结果:

function TMyObject.GenerateInfo: string;

        procedure AppendInfo(const AppendStr: string);
        begin
          if(Result > '') then
            Result := Result + #13;
          Result := Result + AppendStr;
        end;

begin
  if(ACondition) then
    AppendInfo('Some Text');
end;
Run Code Online (Sandbox Code Playgroud)

多次调用此函数导致:

"Some Text"
Run Code Online (Sandbox Code Playgroud)

第一次,

"Some Text"
"Some Text"
Run Code Online (Sandbox Code Playgroud)

第二次,

"Some Text"
"Some Text"
"Some Text"
Run Code Online (Sandbox Code Playgroud)

第三次等

要修复它,我必须初始化结果:

begin
  Result := '';
  if(ACondition) then
    AppendInfo('Some Text');
end;
Run Code Online (Sandbox Code Playgroud)

是否需要初始化字符串函数结果?为什么(技术上)?为什么编译器不会发出警告"W1035函数的返回值'xxx'可能是未定义的"字符串函数?我是否需要遍历所有代码以确保设置值,因为如果未明确设置结果,则期望函数中的空字符串不可靠?

我在一个新的测试应用程序中对此进行了测试,结果是一样的.

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  S: string;
begin
  for i := 1 to 5 do
    S := GenerateInfo;
  ShowMessage(S); // 5 …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2007 compiler-warnings

29
推荐指数
2
解决办法
4564
查看次数

字符串格式过程类似于writeln

随着writeln我可以格式化数字成一条线的文字.

var 
  file: text;
  mystring: string;

begin
  writeln(file,'Result is: ', var1:8:2,' | ', var2:8:2,' |');
end;
Run Code Online (Sandbox Code Playgroud)

在Delphi中是否有一个类似的易于使用的程序,可以执行类似的结果

  _format_string(mystring, 'Result is: ', var1:8:2,' | ', var2:8:2,' |');
Run Code Online (Sandbox Code Playgroud)

谢谢.

delphi string format file

11
推荐指数
3
解决办法
1703
查看次数

正常松开"分配给过程变量的本地过程/功能"限制

考虑以下测试用例:

{ CompilerVersion = 21 }
procedure Global();

  procedure Local();
  begin
  end;

type
  TProcedure = procedure ();
var
  Proc: TProcedure;
begin
  Proc := Local;  { E2094 Local procedure/function 'Local' assigned to procedure variable }
end;
Run Code Online (Sandbox Code Playgroud)

在第13行,编译器发出具有ERROR级别的消息,禁止所有这种本地过程使用的情况."官方"决议是将Local符号推广到外部范围(即:使其成为兄弟姐妹Global),这将对代码"结构性"产生负面影响.


我正在寻找以最优雅的方式规避它的方法,最好使编译器发出警告级别的消息.

delphi procedural scope

8
推荐指数
2
解决办法
2204
查看次数

用于评估反向参数的Delphi编译器指令

使用Math.pas的IFThen函数,我对这个delphi二线程印象非常深刻.但是,它首先评估DB.ReturnFieldI,这是不幸的,因为我需要调用DB.first来获取第一条记录.

DB.RunQuery('select awesomedata1 from awesometable where awesometableid = "great"');
result := IfThen(DB.First = 0, DB.ReturnFieldI('awesomedata1'));
Run Code Online (Sandbox Code Playgroud)

(作为一个毫无意义的澄清,因为我已经有了很多好的答案.我忘了提到0是DB.First返回的代码,如果它有内容,否则可能没有意义)

显然这不是什么大问题,因为我可以使用五个强大的衬垫.但是我需要的就是让Delphi首先评估DB.first,然后再评估DB.ReturnFieldI.我不想改变math.pas而且我认为这不保证我会过度使用ifthen,因为它有16个ifthen函数.

只是让我知道编译器指令是什么,如果有更好的方法来做到这一点,或者如果没有办法做到这一点,任何人的程序是调用db.first并盲目地检索他发现的第一件事不是一个真正的程序员.

delphi compiler-directives

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