Мне нужна помощь в устранении проблемы с моей базой данных. У меня есть файл .mdb, содержащий записи автомобилей. Это связано с моим ADOTable, а затем с DBGrid в Delphi. Когда я удаляю записи с помощью кнопки в моей форме, кажется, что они не удаляются должным образом, потому что, когда я прокручиваю dbgrid, предполагается, что активная запись изменяется/обновляется (зависит от того, прокручиваю ли я вниз или up) и отображать значение каждого поля активной записи в редактировании под DBGrid.
После того, как мой код удалил запись, она не отображается в DBGrid или в файле .mdb, когда я просматриваю ее в MS Access, поэтому я предположил, что она была правильно удалена. Но, как я объяснил выше, когда событие OnMouseWheel выполняется, оно отображает то, что, как я предполагаю, является либо удаленной записью, либо данными предыдущей записи, когда указатель активной записи DBGrid ясно показывает, что он должен отображать данные следующей или предыдущей записи.
Интересно отметить, что кнопки OnCellClick и DBGridNavigator не оказывают такого влияния на DBGrid и отображаемую информацию о записи.
Картинки:
Каждое изображение после 1 выполнения:
Изображение фактического файла .mdb:
Код используемых процедур и функций:
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;
Показать_детали_автомобиля:
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;
Любые советы и помощь приветствуются!!! С Уважением
MouseWheel
не является подходящим местом для обновления элементов управления полем. Если метод вызывается до, когда событие обрабатывается сеткой, вы в конечном итоге отображаете предыдущую запись. - person Olivier   schedule 18.10.2020OnDataChange
было правильным событием для использования! Вы, ребята, спасли мне жизнь. - person Romans   schedule 18.10.2020