メソッドの実行が完了すると、アクセス違反または抽象エラーをスローする TButton イベント ハンドラがあります。次に、Delphiend.
は私のプロジェクト ソース ファイルを強調表示します。メソッドは正常に実行され、データベースから正しい行が削除されます。
実行時に作成されるコンポーネントがあります。各行には、ラベル、「更新」ボタン、および「削除」ボタンが含まれており、名前に関連付けられているデータベースの行番号が含まれています。エラーをスローするイベント ハンドラーは削除用です。
procedure TFormInventoryMngmnt.ProductDeleteClick(Sender: TObject);
var
button : TButton;
row : integer;
confirm : integer;
begin
// Assuming it is button..how else can this be called?
button := Sender as TButton;
// Get row
row := StrToInt(StringReplace(button.Name, 'Delete', '', [rfReplaceAll, rfIgnoreCase]));
// Confirm
confirm := MessageDlg('Are you sure?', mtInformation, [mbYes, mbNo], 0);
if confirm = mrYes then
begin
// Delete row
UnitSession.Query.SQL.Clear;
UnitSession.Query.SQL.Add(Format(' DELETE FROM Products WHERE Product_ID = %s ', [IntToStr(row)]));
UnitSession.Query.ExecSQL;
buildManagementSection;
end;
// FIXME: why is this throwing access / abstract violation
end;
さらにコードや説明が必要な場合は、コメントを残してください。折り返しご連絡いたします。
ありがとう!
のコードで更新buildManagementSection
リスナーからの呼び出しをコメントアウトしましたがbuildManagementSection
、例外はスローされませんでした。このエラーは以下の方法で発生する可能性がありますが、今まで問題が発生したことはありません。
procedure TFormInventoryMngmnt.buildManagementSection;
var
index : integer;
runningHeight : integer;
productName : TLabel;
productUpdate : TButton;
productDelete : TButton;
const
MARGIN_TOP = 35;
// Left value of labels
LABEL_LEFT = 0;
// Left value of update button
UPDATE_LEFT = 235;
// Left value of delete button
DELETE_LEFT = 315;
begin
// Run sql query
UnitSession.Query.SQL.Clear;
UnitSession.Query.SQL.Add('SELECT Product, Product_ID FROM Products ORDER BY Product_ID');
UnitSession.Query.Active := true;
// Remove all components in the manage section
for index := (ScrollBoxManage.ComponentCount - 1) downto 0 do
begin
ScrollBoxManage.Components[index].Free;
end;
// No items
if UnitSession.Query.RecordCount = 0 then
begin
productName := TLabel.Create(ScrollBoxManage);
productName.Parent := ScrollBoxManage;
productName.Caption := 'No items!';
productName.Font.Color := clRed;
productName.Visible := true;
exit;
end;
// Build form
UnitSession.Query.First;
runningHeight := 0;
for index := 0 to (UnitSession.Query.RecordCount - 1) do
begin
// Create components
productName := TLabel.Create(ScrollBoxManage);
productUpdate := TButton.Create(ScrollBoxManage);
productDelete := TButton.Create(ScrollBoxManage);
// Set parents
productName.Parent := ScrollBoxManage;
productUpdate.Parent := ScrollBoxManage;
productDelete.Parent := ScrollBoxManage;
// Set values
productName.Caption := UnitSession.Query.Fields[0].AsString;
productUpdate.Caption := 'Update';
productDelete.Caption := 'Delete';
// Set event handlers
productUpdate.OnClick := FormInventoryMngmnt.ProductUpdateClick;
productDelete.OnClick := FormInventoryMngmnt.ProductDeleteClick;
// Set top position
productName.Top := runningHeight + 3;
productUpdate.Top := runningHeight;
productDelete.Top := runningHeight;
// Set button association
productName.Name := 'Label' + UnitSession.Query.Fields[1].AsString;
productUpdate.Name := 'Update' + UnitSession.Query.Fields[1].AsString;
productDelete.Name := 'Delete' + UnitSession.Query.Fields[1].AsString;
// Set left position
productName.Left := LABEL_LEFT;
productUpdate.Left := UPDATE_LEFT;
productDelete.Left := DELETE_LEFT;
// Set as visible
productName.Visible := true;
productUpdate.Visible := true;
productDelete.Visible := true;
runningHeight := runningHeight + MARGIN_TOP;
UnitSession.Query.Next;
end;
end;