2012-03-09 2 views
2

Пожалуйста, обратите внимание эту запись:послав тип записи в качестве параметра с помощью dwscript

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, но это тоже не сработало. Любая помощь приветствуется.

+0

«Я хочу использовать этот класс в dwsunit, и эта функция тоже« какой класс? или вы ссылались на запись? – ComputerSaysNo

+0

Извините, я отредактирую квест. – Zeina

+0

какая версия Delphi вы используете? – ComputerSaysNo

ответ

2

У меня нет 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. 
+0

звучит интересно, плохо дайте ему попробовать, и ответьте назад, спасибо! – Zeina

+0

Спасибо, все пошло нормально и работало правильно. Но могу ли я спросить дополнительный вопрос? Почему, если у меня был динамический массив, я не могу использовать метод ExposeRTTI (Ошибка: ** Невозможно выставить динамический массив типа: запись **) ... Спасибо – Zeina

+0

учтите, что динамический массив имеет записи (ex : ** TClass: массив TStudent **) – Zeina

Смежные вопросы