Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将TStringList传递到TOmniTask过程_Delphi_Delphi 2007_Tstringlist_Omnithreadlibrary - Fatal编程技术网

Delphi 将TStringList传递到TOmniTask过程

Delphi 将TStringList传递到TOmniTask过程,delphi,delphi-2007,tstringlist,omnithreadlibrary,Delphi,Delphi 2007,Tstringlist,Omnithreadlibrary,我在Delphi 2007应用程序中使用OmniThreadLibrary,该应用程序使用全局线程池来执行一些文件操作(我需要尝试并确保它们按特定顺序完成) 我有一个新创建的Ini文件的内容,该文件存储在TStringList中 然后我将TStringList传递给TOmniTask的一个实例 class procedure saveIniFile(const iniFile: TStringList); var task : IOmniTaskControl;

我在Delphi 2007应用程序中使用OmniThreadLibrary,该应用程序使用全局线程池来执行一些文件操作(我需要尝试并确保它们按特定顺序完成)

我有一个新创建的Ini文件的内容,该文件存储在TStringList中

然后我将TStringList传递给TOmniTask的一个实例

class procedure saveIniFile(const iniFile: TStringList);
    var
        task  : IOmniTaskControl;
    begin
        task := CreateTask(saveIniFileTask, 'saveIniFile')
                   .SetParameter('iniFile', iniFile)
                   .Unobserved
                   .Schedule;
    end;
我不知道如何在TOmniTask实例中检索TStringList

class procedure saveIniFileTask(const task: IOmniTask);
    var
        iniFile: TStringList;
    begin
        iniFile := task.Param['iniFile'];
    end;
上述操作将返回一个错误:

Incompatible types: 'TStringList' and 'TOmniValue'
我试过打字:

iniFile:= TStringList(task.Param['iniFile'].AsObject);
但是得到一个编译器错误:

F2084 Internal Error: C4310
我正在使用OmniThreadLibrary 3.0版-我无法在D2007中编译3.03b

如果@gabr是关于:伟大的作品,谢谢你

F2084内部错误:C4310

这是一个内部编译器错误。这是一个编译器错误。您的代码很好,但编译器由于某些原因而阻塞

寻找解决办法。我希望编译器会对在单个表达式中组合数组属性读取、普通属性读取和强制转换感到震惊。代码没有问题,但编译器有时很容易混淆

显然,要尝试的是为编译器提供更简单的表达式。例如,尝试存储到局部变量,然后强制转换:

var
  obj: TObject;
....
obj := task.Param['iniFile'].AsObject;
iniFile := TStringList(obj);
或者,如果不喜欢,请更进一步:

var
  ov: TOmniValue;
  obj: TObject;
....
ov := task.Param['iniFile'];
obj := ov.AsObject;
iniFile := TStringList(obj);
或者你可以通过以下方式逃脱:

var
  ov: TOmniValue;
....
ov := task.Param['iniFile'];
iniFile := TStringList(ov.AsObject);
你应该能让这种方法发挥作用

FWIW,我建议在这里进行检查:

iniFile := ov.AsObject as TStringList;

内部错误
是编译器中的一个bug,无论您做了什么都不应该发生。编译器显然弄糊涂了。如果执行
myObject:=task.Param['iniFile'].AsObject
然后
ini文件:=myObject作为TStringList
?@David Heffernan-非常感谢,我创建了一个临时TObject并读取TOmniValue.AsObject,然后将TObject类型转换为TStringList。您的表达式需要编译器创建一个临时本地TOmniValue,并管理其生存期(它在记录中管理了类型)。这可能是导致编译器消化不良的原因。事实上,您使用的方法是正确的,但编译器有问题。。。大卫的解决方案是正确的。升级到更现代的Delphi后,还可以执行
task.Param['iniFile'].AsObject
。关于编译错误,我将检查发生了什么。我不再使用D2007了,这样的问题会慢慢出现。