使用AdoQuery怎么更新多个记录?

fangzhouyu 2003-09-12 11:03:36
如题
...全文
55 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
foxe 2003-09-12
  • 打赏
  • 举报
回复
不明白,写具体一点!你要这样的效果?
update tb_namelist set first_name = "X" where birthday = "2000-02-20"
fangzhouyu 2003-09-12
  • 打赏
  • 举报
回复
具体写一下,我试过,我没有成功,我用的sql语句
上海老李 2003-09-12
  • 打赏
  • 举报
回复
用SQL语句,UPDATE可以
用EDIT也行
fangzhouyu 2003-09-12
  • 打赏
  • 举报
回复
呵呵是有点错误,我原来就写错了
fieldname1=:id1,fieldname2=:id2 where fieldname3:=id3 ??
应该是
fieldname1=:id1,fieldname2=:id2 where fieldname3=:id3 ??
fangzhouyu 2003-09-12
  • 打赏
  • 举报
回复
不是我说的上面的错误,上面我有点写错了
不好意思,不过大家看一下,写的对不对,有没有更好的方法
dickeybird888 2003-09-12
  • 打赏
  • 举报
回复
Datamodule5.ADOQuery2.Close;
Datamodule5.ADOQuery2.SQL.Clear;
Datamodule5.ADOQuery2.SQL.Add('update tablename set fieldname1=:id1,fieldname2=:id2 where fieldname3:=id3');
Datamodule5.ADOQuery2.Parameters.ParamsByName('id1').Value:=Edit1.Text;
Datamodule5.ADOQuery2.Parameters.ParamsByName('id2').ValueQdrq2(定义的变量);
Datamodule5.ADOQuery2.Parameters.ParamsByName('id3').ValueEdit2.Text;
Datamodule5.ADOQuery2.Open;
bw110323 2003-09-12
  • 打赏
  • 举报
回复
fieldname1=:id1,fieldname2=:id2 where fieldname3:=id3 ??
好象有笔误吧
fangzhouyu 2003-09-12
  • 打赏
  • 举报
回复
Datamodule5.ADOQuery2.Close;
Datamodule5.ADOQuery2.SQL.Clear;
Datamodule5.ADOQuery2.SQL.Add('update tablename set fieldname1=:id1,fieldname2=:id2 where fieldname3:=id3');
Datamodule5.ADOQuery2.Parameters.ParamValues['id1']:=Edit1.Text;
Datamodule5.ADOQuery2.Parameters.ParamValues['id2']:=Qdrq2(定义的变量);
Datamodule5.ADOQuery2.Parameters.ParamValues['id3']:=Edit2.Text;
Datamodule5.ADOQuery2.Open;
可是报错,说是找不到id2,如果我去掉id2,就说是找不到id3
这是我从网上下载的,我感觉很不错 FAQ: 这个东东都提供什么功能? 答:提供最简单方便高效的方式,通过ADO对象实现远程数据库 这个东东为什么不封装成控件? 答:本类以单元形式封装,只要加到搜索路径后直接引用即可,无需经过安装等麻烦的步骤。 这个东东适合应用在什么场合? 答:适合应用于小型分布式程序。 这个东东掌握起来有难度吗? 答:没有任何难度,就和你开发本地数据程序一样简单。 这个东东可以应用在我已有的程序里吗? 答:由于我使用的是AdoQuery作为数据集载体,所以无需更改为其他控件,现有的本地数据库程序也可以非常容易的改造为支持分布式数据库。 这个东东稳定吗? 答:经自己长期做小白鼠广泛的实际应用实践,发现方便,稳定。 服务端的端口号是多少? 答:服务端的端口号可以随意设置,只要不和其他程序冲突就可以,并且客户端连接服务端时必须端口一致. 如果服务端重启了客户端需要重启吗? 答:不用,客户端只要连接上服务端以后就有自动断线重连的功能。 我在使用时要注意什么? 答:如果你要用ADOQuery对象的Insert,Post方法新增数据时,我会占用这个对象的BeforePost和BeforeDelete事件。 这个东东免费吗? 答:完全免费,并且开放所有源代码,你可以随意改进,传播它,当然如果更好用了,记得给我也发一份 :)(要保留偶的版权和注释信息哦) 这个东东使用到了那些控件? 答:delphi的ADO控件,INDY,以及第3方Dxsock(服务端用)。 同时发布的还有我自己积累的几个常用单元,有日志,调试,tcp的通用服务和客户端模块等,同样都是十分有用的东东。 这个东东有demo程序吗? 答:有最简单的示范程序,但时间关系只写了最简单的演示代码,还有很多值得你去挖掘的实用接口和单元。 我有了改进版本,怎么联系这个东东的作者? 答:QQ 22900104 ,Email 22900104@qq.com 马敏钊 发布这个东东的目的是什么? 答:好用的东东大家分享,共同学习,共同进步,希望大家都能发扬开源精神。 构架说明: 大概是这样的,偶有一个服务器对象,负责提供数据库服务,在需要提供数据服务的程序里创建它即可。 使用起来十分简单 首先引用服务端单元 uses UntRmodbSvr; //创建远程服务对象 (参数1 服务端口号 日志对象,如果不需要记录日志请填nil) Gob_RmoDBsvr := TRmodbSvr.Create(FSvrPort, nil); //连接数据库 可以是ADO支持的所有数据库 调用TDBMrg提供的获取各种数据库的链接字符串即可,这里连接Access数据库 Gob_RmoDBsvr.ConnToDb(TDBMrg.GetAccessConnStr('cfg.mdb')); 到此为止,2行代码使你的这个程序具有了将数据库发布出去的能力,其它机器的程序可以方便的通过它访问到数据库,像使用本地数据库一样。 客户端只需连接服务端即可,不管服务端是什么样的数据库,无需安装任何数据库驱动。 uses UntRemSql; //创建客户端对象 RmoClient := TRmoHelper.Create(); //连接服务端 填入服务端地址和端口(与服务端端口一致即可) Result := RmoClient.ReConnSvr(ISvrIP, Iport); 2行代码使你的客户端程序具有了方便的访问到远端的数据库,像使用本地数据库一样,并且你原有的单机数据库程序可以很方便改为远程数据库。 具体使用方法可以查看DEMO程序
******************************* 华软源码:http://www.hur.cn 欢迎转载,但请保留出处,谢谢 ******************************* 很久没有发布东东了,今天看到盒子上有朋友发布了个三层的东东, 下来大概看了看,貌似使用起来不太方便,曾经用过ASTA和RmoObject,都不是那么让人满意,BUG多,并且庞大需要安装,使用十分不方便。 为了继续支持我喜欢的DELPHI和可爱的盒子, 特发布个自己写的远程数据库对象希望能给大家平常的工作带来便利和高效(偶自己和同事们都用了挺长时间,十分稳定易用)。 用DELPHI的朋友少不了要和数据库打交道,一般小程序都使用ACCESS做数据库感觉十分方便,不用装服务端,客户端不用单独装驱动, 发布程序时直接目录一拷贝就完事,但缺点是不方便从其它计算机对它进行访问, 有了偶这个东东,就可以很方便容易的实现咯。 ps : 就是连接Oracle和mysql,客户端也可以不用装驱动哦 使用步骤 解压后找个地方存放 将GobUnit目录添加到delphi的搜索路径 将DXSockEnt30(我改过bug的版本)的3个子目录也添加到delphi的搜索路径 即可使用和编译所有偶提供的代码 FAQ: 这个东东都提供什么功能? 答:提供最简单方便高效的方式,通过ADO对象实现远程数据库 这个东东为什么不封装成控件? 答:本类以单元形式封装,只要加到搜索路径后直接引用即可,无需经过安装等麻烦的步骤。 这个东东适合应用在什么场合? 答:适合应用于小型分布式程序。 这个东东掌握起来有难度吗? 答:没有任何难度,就和你开发本地数据程序一样简单。 这个东东可以应用在我已有的程序里吗? 答:由于我使用的是AdoQuery作为数据集载体,所以无需更改为其他控件,现有的本地数据库程序也可以非常容易的改造为支持分布式数据库。 这个东东稳定吗? 答:经自己长期做小白鼠广泛的实际应用实践,发现方便,稳定。 服务端的端口号是多少? 答:服务端的端口号可以随意设置,只要不和其他程序冲突就可以,并且客户端连接服务端时必须端口一致. 如果服务端重启了客户端需要重启吗? 答:不用,客户端只要连接上服务端以后就有自动断线重连的功能。 我在使用时要注意什么? 答:如果你要用ADOQuery对象的Insert,Post方法新增数据时,我会占用这个对象的BeforePost和BeforeDelete事件。 这个东东免费吗? 答:完全免费,并且开放所有源代码,你可以随意改进,传播它,当然如果更好用了,记得给我也发一份 :)(要保留偶的版权和注释信息哦) 这个东东使用到了那些控件? 答:delphi的ADO控件,INDY,以及第3方Dxsock(服务端用)。 同时发布的还有我自己积累的几个常用单元,有日志,调试,tcp的通用服务和客户端模块等,同样都是十分有用的东东。 这个东东有demo程序吗? 答:有最简单的示范程序,但时间关系只写了最简单的演示代码,还有很多值得你去挖掘的实用接口和单元。 我有了改进版本,怎么联系这个东东的作者? 答:QQ 22900104 ,Email 22900104@qq.com 马敏钊 发布这个东东的目的是什么? 答:好用的东东大家分享,共同学习,共同进步,希望大家都能发扬开源精神。 构架说明: 大概是这样的,偶有一个服务器对象,负责提供数据库服务,在需要提供数据服务的程序里创建它即可。 使用起来十分简单 首先引用服务端单元 uses UntRmodbSvr; //创建远程服务对象 (参数1 服务端口号 日志对象,如果不需要记录日志请填nil) Gob_RmoDBsvr := TRmodbSvr.Create(FSvrPort, nil); //连接数据库 可以是ADO支持的所有数据库 调用TDBMrg提供的获取各种数据库的链接字符串即可,这里连接Access数据库 Gob_RmoDBsvr.ConnToDb(TDBMrg.GetAccessConnStr('cfg.mdb')); 到此为止,2行代码使你的这个程序具有了将数据库发布出去的能力,其它机器的程序可以方便的通过它访问到数据库,像使用本地数据库一样。 客户端只需连接服务端即可,不管服务端是什么样的数据库,无需安装任何数据库驱动。 uses UntRemSql; //创建客户端对象 RmoClient := TRmoHelper.Create(); //连接服务端 填入服务端地址和端口(与服务端端口一致即可) Result := RmoClient.ReConnSvr(ISvrIP, Iport); 2行代码使你的客户端程序具有了方便的访问到远端的数据库,像使用本地数据库一样,并且你原有的单机数据库程序可以很方便改为远程数据库。 具体使用方法可以查看DEMO程序
很久没有发布东东了,今天看到盒子上有朋友发布了个三层的东东, 下来大概看了看,貌似使用起来不太方便,曾经用过ASTA和RmoObject,都不是那么让人满意,BUG多,并且庞大需要安装,使用十分不方便。 为了继续支持我喜欢的DELPHI和可爱的盒子, 特发布个自己写的远程数据库对象希望能给大家平常的工作带来便利和高效(偶自己和同事们都用了挺长时间,十分稳定易用)。 用DELPHI的朋友少不了要和数据库打交道,一般小程序都使用ACCESS做数据库感觉十分方便,不用装服务端,客户端不用单独装驱动, 发布程序时直接目录一拷贝就完事,但缺点是不方便从其它计算机对它进行访问, 有了偶这个东东,就可以很方便容易的实现咯。 ps : 就是连接Oracle和mysql,客户端也可以不用装驱动哦 使用步骤 解压后找个地方存放 将GobUnit目录添加到delphi的搜索路径 将DXSockEnt30(我改过bug的版本)的3个子目录也添加到delphi的搜索路径 即可使用和编译所有偶提供的代码 FAQ: 这个东东都提供什么功能? 答:提供最简单方便高效的方式,通过ADO对象实现远程数据库 这个东东为什么不封装成控件? 答:本类以单元形式封装,只要加到搜索路径后直接引用即可,无需经过安装等麻烦的步骤。 这个东东适合应用在什么场合? 答:适合应用于小型分布式程序。 这个东东掌握起来有难度吗? 答:没有任何难度,就和你开发本地数据程序一样简单。 这个东东可以应用在我已有的程序里吗? 答:由于我使用的是AdoQuery作为数据集载体,所以无需更改为其他控件,现有的本地数据库程序也可以非常容易的改造为支持分布式数据库。 这个东东稳定吗? 答:经自己长期做小白鼠广泛的实际应用实践,发现方便,稳定。 服务端的端口号是多少? 答:服务端的端口号可以随意设置,只要不和其他程序冲突就可以,并且客户端连接服务端时必须端口一致. 如果服务端重启了客户端需要重启吗? 答:不用,客户端只要连接上服务端以后就有自动断线重连的功能。 这个东东免费吗? 答:完全免费,并且开放所有源代码,你可以随意改进,传播它,当然如果更好用了,记得给我也发一份 :)(要保留偶的版权和注释信息哦) 这个东东使用到了那些控件? 答:delphi的ADO控件,INDY,以及第3方Dxsock(服务端用)。 同时发布的还有我自己积累的几个常用单元,有日志,调试,tcp的通用服务和客户端模块等,同样都是十分有用的东东。 这个东东有demo程序吗? 答:有最简单的示范程序,但时间关系只写了最简单的演示代码,还有很多值得你去挖掘的实用接口和单元。 我有了改进版本,怎么联系这个东东的作者? 答:QQ 22900104 ,Email 22900104@qq.com 马敏钊 发布这个东东的目的是什么? 答:好用的东东大家分享,共同学习,共同进步,希望大家都能发扬开源精神。 构架说明: 大概是这样的,偶有一个服务器对象,负责提供数据库服务,在需要提供数据服务的程序里创建它即可。 使用起来十分简单 首先引用服务端单元 uses UntRmodbSvr; //创建远程服务对象 (参数1 服务端口号 日志对象,如果不需要记录日志请填nil) Gob_RmoDBsvr := TRmodbSvr.Create(FSvrPort, nil); //连接数据库 可以是ADO支持的所有数据库 调用TDBMrg提供的获取各种数据库的链接字符串即可,这里连接Access数据库 Gob_RmoDBsvr.ConnToDb(TDBMrg.GetAccessConnStr('cfg.mdb')); 到此为止,2行代码使你的这个程序具有了将数据库发布出去的能力,其它机器的程序可以方便的通过它访问到数据库,像使用本地数据库一样。 客户端只需连接服务端即可,不管服务端是什么样的数据库,无需安装任何数据库驱动。 uses UntRemSql; //创建客户端对象 RmoClient := TRmoHelper.Create(); //连接服务端 填入服务端地址和端口(与服务端端口一致即可) Result := RmoClient.ReConnSvr(ISvrIP, Iport); 2行代码使你的客户端程序具有了方便的访问到远端的数据库,像使用本地数据库一样,并且你原有的单机数据库程序可以很方便改为远程数据库。 具体使用方法可以查看DEMO程序 为了方便交流建了个QQ群,欢迎大家参与 15637473
几天前在盒子看到绿色Sql server很高兴,现将本人对绿色SQL Server的现实思路作一说明,不正确的地方还请指教。1. Sqlservr.exe 运行参数。 Sql Server的启动可以为Windows服务方式(默认),也可以以应用程序方式启动。下面介绍sqlservr.exe以应用程序方式启动时的参数问题。sqlservr 应用程序用法:sqlservr [-sinstance_name] [-c] [-dmaster_path] [-f] [-eerror_log_path] [-lmaster_log_path] [-m] [-n] [-Ttrace#] [-v] [-x] [-g number] [-O] [-y number]-sinstance_name 指定要连接到的 SQL Server 实例。如果未指定命名实例,sqlservr 将启动 SQL Server 默认实例。重要 启动 SQL Server 实例时,必须从实例所在的适当目录使用 sqlservr 应用程序。对于默认实例,从 MSSQLBinn 目录运行 sqlservr。对于命名实例,在 MSSQL$instance_nameBinn 目录运行 sqlservr。-c 表示以独立于 Windows NT 服务控制管理器的方式启动 SQL Server 实例。当从命令提示符下启动 SQLServer 时,可使用该选项缩短启动 SQL Server 的时间。(注意:当使用该选项时,无法通过使用 SQLServer 服务管理器或 net stop 命令停止 SQL Server,而且如果已从 Microsoft Windows NT? 系统注销,则 SQL Server 将停止运行。)-dmaster_path指出 master 数据库文件的完全合法路径。在 -d 和 master_path 之间没有空格。-f以最小配置模式启动服务器。然后,系统管理员可对配置选项重新配置(使用 sp_configure 系统存储过程)。-eerror_log_path表示错误日志文件的完全合法路径。如果未指定路径,则默认实例的默认位置是 x:Program FilesMicrosoft SQL ServerMSSQLLogErrorlog,命名实例的默认位置是 x:Program FilesMicrosoft SQL ServerMSSQL$instance_nameLogErrorlog。在 -e 和 error_log_path 之间没有空格。-lmaster_log_path指示 master 数据库事务日志文件的完全合法路径。在 -l 和 master_log_path 之间没有空格。-m表示在单用户模式下启动 SQL Server 实例。如果 SQL Server 是以单用户模式启动的,则只能连接一个用户。CHECKPOINT 机制(它确保完成的事务定期从磁盘高速缓存写入数据库设备中)将不启动。(一般情况下,如果您遇到需要修复的系统数据库问题时,可使用此选项。)-n表示您不想使用 Windows NT 应用程序日志来记录 SQL Server 事件。如果用 -n 选项启动 SQL Server 实例,则最好也使用 -e 选项,否则将不会记录 SQL Server 事件。-Ttrace#表示应使用指定的有效跟踪标记 (trace#) 来启动 SQL Server 实例。跟踪标志用来启动具有非标准行为的服务器。有关可用跟踪标记 (trace#) 的更多信息,请参见跟踪标记。重要 当指定跟踪标志时,请使用 –T 来传递跟踪标志号。SQL Server 接受小写字母 t (-t);然而,-t 还设置 SQL Server 支持工程师所需的其它内部跟踪标记。-v显示服务器的版本号。-x禁用维护 CPU 统计。-g memory_to_reserve指定内存的兆字节整数,该内存被保留下来用于 SQL Server 2000 内部(进程内)运行的其它应用程序。-O指定不需要分布式 COM (DCOM),从而禁用异类查询。-y error_number如果 SQL Server 2000 遇到在该选项中指定的错误信息,它将把表象堆栈跟踪写入错误日志。可以使用多个 –y 参数指定多个错误。2. 系统数据库路径问题. 一般情况下,正常安装sql server之后,master等系统数据库的路径都是被设置为绝对路径,如果要改正数据库的路径为相对路径,可以使用以下SQl语句: sql:=format(' update sysaltfiles set filename='%s' where filename='%s' ', ['...data'+extractfilename(MDFFile),MDFFile]); ADOQuery1.Close; ADOQuery1.SQL.Text:=sql; ADOQuery1.ExecSQL; sql:=format(' update sysaltfiles set filename='%s' where filename='%s' ', ['...data'+extractfilename(LogFile),LogFile]); ADOQuery1.Close; ADOQuery1.SQL.Text:=sql; ADOQuery1.ExecSQL; sql:=Format('update sysdatabases set filename='%s' where name='%s'', ['...data'+extractfilename(MDFFile),Edit1.text]); ADOQuery1.Close; ADOQuery1.SQL.Text:=sql; ADOQuery1.ExecSQL;大家打开sysaltfiles 表和sysdatabases 一看就知道了,不多说了。除了系统数据库,其它的数据库也可以使用这种方法修改为相对路径。 使用相对路径的好处是可以让你的绿色Sql server随时copy到任意目录或是任意其它机器上启动,并且原来的数据库全部可以使用,如果是绝对路径到了其它机器就不行了。3. 注册表问题: 大家可以看下面的注册表文件Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$name][HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServer]"AuditLevel"=dword:00000000"DefaultLogin"="guest""ListenOn"=hex(7):53,00,53,00,4d,00,53,00,53,00,48,00,37,00,30,00,00,00,53,00, 53,00,4e,00,45,00,54,00,4c,00,49,00,42,00,00,00,00,00"LoginMode"=dword:00000000"Map_"="""Map#"="-""Map$"="""SetHostName"=dword:00000000"Tapeloadwaittime"=dword:ffffffff"uptime_pid"=dword:00001044"uptime_time_utc"=hex:26,57,c8,b3,fb,bb,c5,01[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerCurrentVersion]"CurrentVersion"="8.00.194""RegisteredOwner"="""SerialNumber"="""CSDVersionNumber"=dword:00000300"CSDVersion"="8.00.761""Language"=dword:00000804"checksum"=hex:37,35,32,32,63,31,35,38,61,65,37,64,34,63,64,37,35,30,64,61,30, 33,34,62,37,64,63,32,30,61,36,36,39,37,62,34,61,35,65,36,63,66,62,61,38,37, 39,36,37,31,66,33,39,61,36,65,35,64,30,33,37,36,37,65,64,36,33,30,61,39,63, 36,66,37,36,30,35,65,32,66,34,66,31,33,63,39,33,63,34,66,62,66,34,66,64,38, 64,65,36,64,35,34,37,33,35,39,35,32,36,63,61,32,36,63,33,32,64,34,36,33,65, 36,39,34,30,65,61,37,64,35,30,61,66,34,64,32,66,38,37,36,30,61,39,64,30,61, 32,36,64,65,66,66,00[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerParameters][HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerSuperSocketNetLib]"ProtocolList"=hex(7):74,00,63,00,70,00,00,00,6e,00,70,00,00,00,00,00[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerSuperSocketNetLibNp]"PipeName"="\.pipeMSSQL$$namesqlquery"[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerSuperSocketNetLibTcp]"TcpHideFlag"=dword:00000000"TcpDynamicPorts"="$port""TcpPort"="$port"[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameSetup]"FeatureName"="SqlRun""FirstStart"=dword:00000000"ProductCode"="{E09B48B5-E141-427A-AB0C-D3605127224A}""SQLDataRoot"="$path""SQLPath"="$path"这是注册一个Sql Server实例所要使用的注册表,把里面的$name,$path,$port替换成你定义的实例名,当前程序所有路径,监听端口,然后导入注册表就可以了。4. 启动Sql Server iPath:=ExtractFilePath(Application.ExeName); CommandLine:=PChar(iPath+'binnsqlservr.exe -d...datamaster.mdf -l...datamastlog.ldf -e...Loglog.txt+Edit1.Text); CreateProcess( nil, CommandLine, nil, nil, true, CREATE_NO_WINDOW, nil, PChar(iPath+'binn'), StartupInfo, ProcessInformation )也可以直接写个.bat运行就ok了.5. 启动日志问题。 这个问题最简单,因为在执行sqlservr.exe时指定的有log文件,你只用用个定时器(50ms)读文件,就可以在程序中显示出来启动日志了,呵呵,这只是个思想,具体的自已想办法吧. 6. 停止服务 用CreateProcess可以得到进程ID,TerminateProcess就关了sql server进程,服务就停了,简单吧。根据上面的6个步骤,你就可以自已搞定一个绿色的Sql Server了.并且你可以根据不同的sql server版本,整理出所有版本的绿色sql server。绿色 sql server 企业版绿色 sql server 个人版绿色 MSDE... ...这样以后遇到什么操作系统都全部搞定。 最后说一句,只要你能把几个Sql server版本的数据整理好(主要是系统数据库的路径问题(好像现在盒子已经有绿色企业版的文件了),DLL全部copy就OK了),都可以使用我的管理工具进行管理,呵呵,当然你也可以作出自已的管理器。我的管理器,主要是为了我自已用,大家如果用着可以,请多提意见。由于sql server数据太大,并且盒子上已经有了,这次只上传了exe和目录结构。不知道说的是否正确,如果还有什么问题,我们一起交流. Email: 11826088@163.com
Delphi ListView基本用法大全(转)默认分类 2009-09-29 09:27:56 阅读138 评论0 字号:大中小 订阅 Delphi高级编程 Delphi文章 WEB开发 Delphi控件 Delphi ListView基本用法大全 作者:seeker 日期:2009-04-19 //增加项或列(字段) ListView1.Clear; ListView1.Columns.Clear; ListView1.Columns.Add; ListView1.Columns.Add; ListView1.Columns.Add; ListView1.Columns.Items[0].Caption:='id'; ListView1.Columns.Items[1].Caption:='type'; ListView1.Columns.Items[2].Caption:='title'; ListView1.Columns.Items[2].Width:=300; Listview1.ViewStyle:=vsreport; Listview1.GridLines:=true; //注:此处代码也可以直接在可视化编辑器中完成, 也可写成以下这样 begin with listview1 do begin Columns.Add; Columns.Add; Columns.Add; ViewStyle:=vsreport; GridLines:=true; columns.items[0].caption:='进程名'; columns.items[1].caption:='进程ID'; columns.items[2].caption:='进程文件路径'; Columns.Items[0].Width:=100; Columns.Items[1].Width:=100; Columns.Items[2].Width:=150; end end; //增加记录 with listview1.items.add do begin caption:='1212'; subitems.add('hh1'); subitems.add('hh2'); end; //删除 listview1.items.delete(0); //从数据库表里读取数据写入Listview var Titem:Tlistitem; //此处一定要预定义临时记录存储变量. begin ListView1.Items.Clear; with adoquery1 do begin close; sql.Clear; sql.Add('select spmc,jg,sl from kcxs'); Open; ListView1.Items.Clear; while not eof do begin Titem:=ListView1.Items.add; Titem.Caption:=FieldByName('spmc').Value; Titem.SubItems.Add(FieldByName('sl').Value); Titem.SubItems.Add(FieldByName('jg').Value); next; end; //删除 ListView1.DeleteSelected; //如何取得ListView中选中行的某一列的值 procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage(ListView1.Selected.SubItems.Strings[1]); //返回选中行第三列中的值 end; showMessage(listView1.Selected.Caption); //返回选中行第一列的值. 第1列的值: -->>> ListView1.Selected.Caption 第i列的值(i>1):-->>> ListView1.Selected.SubItems.Strings[i] ListView1.Items.Item[1].SubItems.GetText); //取得listview某行某列的值 Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列 返回选中行所有子列值.是以回车符分开的,你还要从中剥离出来你要的子列的值。 showMessage(ListView1.Selected.SubItems.GetText); ListView 简单排序的实现 ListView 排序 怎样实现单击一下按升序,再单击一下按降序。 function CustomSortProc(Item1, Item2: TListItem; ColumnIndex: integer): integer; stdcall; begin if ColumnIndex = 0 then Result := CompareText(Item1.Caption,Item2.Caption) else Result := CompareText(Item1.SubItems[ColumnIndex-1],Item2.SubItems[ColumnIndex-1]) end; procedure TFrmSrvrMain.ListView1ColumnClick(Sender: TObject; Column: TListColumn); begin ListView1.CustomSort(@CustomSortProc,Column.Index); end; =============================================================== //增加 i := ListView1.Items.Count; with ListView1 do begin ListItem:=Items.Add; ListItem.Caption:= IntToStr(i); ListItem.SubItems.Add('第 '+IntToStr(i)+' 行'); ListItem.SubItems.Add('第三列内容'); end; //按标题删除 for i:=ListView1.Items.Count-1 downto 0 Do if ListView1.Items[i].Caption = Edit1.Text then begin ListView1.Items.Item[i].Delete(); //删除当前选中行 end; //选中一行 if ListView1.Selected <> nil then Edit1.Text := ListView1.Selected.Caption; // listview1.Items[Listview1.Items.Count -1].Selected := True; // listview1.Items[Listview1.Items.Count -1].MakeVisible(True); procedure TForm1.Button2Click(Sender: TObject); // 选择第一条 begin listview1.SetFocus; listview1.Items[0].Selected := True; end; procedure TForm1.Button1Click(Sender: TObject); // 选择最后一条 begin listview1.SetFocus; listview1.Items[Listview1.Items.Count -1].Selected := True; end; //这是个通用的过程 procedure ListViewItemMoveUpDown(lv : TListView; Item : TListItem; MoveUp, SetFocus : Boolean); var DestItem : TListItem; begin if (Item = nil) or ((Item.Index - 1 < 0) and MoveUp) or ((Item.Index + 1 >= lv.Items.Count) and (not MoveUp)) then Exit; lv.Items.BeginUpdate; try if MoveUp then DestItem := lv.Items.Insert(Item.Index - 1) else DestItem := lv.Items.Insert(Item.Index + 2); DestItem.Assign(Item); lv.Selected := DestItem; Item.Free; finally lv.Items.EndUpdate; end; if SetFocus then lv.SetFocus; DestItem.MakeVisible(False); end; //此为调用过程,可以任意指定要移动的Item,下面是当前(Selected)Item ListViewItemMoveUpDown(ListView1, ListView1.Selected, True, True);//上移 ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移 TListView组件使用方法 引用CommCtrl单元 procedure TForm1.Button1Click(Sender: TObject); begin ListView_DeleteColumn(MyListView.Handle, i);//i是要删除的列的序号,从0开始 end; 用LISTVIEW显示表中的信息: procedure viewchange(listv:tlistview;table:tcustomadodataset;var i:integer); begin tlistview(listv).Items.BeginUpdate; {listv:listview名} try tlistview(listv).Items.Clear; with table do {table or query名} begin active:=true; first; while not eof do begin listitem:=tlistview(listv).Items.add; listitem.Caption:=trim(table.fields[i].asstring); // listitem.ImageIndex:=8; next; end; end; finally tlistview(listv).Items.EndUpdate; end; end; ListView使用中的一些要点。以下以一个两列的ListView为例。 →增加一行: with ListView1 do begin ListItem:=Items.Add; ListItem.Caption:='第一列内容'; ListItem.SubItems.Add('第二列内容'); end; →清空ListView1: ListView1.Items.Clear; →得到当前被选中行的行的行号以及删除当前行: For i:=0 to ListView1.Items.Count-1 Do If ListView1.Items[i].Selected then //i=ListView1.Selected.index begin ListView1.Items.Delete(i); //删除当前选中行 end; 当然,ListView有OnSelectItem事件,可以判断选择了哪行,用个全局变量把它赋值出来。 →读某行某列的操作: Edit1.Text := listview1.Items[i].Caption; //读第i行第1列 Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列 Edit3.Text := listview1.Items[i].SubItems.strings[1]; //读第i行第3列 以次类推,可以用循环读出整列。 →将焦点上移一行: For i:=0 to ListView1.Items.Count-1 Do If (ListView1.Items[i].Selected) and (i>0) then begin ListView1.SetFocus; ListView1.Items.Item[i-1].Selected := True; end; 不过在Delphi6中,ListView多了一个ItemIndex属性,所以只要 ListView1.SetFocus; ListView1.ItemIndex:=3; 就能设定焦点了。 Delphi的listview能实现交替颜色么? procedure TForm1.ListView1CustomDrawItem( Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); var i: integer; begin i:= (Sender as TListView).Items.IndexOf(Item); if odd(i) then sender.Canvas.Brush.Color:= $02E0F0D7 else sender.Canvas.Brush.Color:= $02F0EED7; Sender.Canvas.FillRect(Item.DisplayRect(drIcon)); end; 要想随时更改ListView 中某一行的字体颜色,要在ListView的 OnCustomDrawItem 的事件中书写相关的代码。例如 我想更改选中的某行字体的颜色,则需要在事件中写入下的代码: if item.Index = strtoint(edit1.Text) then //该条件是用于判断是否符合更改字体颜色的行的条件。 Sender.Canvas.Font.Color := clred;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧