问些菜鸟级的问题(50分)

  • 主题发起人 主题发起人 lily
  • 开始时间 开始时间
L

lily

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想在程序运行过程中删除table1中记录,但是无论用table1.delete删除
一条记录,还是用table1.emptytable,在dbgrid中始终显示没有删除该记录。本人想请教一下,如何才能彻底删除一条记录或清空一个表。
另外,本人在使用maskedit时,希望只允许输入数字和小数点,我将editmask设为"999999.99;;0",但是我在运行中将edittext设为"0.00",结果发现在maskedit中只能输入四位数,而且没有小数位。本人想请教一下应如何正确使用maskedit.多谢!
 
使用Table.Delete后如果没有在DBGrid中显示,可以试试Refresh,或者Close,Open.
如果想切底删除数据,可以使用以下方法。

//由RXLib 2.5 中的例子改动成为
procedure PackTable(Table: TTable);
{ This routine copied and modified from demo unit TableEnh.pas
from Borland Int. }
var
{ FCurProp holds information about the structure of the table }
FCurProp: CurProps;
{ Specific information about the table structure, indexes, etc. }
TblDesc: CRTblDesc;
{ Uses as a handle to the database }
hDb: hDbiDB;
{ Path to the currently opened table }
TablePath: array[0..dbiMaxPathLen] of Char;
Exclusive: Boolean;
begin
if not Table.Active then Raise Exception.Create('数据库没有打开!');
Check(DbiGetCursorProps(Table.Handle, FCurProp));
if StrComp(FCurProp.szTableType, szParadox) = 0 then begin
{ Call DbiDoRestructure procedure if PARADOX table }
hDb := nil;
{ Initialize the table descriptor }
FillChar(TblDesc, SizeOf(CRTblDesc), 0);
with TblDesc do begin
{ Place the table name in descriptor }
StrPCopy(szTblName, Table.TableName);
{ Place the table type in descriptor }
StrCopy(szTblType, FCurProp.szTableType);
bPack := True;
bProtected := FCurProp.bProtected;
end;
{ Get the current table's directory. This is why the table MUST be
opened until now }
Check(DbiGetDirectory(Table.DBHandle, False, TablePath));
{ Close the table }
Table.Close;
try
{ NOW: since the DbiDoRestructure call needs a valid DB handle BUT the
table cannot be opened, call DbiOpenDatabase to get a valid handle.
Setting TTable.Active = False does not give you a valid handle }
Check(DbiOpenDatabase(nil, szCFGDBSTANDARD, dbiReadWrite, dbiOpenExcl, nil,
0, nil, nil, hDb));
{ Set the table's directory to the old directory }
Check(DbiSetDirectory(hDb, TablePath));
{ Pack the PARADOX table }
Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False));
{ Close the temporary database handle }
Check(DbiCloseDatabase(hDb));
finally
{ Re-Open the table }
Table.Open;
end;
end
else if StrComp(FCurProp.szTableType, szDBase) = 0 then begin
{ Call DbiPackTable procedure if dBase table }
Exclusive := Table.Exclusive;
Table.Close;
try
Table.Exclusive := True;
Table.Open;
try
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, nil, True));
finally
Table.Close;
end;
finally
Table.Exclusive := Exclusive;
Table.Open;
end;
end
else raise EDatabaseError.Create('Table必需是dBASE或FoxPro类型');
end;
 
我试了一下:在paradox7下,每删除一条记录:table1.delete
在Dbgird中都显示删除了该记录.(在Delphi4下)
而且是彻底删除了.
对于:table1.emptytable也是一样.
如你出现你所说的那样:
请:table1.delete;
table1.post;
...
等试试.
第二个问题今天没时间试.
 
用dbipacktable, 看以前的问题答案.
 
2. maskedit定长的, 所以不能实现你的要求.
试试 setwindowlong(edit.handle, GWL_STYLE, getwindowlong(edit.handle, GWL_STYLE) or ES_NUMBER)
//只允许输入数字
 
你不能真正地写入数据库可能是你用了CacheUpdates,而并没有用ApplyUpdates,
所以数据可能还在内存,可以试一下这个Help提供的标准例程

procedure TForm1.ApplyButtonClick(Sender: TObject);
begin
with CustomerQuery do
begin
Database1.StartTransaction;
try
ApplyUpdates
{try to write the updates to the database};
Database1.Commit
{on success, commit the changes};
except
Database1.Rollback
{on failure, undo the changes};
raise
{raise the exception to prevent a call to CommitUpdates!}
end;
CommitUpdates
{on success, clear the cache}
end;
end;

至于DBGrid的刷新,DELPHI提供的例子里都是用先Close,再Open来解决的
 
chicken's answer maybe right,i think.
 
使用QUERY吧!
SQL:=delete from 表名 where 条件

对DBGrid要Close,再Open以刷新!
 
table.emptytable可以彻底清空一个表,包括dbase
 
我同意 pxlei 的说法。看看你的数据库是不是被设为只读了。不能更改。
 
时间太久,强制结束。 wjiachun
 
后退
顶部