отправка типа записи в качестве параметра с использованием dwscript - PullRequest
2 голосов
/ 09 марта 2012

Пожалуйста, рассмотрите эту запись:

Type 
  TStudent = record
    Name:String;
    Age: Integer;
    Class:String;
  end;

У меня есть класс TSchool , который имеет следующую функцию:

function AddStudent(LStudent:TStudent):Boolean;

Я хочу использовать этот класс ( TSchool ) в dwsunit, и эта функция тоже, но я не могу понять, как отправить тип записи в качестве параметра.Вот как далеко я достиг:

procedure TForm1.dwsUnitClassesTSchoolMethodsAddStudentEval(Info: TProgramInfo;
  ExtObject: TObject);
begin
  Info.ResultAsBoolean:=(ExtObject as TSchool).AddStudent(Info.Vars['LStudent'].Value);
end;

, но это не работает, оно продолжает выдавать ошибку об несовместимых типах.

Я также определил в dwsunit запись TSchool, но это тоже не сработало.Любая помощь приветствуется.

1 Ответ

2 голосов
/ 09 марта 2012

У меня сейчас нет Delphi 2010, но у меня есть Delphi XE (он должен работать и в D2010), так что вот что работает для меня, вы, конечно, можете изменить, чтобы соответствоватьваши потребности:

program Project1;

{$APPTYPE CONSOLE}


uses
   SysUtils
  ,Windows
  ,dwsComp
  ,dwsCompiler
  ,dwsExprs
  ,dwsCoreExprs
  ,dwsRTTIExposer
  ,Generics.Collections
  ;

//  required
{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}
{M+}

type
  //  student definition
  TStudent = record
    Name: string;
    Age: Integer;
    AClass: string;
  end;

  //  student list, we use generics
  TStudentList = class(TList<TStudent>);

  //  school class
  TSchool = class(TObject)
  private
    FStudentList: TStudentList;
  published
    constructor Create;
    destructor Destroy; override;
  published
    procedure AddStudent(AStudent: TStudent);
    function GetStudentCount: Integer;
    function GetStudent(Index: Integer): TStudent;
  end;

{ TSchool }

procedure TSchool.AddStudent(AStudent: TStudent);
begin
  FStudentList.Add(AStudent);
end;

constructor TSchool.Create;
begin
  FStudentList := TStudentList.Create;
end;

function TSchool.GetStudentCount: Integer;
begin
  Result := FStudentList.Count;
end;

function TSchool.GetStudent(Index: Integer): TStudent;
begin
  Result := FStudentList[ Index ];
end;

destructor TSchool.Destroy;
begin
  FStudentList.Free;
  inherited;
end;

procedure TestRecords;
var
  LScript: TDelphiWebScript;
  LUnit: TdwsUnit;
  LProg: IdwsProgram;
  LExec: IdwsProgramExecution;
begin
  LScript := TDelphiWebScript.Create(NIL);
  LUnit := TdwsUnit.Create(NIL);
  try
    LUnit.UnitName := 'MySuperDuperUnit';
    LUnit.Script := LScript;

    //  expose TStudent record to the script
    LUnit.ExposeRTTI(TypeInfo(TStudent));
    //  expose TSchool class to script
    LUnit.ExposeRTTI(TypeInfo(TSchool));
    //  compile a simple script
    LProg := LScript.Compile(
      'var LSchool := TSchool.Create;'#$D#$A +
      'var LStudent: TStudent;'#$D#$A +
      'var Index: Integer;'#$D#$A +
      'for Index := 0 to 10 do begin'#$D#$A +
        'LStudent.Name := Format(''Student #%d'', [Index]);'#$D#$A +
        'LStudent.Age := 10 + Index;'#$D#$A +
        'LStudent.AClass := ''a-4'';'#$D#$A +
        'LSchool.AddStudent( LStudent );'#$D#$A +
      'end;'#$D#$A +
      'PrintLn(Format(''There are %d students in school.'', [LSchool.GetStudentCount]));'#$D#$A +
      'LStudent := LSchool.GetStudent( 5 );'#$D#$A +
      'PrintLn(''6th student info:'');'#$D#$A +
      'PrintLn(Format(''Name: %s''#$D#$A''Age: %d''#$D#$A''AClass: %s'', [LStudent.Name, LStudent.Age, LStudent.Aclass]));'
    );

    if LProg.Msgs.HasErrors then begin
      Writeln(LProg.Msgs.AsInfo);
      Exit;
    end;

    try
      LExec := LProg.Execute;
    except
      on E: Exception do
        WriteLn(E.Message + #$D#$A + LExec.Msgs.AsInfo );
    end;
    Writeln(LExec.Result.ToString);
  finally
    LScript.Free;
  end;
end;

begin
  try
    Writeln('press enter to begin');
    Readln;
    TestRecords;;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
...