我在运行是,弹出一个惊叹号错误对话框:project fc.exe raised class EVariantError with 
message 'InValid variant operation',Process stopped.Used step or Run continue
我继续按了Run,在弹出一个惊叹号错误对话框:project fc.exe raised class EVariantError with 
message 'InValid variant type conversion',Process stopped.Used step or Run continue
请问这是什么原因

解决方案 »

  1.   

    程序运行的时候有变量值为空,但你又引用了这个变量,所以有这样的提示。
    记住在使用变量的时候先判断变量是否为空,记住程序多多使用Assigned/IsEmpty/=NIL等
      

  2.   

    在数据库编程时多出现此问题
    对于数据库
    先检查它是否isnull
    或者用转换
    asinteger asstring
    这样会好一些
    而不要直接用value
    或fieldvalues
      

  3.   

    有关variant的代码如下:请看看是什么运算导致的错误!或者怎么改???
    var
      Frm_flow: TFrm_flow;
      flowstr :array[0..11]  of string;
      //flowid :array[0..11] of string;
      flowid: Variant;
     // sh_dx :Variant;
      //workname:Variant;
    implementationuses dmfc;{$R *.dfm}procedure TFrm_flow.FormCreate(Sender: TObject);beginfcdm.ADOQuery1.Close;
    fcdm.ADOQuery1.SQL.Clear;
    fcdm.ADOQuery1.SQL.Add('select work_name.work_name from work_name');
    fcdm.ADOQuery1.Open;
    while not fcdm.ADOQuery1.Recordset.EOF do
    begin
       listbox_flow.Items.Add(fcdm.ADOQuery1.Recordset.Fields.Item[0].value);
       fcdm.ADOQuery1.Recordset.MoveNext;
    end;
    listbox_flow.ItemIndex:=0;
    end;procedure TFrm_flow.ListBox_flowClick(Sender: TObject);beginfcdm.ADOQry_flow.Close;
    fcdm.ADOQry_flow.Parameters.ParamByName('name').Value:=ListBox_flow.Items[ListBox_flow.ItemIndex];
    fcdm.ADOQry_flow.Open;
    fcdm.ADOQry_flow.Active:=true;end;procedure TFrm_flow.Btn_modifyClick(Sender: TObject);
    begin
    dbgrideh1.Enabled:=true;end;procedure TFrm_flow.Btn_cancelClick(Sender: TObject);begin
    frm_flow.Close;
    end;procedure TFrm_flow.Btn_saveClick(Sender: TObject);
    var
    i:integer;str:string;
    str_type:string;workname:string;
    begin
    str_type:='';
    flowid:= VarArrayCreate([0, 11], varVariant);dbgrideh1.DataSource.DataSet.First;
    for i:=0 to dbgrideh1.DataSource.DataSet.RecordCount-1 do
    begin
    str:=fcdm.ADOQry_flowFLOW_NAME.Value;
       if str='收件登记' then
              flowid[i]:='A';
       if str='复审' then
              flowid[i]:='B';
       if str='审批' then
               flowid[i]:='C';
       if str='缮证' then
               flowid[i]:='D';
       if str='收费' then
                flowid[i]:='E';
       if str='发证' then
                flowid[i]:='F';
       if str='归档' then
                 flowid[i]:='G';
       if str='交易复审' then
                 flowid[i]:='H';
       if str='交易审批' then
                  flowid[i]:='I';
       if str= '产权初审' then
                  flowid[i]:='J';
       if str='生成分户表' then
                  flowid[i]:='K';
       if str= '面积分摊' then
                   flowid[i]:='L';
       if str= '测绘报告打印' then
                    flowid[i]:='M';
       if str='签订合同' then
                    flowid[i]:='O';
       if str= '出单维修' then
                    flowid[i]:='P';
       if str='结束' then
                    flowid[i]:='W'; str_type:=str_type+flowid[i];
     dbgrideh1.DataSource.DataSet.Next;
    end;
    workname:=ListBox_flow.Items[ListBox_flow.ItemIndex];fcdm.ADOStoredProc_flow.Close;
    fcdm.ADOStoredProc_flow.Parameters.ParamByName('flowstr').Value:=str_type;
    fcdm.ADOStoredProc_flow.Parameters.ParamByName('flowname').Value:= ListBox_flow.Items[ListBox_flow.ItemIndex];
    fcdm.ADOStoredProc_flow.ExecProc;
    //if fcdm.ADOStoredProc_flow then
             MessageBox(handle,'资料已经修改成功!','电脑提醒您!',MB_OK);
    end;procedure TFrm_flow.DBGridEh1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumnEh;
      State: TGridDrawState);
    begin
      if gdSelected in State then
      begin
        dbgrideh1.Canvas.Brush.Color := clNavy;
        dbgrideh1.Canvas.Font.Color := clWhite;
      end;end;procedure TFrm_flow.Button1Click(Sender: TObject);
    begin
    fcdm.ADOQry_flow.Edit;
    fcdm.ADOQry_flow.Delete;
    end;end.
      

  4.   

    注意:varaint书组需要申请空间!
      

  5.   

    varaint书组需要申请空间!怎么个申请法阿??请指教??还是要初始化??
      

  6.   

    另外在ParamByName('flowstr')中后面为什么只能跟.value,其它如asstring都不能写,提示都要错误的?为什么??
      

  7.   

    付值的时候不能ASSTRING,在取值的时候才弄用。
    要注意后面的类型要和你数据库中定义的一样。
      

  8.   

    V: Variant; ...
    V := VarArrayCreate([0,9], varInteger);
      

  9.   

    V := VarArrayCreate([0,9], varInteger);
    这个不是varInteger,要换成varString但是还是不行,一样的错误!
      

  10.   

    flowid: Variant;flowid:= VarArrayCreate([0, 11], varVariant);
    怎么当树组用了?