但是我已经把能改的都改了啊 不会是只读的了啊 大家救命啊
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, StdCtrls, DBCtrls, ExtCtrls, Buttons, Mask,
  ExtDlgs;type
  TForm1 = class(TForm)
    dgrdCat: TDBGrid;
    DataSource1: TDataSource;
    Panel1: TPanel;
    Splitter1: TSplitter;
    Panel2: TPanel;
    btnadd: TBitBtn;
    btnedt: TBitBtn;
    btnDel: TBitBtn;
    btnsave: TBitBtn;
    btncancel: TBitBtn;
    btnexit: TBitBtn;
    SpeedButton1: TSpeedButton;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    procedure FormShow(Sender: TObject);
    procedure btnaddClick(Sender: TObject);
    procedure BtnCancelClick(Sender: TObject);
    procedure BtnSaveClick(Sender: TObject);
    procedure btnexitClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure btnedtClick(Sender: TObject);
  private
    procedure SetStatus(Flag:Boolean);
    procedure beforeshow;
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementationuses Unit2;{$R *.dfm}
//窗口显示
procedure TForm1.FormShow(Sender: TObject);
begin
  btnsave.Enabled:=false;
  btncancel.Enabled:=false;
  btnadd.Enabled:=true;
  btnedt.Enabled:=true;
  dgrdCat.Enabled:=true;
  SpeedButton1.Visible:=false;
  SetStatus(true);
  btnadd.SetFocus;
end;//新增
procedure TForm1.btnaddClick(Sender: TObject);
begin
  try
     //将数据表置为增加状态
    DM.query1.Append;
  except
    //若操作数据表出错,则报错
    ShowMessage('增加错误,请检查服务器!');
    //调用formshow程序,将界面置为浏览状态
    formshow(Form1);
    exit;
  end;
  //调整输入框的状态
  SetStatus(false);
  //调整按钮相关控件的状态
  beforeshow;
  dbedit1.SetFocus;
end;//修改
procedure TForm1.btnedtClick(Sender: TObject);
begin
  ////若数据表里没有数据,那也就没有必要修改
  if  DM.query1.RecordCount=0 then
  begin
    MessageDlg('该表中没有记录,不能修改!', mtInformation,
      [mbOk], 0);
    formshow(Form1);
    exit;
  end;
  //若数据表中有数据,则修改当前指针所指向的记录
  try
    //将数据表置为修改状态
    DM.query1.Edit;
  except
    //若操作数据表出错,则报错
    showmessage('表无法操作,请检查数据库和网络!');
  end;
  //调整输入框的状态
  SetStatus(false);
  beforeshow;
  //调整按钮和图像编辑相关控件的状态
  dbedit1.SetFocus;
end;
//删除
procedure TForm1.btnDelClick(Sender: TObject);
begin
  //若数据表里没有数据,那也就没有必要删除
  if DM.query1.RecordCount=0 then
  begin
    MessageDlg('该表中没有记录,不能删除!', mtInformation,
      [mbOk], 0);
    formshow(Form1);
    exit;
  end;
  //因为删除数据是不可逆操作,所以需要谨慎一点,加一个确定框
  if MessageDlg('确定要删除该记录吗?',mtConfirmation,
    [mbYes, mbNo],0) = mrYes then
  begin
    //若确实是需要删除,则实施删除操作
    DM.query1.Delete;
    //刷新一遍数据集,保证用户当前界面为最新的数据
    DM.query1.Refresh;
  end;
  //调用formshow程序,将界面置为浏览状态
  formshow(Form1);
end;
//取消
procedure TForm1.BtnCancelClick(Sender: TObject);
begin
 if MessageDlg('确定要取消操作吗?',mtConfirmation,
    [mbYes, mbNo],0) = mrYes then
  begin
    DM.query1.Cancel;
    formshow(Form1);
  end;
end;
//保存
procedure TForm1.BtnSaveClick(Sender: TObject);
var
  typ:string;
begin
   try
     //保存
     DM.query1.Post;
     //刷新一遍数据集
     DM.query1.Refresh;
   except
     //若保存出错,则报错
     MessageDlg('检查记录是否重复了,不能保存!', mtInformation,[mbOk], 0);
     //取消更新操作
     DM.query1.Cancel;
     formshow(Form1);
     exit;
   end;
  //调用formshow程序,将界面置为浏览状态
  formshow(Form1);
end;//设置输入框状态
procedure TForm1.SetStatus(Flag: Boolean);
begin
  dbedit1.ReadOnly:=Flag;
  dbedit2.ReadOnly:=Flag;
  dbedit3.ReadOnly:=Flag;
  dbedit4.ReadOnly:=Flag;
end;//调整按钮和图像编辑相关控件的状态
procedure TForm1.beforeshow;
begin
  btnadd.Enabled:=false;
  btnedt.Enabled:=false;
  btnsave.Enabled:=true;
  btncancel.Enabled:=true;
  dgrdcat.Enabled:=false;
  SpeedButton1.Visible:=true;
end;
 //退出
procedure TForm1.btnexitClick(Sender: TObject);
begin
  Close;
end;
//关闭窗口
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //将操作的数据表关闭。
  datasource1.DataSet.Active:=false;
  //释放该窗体
  Form1:=nil;
  action:=cafree;
end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  //如果数据集处于修改或者增加状态下,则报错
  if (dgrdcat.DataSource.DataSet.State=dsEdit) or (dgrdcat.DataSource.DataSet.State=dsInsert) then
  begin
    MessageDlg('正在操作数据,不能退出!', mtInformation,[mbOk], 0);
    //将canclose属性设为false,表示关闭操作取消,不运行退出
    canclose:=false;
  end;
end;
//创建窗体
procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    DM.query1.Open;
  except
    ShowMessage('数据库打开错误,请检查服务器!');
    close;
  end;
end;end.