-1

メソッドの実行が完了すると、アクセス違反または抽象エラーをスローする 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;
4

1 に答える 1