() 新建一个窗体将窗体的Name属性设置为DocuInput选择Project | Options菜单命令将DocuInp窗体从自动创建的窗体列表中删除将窗体保存为DocuInput Formpas该窗体的控件布局和设置如图所示 图 凭证输入窗体 该窗体是本实例中比较重要也比较复杂的一个窗体由于每个凭证项均可对应多个分录数据因此用StringGrid来输入和编辑各个凭证项下属的分录数据比较合适这种关系在一定程度上类似于我们在第章中进销存实例中处理的进货单和进货单明细的关系另外当工具栏中的【修改】【保存】等按钮被按下时实际上是对两个表进行操作由于凭证表和分录表之间存在的约束关系因此代码中对两个表的操作顺序要特别注意各控件的属性设置如表所示窗体中除搜索栏中的编辑框为Edit控件之外其他所有编辑框都是DBEdit控件其DataSource 属性都设置为DataSourceDataField设置为与其相邻的文本中的内容一个DBCombobox的DataSource和DataSource 属性和DBEdit相同其 Items 字段中添加收付转这 项 表 凭证输入窗体控件属性设置 () 设置凭证输入窗体的代码如下 public { Public declarations } procedure SetToolBar(isEnable:bool); procedure SumAccount(); //执行新增和编辑操作后保存时会执行不同的代码 procedure OpType(opname:string); end; //对将要从dll中的调用的函数的声明 type Tshowdllform=function(Ahandle:Thandle; Acaption:string; tablename:string):string; stdcall; Ttable=array[] of string; var DocuInput: TDocuInput; maxnumrecordnumcurRowcurCol:integer; mytable:Ttable; op:string; implementation {$R *dfm} procedure TDocuInputFormClose(Sender: TObject; var Action: TCloseAction); begin action:=cafree; end; //初始化表 procedure TDocuInputDataSourceDataChange(Sender: TObject; Field: TField); var ij:integer; begin //设置数据表宽度 dbgridColumns[]Width:=; dbgridColumns[]Width:=; dbgridColumns[]Width:=; //显示与凭证编号对应的分录表 adoqueryClose; adoquerySQLClear; adoquerySQLAdd(select distinct a*c科目名称 from 分录表 a凭证表 b科目表 c where (a凭证编号=+dbeditText+)and(a科目代码=c科目代码) order by 编号); adoqueryOpen; //初始化表将表格清空 for i:= to do for j:= to do if op<>insert then stringgridCells[ji]:=; //将分录表数据读入表格并保存编号数据以供后面的数据库操作使用 i:=; recordnum:=; while not adoqueryEof do begin stringgridCells[i]:=adoqueryfieldbyname(科目代码)AsString; stringgridCells[i]:=adoqueryfieldbyname(科目名称)AsString; stringgridCells[i]:=adoqueryfieldbyname(借方)AsString; stringgridCells[i]:=adoqueryfieldbyname(贷方)AsString; stringgridCells[i]:=adoqueryfieldbyname(摘要)AsString; mytable[i]:=adoqueryfieldbyname(编号)AsString; i:=i+; recordnum:=recordnum+; adoqueryNext; end; //设置分录表的列宽度 stringgridColWidths[]:=; stringgridColWidths[]:=; stringgridColWidths[]:=; stringgridColWidths[]:=; stringgridColWidths[]:=; //显示凭证数 labelCaption:=inttostr(datasourceDataSetRecordCount); end; [] [] |