我在运行程序的时候,提示下面错误 Project ExpertExtract.exe raised exception class EVariantTypeCastError with message 'Could not convert variant of type(string) into type(Double)'. Process stopped. Use Step or Run to continue.
请问这个是什么毛病,应该怎么样解决啊,谢谢!
请问这个是什么毛病,应该怎么样解决啊,谢谢!
解决方案 »
- delphi findfirst 如何判断文件的隐藏属性
- 瑞星防火墙阻止自动发送邮件怎么办
- ado添加记录
- 高分求助,怎么用delphi播放flash?用swflash控件,万分火急
- 一个关于输入控制的问题。
- 怎么才能用RBuilder实现报表的小计累计功能
- 为什么我在MDI中不能用showmodal来显示我创建的的子窗口!!!
- Delphi 6.0 的最新补丁在哪里可以下载? 急急急!!!!!!
- 通过ADO如何更新或删除视图里的数据?我只想更新一个表!
- 新近回来,大家有赏!!!!!!!!!!!
- ···各位高手,像一些皮肤控件是如何修改诸如MessageBox一类的窗口的外观的??···
- 有关程序运行时提示错误?
谢谢
帮忙解决一下。
那是不是有FLOAT类型的啊
function ExtractFunc(const m_count, e_count:integer; var TArray :array of integer): string;
var
x,i :integer;
st :string;
begin
if e_count <=0 then exit;
//如果e_count > m_count将出现死循环,于是判断并跳出循环
if e_count > m_count then
begin
Application.MessageBox('抽取数目不能大于抽取总数. ', '提示信息', MB_OK);
exit;
end;
i:=1;
st:='';
while i<=e_count do
begin
Randomize;
x :=Random(m_count)+1; //产生1~m_count的随机数
//如果抽取到的随机数x是以前没有抽取到的,则把它保存到st中,用逗号分割
if ansipos( Quotedstr(inttostr(x)) + ',', st) <= 0 then
begin
st :=st + Quotedstr(inttostr(x)) + ',' ;
TArray[i-1] :=x;
i :=i+1;
end;
end;
result :=st;end;procedure TfrmExtract1.FormCreate(Sender: TObject);
{程序说明:打开ADOTable1,打开ADOQuery2 }
var
SGroupId: String;
begin
ADOTable1.Close;
ADOTable1.Connection:=frmMain.ADOConnection1;
ADOTable1.TableName:='ExpertGroup'; //数据表名称!
ADOTable1.Open; //打开数据库表 //浏览ExpertGroup表
ADOTable1.First;
while not ADOTable1.Eof do
begin
SGroupId :=ADOTable1.FieldValues['组ID'];
//计算每组的总人数
with ADOQuery2 do begin
Connection :=frmMain.ADOConnection1;
Close;
SQL.Clear;
SQL.Add('select * from Expert where 组ID= :GroupID and 状态= :Status order by 组ID asc,专家ID asc');
Parameters.ParamByName('GroupID').Value := SGroupId;
Parameters.ParamByName('Status').Value := '正常';
Prepared :=true;
Open; //select语句需用Open方法执行
end;
//修改ExpertGroup 的总人数,抽选人数
ADOTable1.Edit;
ADOTable1.FieldValues['总人数'] :=ADOQuery2.RecordCount;
ADOTable1.FieldValues['抽选人数'] :=0;
ADOTable1.Post;
ADOTable1.Next;
end;
ADOTable1.First; with ADOQuery2 do begin
Connection :=frmMain.ADOConnection1;
Close;
SQL.Clear;
SQL.Add('select * from Expert where 状态= :Status order by 组ID asc,专家ID asc');
Parameters.ParamByName('Status').Value := '正常';
Prepared :=true;
Open; //select语句需用Open方法执行
end;
//选择全部专家
ADOQuery2.First;
while not ADOQuery2.Eof do
begin
ADOQuery2.Edit;
ADOQuery2.FieldValues['选中'] :=true;
ADOQuery2.Post;
ADOQuery2.Next;
end;
ADOQuery2.First;
btnCancel.Caption :='取消全部选中'; Button4Click(Parent);
button3.Enabled :=false;
end;procedure TfrmExtract1.Button1Click(Sender: TObject);
var
sGroupId, sSearch, sReturn :string;
iOptioncount,IExtracount :integer;
tempArray1: array of integer;
i :integer;
begin sReturn :='';
sSearch :='';
GsSearch :=''; //浏览ExpertGroup表
ADOTable1.First;
while not ADOTable1.Eof do
begin
SGroupId :=ADOTable1.FieldValues['组ID'];
IOptioncount :=ADOTable1.FieldValues['总人数'];
IExtracount :=ADOTable1.FieldValues['抽选人数'];
if IExtracount <=0 then
begin
ADOTable1.Next;
continue; // 抽选人数为0,则跳出本次循环
end; if IExtracount > IOptioncount then
begin
Application.MessageBox('抽选人数不能大于总人数, 请重新输入. ', '提示信息', MB_OK);
exit;
end;
//计算出每组选中的专家总人数
with ADOQuery1 do begin
Close;
Connection :=frmMain.ADOConnection1;
SQL.Clear;
SQL.Add('select * from Expert where 组ID like :GroupID and 选中= True and 状态= :Status Order by 组ID asc,专家ID asc');
Parameters.ParamByName('GroupID').Value := SGroupId;
Parameters.ParamByName('Status').Value := '正常';
Prepared :=true;
Open; //select语句需用Open方法执行
end; if IExtracount > ADOQuery1.RecordCount then
begin
Application.MessageBox('抽选人数不能大于该组选中的专家总人数, 请重新输入. ', '提示信息', MB_OK);
exit;
end;
setlength(TempArray1,IExtracount); //根据抽选人数为数组分配内存空间
//调用抽取函数, ADOQuery1.RecordCount是有效的专家总人数
sReturn :=ExtractFunc(ADOQuery1.RecordCount,IExtracount,TempArray1); for i :=low(TempArray1) to high(TempArray1) do
begin
ADOQuery1.first;
ADOQuery1.MoveBy(TempArray1[i]-1);
//构造查询字符串
sSearch :=sSearch + ''''+ ADOQuery1.FieldValues['专家ID'] + ''',';
GsSearch := GsSearch + '专家ID = ' + QuotedStr(ADOQuery1.FieldValues['专家ID']) + ' OR ';
end;
ADOTable1.Next;
end;
ADOTable1.First; //完成浏览ExpertGroup表 tempArray1 :=nil; //释放临时数组内存空间
if sSearch = '' then //如果没有构造查询字符串,则构造
begin
sSearch :='''' + '''';
GsSearch :='专家ID = ' + QuotedStr('')
end
else begin
sSearch :=copy(sSearch,1,length(sSearch)-1); //去掉结尾的逗号
GsSearch :=copy(GsSearch,1,length(GsSearch)-3); //去掉结尾的OR
end;
sSearch := 'select * from Expert where 专家ID in (' + sSearch + ') ' +
' Order by 组ID asc,专家ID asc'; //创建抽取结果窗口
frmExtractResult :=TfrmExtractResult.Create(Application);
with frmExtractResult.ADOQryResult do begin
Close;
SQL.Clear;
SQL.Add(sSearch);
Prepared :=true;
Open; //select语句需用Open方法执行
end;
frmExtractResult.ShowModal; frmExtract1Rep :=TfrmExtract1Rep.Create(Application);
with frmExtract1Rep.ADOTable1 do begin
Close;
Connection:=frmMain.ADOConnection1;
TableName:='Expert'; //数据表名称!
Filtered := False;
Filter :=GsSearch ;
Filtered :=true;
Open; //打开数据库表
end;
button3.Enabled :=true;
end;
begin
close;
end;procedure TfrmExtract1.Button3Click(Sender: TObject);
begin
frmExtract1Rep.QuickRep1.Preview;
end;procedure TfrmExtract1.SaveBoolean;
begin
DBGrid3.SelectedField.DataSet.Edit;
if adoquery2.FieldValues['选中'] = false then
adoquery2.FieldValues['选中'] := true
else
adoquery2.FieldValues['选中'] := false;
// DBGrid3.SelectedField.AsBoolean :=not DBGrid3.SelectedField.AsBoolean;
DBGrid3.SelectedField.DataSet.Post;
end;procedure TfrmExtract1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;procedure TfrmExtract1.Button4Click(Sender: TObject);
begin
ADOQuery2.First;end;
procedure TfrmExtract1.DBGrid3DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
{ 利用WIN32 API函数:DrawFrameControl(),此函数可以直接画出Checkbox组件,
所以就无须在表单中实际添加组件。
设定一个整型数组常数,返回的整数值是与布尔值相一致的,如果字段是逻辑字段,
则只将其布尔值放入数组中,提供给DrawFrameControl()函数中的状态参数进行调用,
从而实现了Checkbox组件在网格中的嵌入效果。
}
const
//这个整数值将按照布尔值返回,并送入数组
CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK or DFCS_CHECKED);
//CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_CHECKED );
begin //确保只有在逻辑字段才能插入组件
if column.Field.DataType = ftBoolean then
begin
DBGrid3.Canvas.FillRect(Rect);
DrawFrameControl(DBGrid3.Canvas.Handle,Rect,DFC_BUTTON,CtrlState[Column.Field.AsBoolean]);
end;end;procedure TfrmExtract1.DBGrid3ColEnter(Sender: TObject);
//当逻辑字段所在栏得到焦点时,要关闭TDBGrid.Options中dgEditing的可编辑模式。
begin //确保该栏是逻辑字段
if DBGrid3.SelectedField.DataType = ftBoolean then
begin
//OriginalOptions :=DBGrid3.Options; //设定变量来存储原始的 TDBGrid.Options的所有属性值
//DBGrid3.Options :=DBGrid3.Options -[dgEditing];
DBGrid3.Options :=[dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit]
end;
end;procedure TfrmExtract1.DBGrid3ColExit(Sender: TObject);
//当逻辑字段所在栏失去焦点时,要打开TDBGrid.Options中dgEditing的可编辑模式。
begin
//确保该栏是逻辑字段
if DBGrid3.SelectedField.DataType = ftBoolean then
//DBGrid3.Options := OriginalOptions;
DBGrid3.Options :=[dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit]
end;procedure TfrmExtract1.DBGrid3CellClick(Column: TColumn);
//通过鼠标点击或敲打空格键改变布尔值
begin
//确保该栏是逻辑字段
if DBGrid3.SelectedField.DataType = ftBoolean then
SaveBoolean();end;procedure TfrmExtract1.DBGrid3KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
//通过鼠标点击或敲打空格键改变布尔值
begin
//确保该栏是逻辑字段和空格键在键盘中被敲击
if (Key =VK_SPACE) and (DBGrid3.SelectedField.DataType = ftBoolean) then
SaveBoolean();end;procedure TfrmExtract1.ADOTable1ExtractCountChange(Sender: TField);
//var I :integer;
begin if VarIsnull(ADOTable1.FieldValues['抽选人数']) then
begin
ADOTable1.Cancel;
end;
// if not TryStrToInt(ADOTable1.FieldByName('抽选人数').Text,I) then
// begin
// ADOTable1.FieldByName('抽选人数').Text :=inttostr(I);
// ADOTable1.Cancel;
// end; if ADOTable1.FieldValues['抽选人数'] < 0 then
begin
ADOTable1.Cancel;
end;end;procedure TfrmExtract1.DBGrid1ColEnter(Sender: TObject);
begin
//确保该栏是逻辑字段
if DBGrid1.SelectedField.FieldName = '抽选人数' then
begin
DBGrid1.Options :=[dgEditing,dgAlwaysShowEditor,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit]
end;
end;procedure TfrmExtract1.DBGrid1ColExit(Sender: TObject);
begin
//确保该栏是逻辑字段
if DBGrid1.SelectedField.FieldName = '抽选人数' then
begin
DBGrid1.Options :=[dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit]
end;
end;procedure TfrmExtract1.DBGrid1Exit(Sender: TObject);
begin
DBGrid1ColExit(Parent);
end;procedure TfrmExtract1.btnExportClick(Sender: TObject);
{
var
WordApp,WordDoc,WordTable :OleVariant;
i,j:integer;
}
begin
{
WordApp:=CreateOleObject('Word.Application');
WordApp.Visible:=True;
WordDoc:=WordApp.Documents.Add;
//在新建文档中增加表格,指定表格的行数与列数
WordTable:=WordDoc.Tables.Add(WordApp.Selection.Range, DBGrid2.DataSource.DataSet.RecordCount+1, DBGrid2.Columns.Count);
//插入表格的标题行
for i:=1 to DBGrid2.Columns.Count do
WordTable.Cell(1,i).Range.InsertAfter(DBGrid2.Columns[i-1].Title.Caption); i:=2;
DBGrid2.DataSource.DataSet.First;
with DBGrid2.DataSource.DataSet do
while not eof do
begin
for j:=1 to DBGrid2.Columns.Count do
begin
if varIsNull(DBGrid2.Columns[j-1].Field.Value) then
WordTable.Cell(i,j).Range.InsertAfter('')
else
WordTable.Cell(i,j).Range.InsertAfter(DBGrid2.Columns[j-1].Field.Value);
end;
Next;
i:=i+1;
end;
DBGrid2.DataSource.DataSet.First;
}
end;procedure GoToWord(db_GRID: TDBGRID; q2: TADOQuery; f1: string); //从DBGRID导数据到Word
var
i, j: integer;
WordApp, WordDoc, WordParagraph, WordRange, WordTable: variant;
SltRec, SltCol: integer;
begin
if not (q2.Active) then //数据集没有打开就返回
begin
ShowMessage('导出的数据集没有打开!');
Exit;
end; try
WordApp := CreateOleObject('word.Application');
WordApp.Visible:=True;
WordDoc := WordApp.documents.Add;
// wordapp.application.visible:=true;
WordParagraph := WordApp.activedocument.paragraphs.Add;
WordRange := WordParagraph.range;
except
ShowMessage('请确认WORD安装正确!');
WordDoc.close;
WordApp.Quit;
WordApp := Unassigned; //释放VARIANT变量
Exit;
end; try
SltRec := q2.recordcount;
SltCol := db_GRID.Columns.Count;
//在新建文档中增加表格,指定表格的行数与列数
WordTable := WordApp.activedocument.tables.Add(WordRange, SltRec + 1, SltCol);
//插入表格的标题行
i := 1;
for j := 1 to db_GRID.Columns.Count do
begin
if db_GRID.Columns[j-1].Visible then
WordTable.Cell(i, j).range.InsertAfter(db_GRID.Columns[j-1].Title.Caption);
end;
//插入表格的内容行
i := 2;
q2.First;
while not q2.Eof do
begin
for j := 1 to db_GRID.Columns.Count do
begin
if db_GRID.Columns[j-1].Visible then
WordTable.Cell(i, j).range.InsertAfter(q2.fieldbyname(db_GRID.Columns[j-1].FieldName).AsString);
end;
i := i + 1;
q2.next;
end;
q2.First;
// WordApp.activedocument.saveas(f1);
// WordApp.activedocument.close;
except
ShowMessage('不能正确操作Word文件。可能是该文件已被其他程序打开,或系统错误。');
WordDoc.close;
WordApp.Quit;
WordApp := Unassigned; //释放VARIANT变量
Exit;
end;
end;
代码比较长,大家看看吧
sSearch := sSearch +''''+inttostr(ADOQuery1.fieldbyname('专家ID').value)+''',';
你试试这回应该好使了
把所有从表中取字段值的语句 XXXX.fields[X].value 改为 .asString