问题标签 [tdbgrid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 如何将 TDBGrid 记录视图恢复到刷新前的状态?
可能重复:
返回上一个位置时如何避免 TDbgrid 滚动
我正在寻找一种TDBGrid
在刷新发生后保存和恢复 Delphi 垂直滚动位置的方法。目前,网格会自行重置,以便所选记录出现在记录列表的中间。
起初,属性LeftCol
和TopRow
似乎是解决方案,但只能LeftCol
工作。该TopRow
值始终为 1,并且永远不会更改。它似乎是网格内部记录缓冲区中的一个位置,该位置设置为网格中显示的行数。也就是说,FBuffers 似乎上下滑动,但TopRow
始终保持为 1。
我所看到的一个详细示例是:
- 网格显示 a 的 11 条记录
TClientDataSet
,从记录 5 开始,依次显示到记录 15。 - 选定的记录光标位于记录 15(视图中的最后一条记录)上。
- 数据集通过
TDataSetProvider
链接到TADODataSet
. (一个 .Open 或 .Refresh 调用)。 - dataset.Locate 方法用于在面对插入/删除时保留实际选择的记录。
- 网格发生变化,因此记录 15 位于中心,并显示记录 10 到 20。
是否有任何可以保存/恢复/执行的内容,以便网格可以恢复到其原始查看配置,显示记录 5-15,光标位于同一选定记录上,无论它出现在哪里?
在我的许多搜索尝试中,我能找到的最接近的问题是在 Delphi 3.0 中使用 TopRow、LeftCol 解决的问题,此处: http: //www.delphigroups.info/2/79/314206.html
通过 DBGrids.pas 探索也没有让我找到一种相对于底层数据集记录定位缓冲区指针的方法。
delphi - 如何获取 DBGrid 单元格的屏幕坐标
我想在当前行的特定单元格的右下角显示弹出按钮或花哨的消息(带有彩色背景等)。
现在我只知道如何获取网格坐标:
x = DBGrid.DataSource.DataSet.RecNo
y = DBGrid.Columns[index]
还有 TCustomGrid.CellRect,它会做我想做的事,但它是受保护的,我不想继承和创建另一个组件类。
我能想到的一种疯狂的解决方法是将 onDrawColumnCell 事件中的 TRect-s 保存到某个数组中。
所以你怎么看 ?
编辑
如何获取当前行中第二个单元格的屏幕坐标?
c++builder - 使用 VCL 组件在网格中显示非常大的数据集
我的 C++ CAD 应用程序维护用户建模操作的日志,以便可以取消应用和重新应用它们。任何特定项目可能只包含几个操作,也可能包含数十万个操作。我已经有了自己的数据结构,可以以一种内存效率高的方式管理这些数据,而且效果很好。但现在我添加了一个功能,允许用户在网格中检查他的操作日志。(我使用的是 Embarcadero RAD Studio 2010;所有 GUI 都使用 VCL。)
目前,我正在使用 TDBGrid 组件向用户显示行中的操作数据。这是我连接组件的方式:
TDBGrid.DataSource = 一个 TDataSource
TDataSource.DataSet = 一个 TClientDataSet
TClientDataSet.ProviderName = 一个 TDataSetProvider
TDataSetProvider.DataSet = 一个 ProjectDataSet
ProjectDataSet 是我从 TDataSet 派生的一个类。
因为我是从我自己的数据结构中而不是从数据库中提取操作数据,所以我在我的 ProjectDataSet 类中覆盖了 GetFieldData 和 GetRecord 函数(以及其他几个函数),以便它直接从我自己的数据结构中返回数据(不做任何数据库查询)。这行得通。
为了在显示大量操作时最大限度地减少内存使用,我在 TClientDataSet 中设置了“FetchOnDemand”属性,并将“PacketRecords”设置为 100。因此,最初只有前 100 个操作出现在网格中。一旦用户滚动到网格底部,接下来的 100 个操作将由 TClientDataSet 自动获取并显示在网格中。
所有这些都非常有效。我的问题是,当用户在网格中滚动时,TClientDataSet 会继续获取越来越多的记录,而不会释放任何记录。因此,如果用户在一个非常大的项目中向下滚动足够远,我最终会耗尽内存。
所以,我的问题是:让这个 GUI 工作的最佳方法是什么?本质上,我希望网格表现得像电子表格。我希望用户能够在操作列表中上下滚动(或跳转到特定行),不管有多少操作,我不希望 GUI 组件在内存中保留很多东西用户并不迫切需要。
我假设 TDBGrid(或其他一些 VCL 组件)旨在通过一次仅获取几条记录来显示任意大的数据集,那么它是如何完成的呢?
如果我需要重新考虑 GUI,那很好。但是如果我可以使用同一个 GUI 来显示 10 个操作项目或 100,000 个操作项目,那就太好了。
谢谢。
delphi - 每行中具有不同数据类型的 Delphi 网格,动态显示
我正在尝试创建一个 Delphi 网格,以允许在 db 网格中显示和编辑每行可能具有不同数据类型的数据。我想为每种数据类型显示一个特定的控件,例如当数据类型是 DateTime 时,我想显示我的自定义编辑控件,它允许在其中键入日期或弹出日历。
数据看起来像这样:
...并且在数据库中,该表为每种可能的值类型都有一个列。所以,有一个BooleanValue
列DateValue
,等等。
我想做的是在网格中显示一个“值”列,根据该行的“数据类型”显示适当的编辑控件。因此,网格应如下所示:
看来我需要根据Value
列的值动态地为每一行显示不同的编辑控件(以允许用户编辑列)DataType
。我知道有更高级的网格可以处理这类问题,但是除了 Delphi 开箱即用的功能之外,这些功能不会允许任何事情。
关于如何制作这样的东西的任何想法?
delphi - DELPHI:将计算值放入主明细中,其中明细位于网格中
我使用 ClientDataSets(服务和插件)创建了一个主从关系。服务显示在 DBLookupComboBox (cboServices) 中,一旦选择了服务,插件就会显示在 DBGrid (grdMain) 中。
插件有一个复选框来指示插件被选中、一个名称字段、一个用户可以更改的数量字段、一个单价字段和一个总价字段。
我创建了一个 OnQuantityChange 方法来使用单价和数量更新总价,但是如何从行中获取实际数据来进行更新?如何引用各个字段以执行以下操作:
delphi - 列聚合的 TDBGrid 状态栏
得到一个包含一些数字列的网格,它需要为每一列实现一个聚合(总和或计数)并将其显示在相应的列下。
我知道某些套件(DevExpress 或其他)已经“默认”实施。但是有一种方法可以使用默认控件或 JVCL 来实现吗?
delphi - Delphi中TDBGrid上单击标题的矩形是什么?
我想确定在 TDBGrid 事件 TitleClick(Column: TColumn) 上单击的标题单元格的屏幕坐标。
我可以使用 ColWidths 属性(通过 TDBGrid = class(DBGrids.TDBGrid) 类型声明公开),但我很难确定列是否已被用户重新排序,并结合 TDBGrid 的水平滚动。我还想在随后的移动和调整大小期间跟踪此列的位置,同时注意此列可能会从网格中滚动出来。
我在这个问题上花了很长时间,而且我很擅长 Delphi,所以这不是一个无聊的问题。
delphi - 从 dbgrid 中拖动多条记录
我有一个带有一些记录的 TDbGrid。我想通过简单的拖放将多个记录拖放到列表框中。但是当我单击网格的选定记录进行拖动时选择了多个记录后,除了当前记录之外,所有选定的记录都将被取消选择。如何解决这个问题?
delphi - Delphi - DBGrid 不显示 UTF8 计算字段
我有一个 TDBGrid 链接到一个 TDataSource,后面有一个 TFibDataSet。在数据集的 OnCalcFields 上,我尝试添加字符串“Russisch (русский)”。
问题是在网格中结果显示为 :Russisch(????????)
有相同的结果
FibDataBase 组件的 ConnectParams.Charset 设置为 UTF-8。我还设置了 DBParams 值lc_ctype=UTF8
。
我在这里做错了什么?
LE:Delphi XE、Firebird 和 UTF8——这并不能解决我的问题。
LE1:问题仅出现在计算字段上。实时数据“Russisch (русский)”正确显示。
delphi - 如何在 Delphi TDBGrid 中修改单元格值
我必须在 VCL TDBGrid(Delphi XE2)中显示一些修改后的“屏蔽”值,即:将“密码”更改为“xxxxxxxx”或将大写“通过”更改为“通过”或其他。由于我的字段是动态创建的(但名称是编码的,所以我知道如何以及何时屏蔽它们,即:xxxx_PASSW 用于密码字段)我不能使用(我认为)OnGetText 事件。
那么最有效的方法是什么(因为我还使用 OnDrawColumnCell 进行一些我希望使用它的演示修改)?