我需要帮助来解决数据库问题。我有一个.mdb文件,其中包含汽车记录。这链接到我的ADOTable,然后链接到Delphi中的DBGrid。当我通过表单上的按钮删除记录时,它似乎无法正确删除,因为当我滚动查看dbgrid时,活动记录应该更改/更新(取决于我是向下滚动还是向上滚动)并显示值活动记录的每个字段在DBGrid下面的编辑中的位置。
我的代码删除记录后,当我在MS Access中查看该记录时,该记录未出现在DBGrid或.mdb文件中,因此我认为已正确删除了该记录。但是,就像我在上面解释的那样,当执行OnMouseWheel事件时,当DBGrid活动记录的指针清楚地表明它应该显示下一个或上一个记录数据时,它会显示我猜测是删除的记录或上一个记录的数据。
有趣的是,OnCellClick和DBGridNavigator按钮对DBGrid和显示的记录信息没有影响。
OnMouseWheel:
procedure TCars.DBGrid1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer;
MousePos: TPoint; var Handled: Boolean);
begin
Show_Car_Details;
end;
OnCellClick:
procedure TCars.DBGrid1CellClick(Column: TColumn);
begin
Show_Car_Details;
end;
Show_Car_Details:
procedure TCars.Show_Car_Details;
begin
with CarOwners.tbl_Cars do
begin
edt_Car_ID.text := inttostr(fieldbyname('ID').value);
edt_Car_Type.text := fieldbyname('Make').value;
edt_Car_Price.text := FloatToStr(fieldbyname('Price').value);
edt_Car_Distance.text := inttostr(fieldbyname('Distance').value);
edt_Owner_ID.text := inttostr(fieldbyname('OwnerID').value);
if fieldbyname('Insurance').value = true then
begin
cbx_Insurance.ItemIndex := 0;
end
else
begin
cbx_Insurance.ItemIndex := 1;
end;
end;
end;
删除过程:
procedure TCars.bit_DeleteClick(Sender: TObject);
begin
if messagedlg
('Are you sure you want to delete this record? It will permanently be removed.',
mtConfirmation, [mbyes, mbno], 0) <> mryes then
exit;
CarOwners.tbl_Cars.Delete;
DBGrid1.DataSource.DataSet.Refresh;
end;
以防万一,还要为添加和更新过程编写代码: 添加:
procedure TCars.bit_AddClick(Sender: TObject);
var
Make: string;
OwnerID, Distance: Integer;
Price: real;
Insurance: Boolean;
begin
Make := edt_Car_Type.text;
OwnerID := strtoint(edt_Owner_ID.text);
Distance := strtoint(edt_Car_Distance.text);
Price := strtofloat(edt_Car_Price.text);
if cbx_Insurance.ItemIndex = 0 then
begin
Insurance := true;
end
else
begin
Insurance := false;
end;
Add_Record(Make, OwnerID, Price, Distance, Insurance);
end;
//---------------------------------------------------------
procedure TCars.Add_Record(Make: string; OwnerID: Integer; Price: real;
Distance: Integer; Insurance: Boolean);
begin
// ----validation----
//validation done here(removed for space, just basic if with exit.)
// add new information
with CarOwners do
begin
tbl_Cars.DisableControls;
tbl_Cars.last;
tbl_Cars.Insert;
tbl_Cars['Make'] := Make;
tbl_Cars['OwnerID'] := OwnerID;
tbl_Cars['Price'] := Price;
tbl_Cars['distance'] := Distance;
tbl_Cars['Insurance'] := Insurance;
tbl_Cars.post;
tbl_Cars.EnableControls;
end;
end;
更新步骤:
procedure TCars.bit_UpdateClick(Sender: TObject);
var
Brand: string;
Price: real;
Insurance: Boolean;
OwnerID, Distance: Integer;
begin
Brand := edt_Car_Type.text;
Price := strtofloat(edt_Car_Price.text);
OwnerID := strtoint(edt_Owner_ID.text);
Distance := strtoint(edt_Car_Distance.text);
if cbx_Insurance.ItemIndex = 0 then
begin
Insurance := true;
end
else
begin
Insurance := false;
end;
Update_Record(Brand, OwnerID, Price, Distance, Insurance);
end;
//------------------------------------------------------------
procedure TCars.Update_Record(Make: string; OwnerID: Integer; Price: real;
Distance: Integer; Insurance: Boolean);
begin
//validation done here(removed for space, just basic if with exit.)
// ----Update Information ----
with CarOwners do
begin
tbl_Cars.DisableControls;
tbl_Cars.edit;
tbl_Cars['Make'] := Make;
tbl_Cars['OwnerID'] := OwnerID;
tbl_Cars['Price'] := Price;
tbl_Cars['Distance'] := Distance;
if Insurance then
begin
tbl_Cars['Insurance'] := true;
end
else
begin
tbl_Cars['Insurance'] := false;
end;
// ShowMessage('Posting...');
tbl_Cars.post;
// ShowMessage('Done');
tbl_Cars.EnableControls;
end;
end;
欢迎任何建议或协助!!!问候
感谢@MartynA和@Olivier的回答。问题是使用错误的事件处理程序来刷新和显示记录的字段值。
不使用: OnMouseWheel
采用:
procedure TCarOwners.ds_CarsDataChange(Sender: TObject; Field: TField);
begin
if Field = nil then
begin
Cars.show_car_details;
end;
end;
这将正确更新非数据感知控件。请确保将Form1
或在我的情况下直接添加Cars_frm
到uses
列表中implementation
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句