Предайте TStringList към процедурата TOmniTask

Използвам OmniThreadLibrary в приложение на Delphi 2007, което използва глобалния пул от нишки, за да извърши предварително някои файлови операции (трябва да опитам и да се уверя, че се извършват в определен ред).

Имам съдържанието на новосъздадения Ini файл, който се съхранява в TStringList.

След това предавам TStringList на екземпляр на TOmniTask.

class procedure saveIniFile(const iniFile: TStringList);
    var
        task  : IOmniTaskControl;
    begin
        task := CreateTask(saveIniFileTask, 'saveIniFile')
                   .SetParameter('iniFile', iniFile)
                   .Unobserved
                   .Schedule;
    end;

Не мога да разбера как да извлека TStringList в екземпляра TOmniTask

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 - не мога да компилирам 3.03b в D2007

Ако @gabr е за: Страхотна работа OmniThreadLibray, благодаря.


person Gavin    schedule 19.09.2014    source източник
comment
Internal Error е грешка в компилатора и не би трябвало да се случи, независимо какво сте направили. Компилаторът явно се е объркал. Какво се случва, ако направите myObject := task.Param['iniFile'].AsObject; и след това iniFile:= myObject as TStringList;?   -  person 500 - Internal Server Error    schedule 19.09.2014
comment
@David Heffernan - благодаря много, създадох временен TObject и прочетох TOmniValue.AsObject и след това прехвърлих Tobject към TStringList.   -  person Gavin    schedule 19.09.2014
comment
Вашият израз изисква компилаторът да създаде временен локален TOmniValue и да управлява живота му (има управлявани типове в записа). Това вероятно е факторът, който причинява лошо храносмилане на компилатора.   -  person David Heffernan    schedule 19.09.2014
comment
Наистина, вие използвате правилен подход, но компилаторът има проблеми ... Решението на Дейвид е правилно. След като надстроите до по-модерен Delphi, можете също да направите task.Param['iniFile'].AsObject<TStringList>.   -  person gabr    schedule 20.09.2014
comment
Относно грешките при компилирането - ще проверя какво става. Вече не използвам D2007 и могат да се появят такива проблеми.   -  person gabr    schedule 20.09.2014
comment
@gabr Благодаря за отговора. Успях да се сдобия с D2010 и всичко работи както е документирано. Решението на Davids работи добре в D7. Още веднъж страхотна работа. Благодаря, че го предоставихте.   -  person Gavin    schedule 10.10.2014


Отговори (1)


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;
person David Heffernan    schedule 19.09.2014