小弟初学delphi,请大虾指教。
以下是小弟的程序,我在程序中使用table控件将cacheupdate设为true;
   当使用  table1.delete;后
   再调用  table1.applyupdates;就会发生一个错误。index in read only;
还有就是在table中用findkey进行查找是不是那个表(tablename)必须是要建立一个索引啊,能不能不建立索引呢。具体怎么做啊。谢谢。
unit main;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, DBTables, StdCtrls,Addnew,DATAModle;type
  TMainForm = class(TForm)
    DBGrid1: TDBGrid;
    Button_Add: TButton;
    Button_Del: TButton;
    Button_Ok: TButton;
    Button_Find: TButton;
    Button_Save: TButton;
    procedure Button_DelClick(Sender: TObject);
    procedure Button_OkClick(Sender: TObject);
    procedure Button_AddClick(Sender: TObject);
    procedure Button_SaveClick(Sender: TObject);
    procedure Button_FindClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  MainForm: TMainForm;
  Change:Boolean;implementationuses Search;{$R *.dfm}procedure TMainForm.Button_DelClick(Sender: TObject);
begin
  if DataModule1.Table1.IsEmpty=true then
    exit
  else
  DataModule1.Table1.Delete;
  Change:=True;
end;procedure TMainForm.Button_OkClick (Sender: TObject);
begin
  if DataModule1.table1.state in [dsInsert, dsEdit] then
    DataModule1.table1.post;
  if Change=True then
  begin
    DataModule1.Table1.ApplyUpdates;
    Change:=False;
  end;
end;
procedure TMainForm.Button_AddClick(Sender: TObject);
begin
  Application.CreateForm(TForm1, Form1);
end;
procedure TMainForm.Button_SaveClick(Sender: TObject);
begin
  if DataModule1.table1.state in [dsInsert, dsEdit] then
    DataModule1.table1.post;
  if Change=True then
  begin
    DataModule1.Table1.ApplyUpdates;
    Change:=False;
    DataModule1.Table1.CommitUpdates;
  end;
end;procedure TMainForm.Button_FindClick(Sender: TObject);
begin
  Application.CreateForm(TSearchForm, SearchForm);
end;procedure TMainForm.FormCreate(Sender: TObject);
begin
  Change:=False;
end;end.

解决方案 »

  1.   

    问题1、我从不设置cacheupdate。
    问题2、用Locate:
       function Locate(const KeyFields: string; const KeyValues: Variant;
        Options: TLocateOptions): Boolean; virtual;你也可以尝试用TQuery用SQL来查找。
      

  2.   

    Locate的用法举例:比如你要找Table1中字段为"ID",值为”200“的纪录
    可以写:table1.locate('ID',200,[]);
    如果找到了,locate返回True,并移动指针到该记录,如果找不到则返回False.
      

  3.   

    请问用Locate可以以多个字段来查找吗?比如查找  city='shanghai' 并且 name="xxx"的记录吗?3ks
      

  4.   

    不可以.
    这种情况你可以用Filter,这可能比较符合你的习惯.
    如:table1.filter := 'city = '+#39+shanghai+#39+'and name='+#39+xxx+#39;
    table1.filtered := true;注:
    1、filter等同于sql的"select * from XXXX where..."
    2、字符字段中可以使用通佩符%
    3、无需索引
      

  5.   

    哦,还得再提醒你一下,显而易见用了Filter之后整个表就是你的查询结果,你可以用next,
    prior,first,last来移动指针,也可以用append,insert,delete来修改这个表。等你不需要这个查询时你只要 Filtered := False;就可以了。这种方法适合任何可以用TTable的数据库的场合。
      

  6.   

    前面有个笔误
    table1.filter := 'city = '+#39+shanghai+#39+'and name='+#39+xxx+#39;
    应为:
    table1.filter := 'city = '+#39+'shanghai'+#39+'and name='+#39+'xxx'+#39;