再加100分,共150分!能解决问题的,150分都给!(100分)

  • 主题发起人 主题发起人 caowei
  • 开始时间 开始时间
C

caowei

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ACCESS 97数据库(MDB),使用DBGrid进行显示,
怎么才能知道当前的记录号呢?
 
用 BDE 函数 function DbiGetCursorProps (hCursor: hDBICur;
var curProps: CURProps): DBIResult stdcall; 可以获得 dbase 和 paradox
表的记录号, 但是不支持 Access 和 SQL 表. (根据 BDE32.hlp)

访问 Access 可以不用 BDE, 而直接用 ODBC (用著名的 <a href=/delphi/attachments/modbc.zip>mODBC 控件</a>),
对 mODBC 作一点修改, 就能读出记录数和记录号.

摆脱了 BDE 不是挺好的吗?
 
不要笑我(我是半路出家学delphi的,现在数据库一类的东东还不是很熟)
但平时我是这样做的:
Access里面有"自动递增"字段类型,先设一个id为此种类型,然后:

RoomID := DM.LeftGridTable.fieldbyname( 'ID' ).asinteger;
 
茶叶蛋, 您这可是误导了,"自动递增"字段类型中数字只增不减,记录删除,数字退不回去的。
看本论坛每个贴子的 ID, 已经>100,000, 实际记录数大致才15,000。
 
茶蛋:如果改进你的方法,专门做个ID列(非自增)也不错*_^
yysun:mODBC好象对ODBC 3.51支持不好,每次执行都出错(好象可以继续访问)
我没时间改(ODBC也不熟),不知何故.ODBC 3.51包含在VISUALSTUDIO 98中文版中
 
to yysun: 对不起,我还真没想到!

to CJ: 事实上,我的每一个数据库中都有这么一个字段.
( 主要是这一阵都是用的Access,随手就加上了)
 
你在调用Access中的数据时可以使用TTable,在其中创建一个计算字段,
这样,你可以在TTable中的计算事件中进行计数。
 
modbc似乎的确有些问题,反正我在编译的时候没事,
一运行就出错。
为什么TTable没有直接的方法呢?我一直以为是我不知道,
原来是真的没有啊。
我再看看是否有其他方法,等一下给大家分!
 
用计算字段是可以的。
茶叶蛋先生的方法纯属误导。
 
caowei: 你用计算字段的方法试过吗? 有问题可以问我!
 
下面是我写的得到CPU占用率的动态链接库, 用的是系统注册表的方法,
要得到网络数据是一样的, 你可以读一下HKEY_DYN_DATA中相应的键值.

library Cpuusg;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Windows,
Registry,
Classes;

function _Cpu: integer;
var
Reg: TRegistry;
usage: integer;
begin
Reg := TRegistry.Create;
Reg.RootKey:= HKEY_DYN_DATA;
Reg.OpenKey('PerfStats/StatData', false);
Reg.ReadBinaryData('KERNEL/CPUUsage', usage, sizeof(usage));
Reg.CloseKey;
Reg.Free;
Result := usage;
end;

procedure _BeginMonite;
var
Reg: TRegistry;
usage: integer;
begin
Reg := TRegistry.Create;
Reg.RootKey:= HKEY_DYN_DATA;
Reg.OpenKey('PerfStats/StartStat', false);
Reg.ReadBinaryData('KERNEL/CPUUsage', usage, sizeof(usage));
Reg.CloseKey;
Reg.Free;
end;

procedure _EndMonite;
var
Reg: TRegistry;
usage: integer;
begin
Reg := TRegistry.Create;
Reg.RootKey:= HKEY_DYN_DATA;
Reg.OpenKey('PerfStats/StopStat', false);
Reg.ReadBinaryData('KERNEL/CPUUsage', usage, sizeof(usage));
Reg.CloseKey;
Reg.Free;
end;

exports
_Cpu index 1,
_BeginMonite index 2,
_EndMonite index 3;

begin
end.
 
对不起, 贴错地方了! 嘻嘻.
 
用计算字段怎么做呢?
 
用计算字段可以这样:

在设计阶段你可以在TTable中增加一个计算字段: fldRecCount,
(双击TTable, 打开Fields定义窗口, 用鼠标右键选择newField.)
属性设成Calculated, 在TTable(比如Table1)的OnCalcFields
事件中写下下面的代码:

begin
Table1.FieldByName('fldRecCount').AsInteger := m_iRecNo;
m_iRecNo := m_iRecNo + 1;
end;

其中, m_iRecNo是需要在计数前设置成1, 比如在FormOnCreate中.

以后, 你随时可以用Table1.FieldByName('fldRecCount').AsInteger
得到当前记录号(第几个记录). OK?
 
多人接受答案了。
 
Jimchael Tsee 的用计算字段的解法,<font color=red>不对</font> !!! (caowei 居然加分了!)
你们把表多在Grid中滚动几遍(记录数多一些) ,
(因每次记录滚动都会重新计算calculateFiled .)
Jimchael Tsee的用法只可以将单向一次操作 , 即将表一次从
开始到结束过一次.
 
后退
顶部