Delphi - 恢复 DBGrid 中的实际行

2023-11-29

D6 prof.

以前我们使用DBISAM 和DBISAMTable。它处理 RecNo,并且可以很好地进行修改(删除、编辑等)。

现在我们用 ElevateDB 替换,它不处理 RecNo,而且很多时候我们使用查询,而不是表。

必须重新打开查询才能看到修改。

但是如果我们重新打开查询,我们需要重新定位到最后一条记录。 定位是不够的,因为网格将其显示在另一行中。 这是非常令人不安的事情,因为修改记录移动到另一行后,你很难跟踪它,而用户讨厌这一点。

我们找到了这段代码:

function TBaseDBGrid.GetActRow: integer;
begin
 Result := -1 + Row;
end;


procedure TBasepDBGrid.SetActRow(aRow: integer);
var
 bm : TBookMark;
begin
 if IsDataSourceValid(DataSource) then with DataSource.DataSet do begin
  bm := GetBookmark;
  DisableControls;
  try
   MoveBy(-aRow);
   MoveBy(aRow);
   //GotoBookmark(bm);
  finally
   FreebookMark(bm);
   EnableControls;
  end;
 end;
end;

原始示例是使用 moveby。这对于查询来说效果很好,因为我们看不到查询在后台重新打开,视觉控制没有改变行位置。

但是,当我们有 EDBTable 或实时/敏感查询时,使用 MoveBy 是危险的,因为如果有人删除或追加新行,我们可能会重新定位到错误的记录。

然后我尝试使用书签(见备注)。但这种技术不起作用,因为它在另一个行位置显示记录......

那么问题来了:如何强制DBGrid中的行位置和记录?

或者什么样的DBGrid可以在底层DataSet刷新后重新定位到记录/行?

我寻找用户友好的解决方案,我理解它们,因为我尝试使用这种跨 DBGrid 的跳转,但使用起来非常糟糕,因为当我尝试在更新后查找原始记录时,我的眼睛都快要出来了...:-(

感谢您的每一个帮助、链接、信息: DD


既然“MoveBy”正在为您工作,请使用它们。

在关闭数据集之前获取“书签”。完成您的工作,重新打开数据集,然后使用“MoveBy”在网格上重新定位您的记录。完成后,获取另一个书签并使用 DataSet.CompareBookmarks 将其与前一个书签进行比较。如果结果为 0 则很好,如果不是,则仅对前一个书签发出“GotoBookmark”。

这样,只要其他用户没有删除/插入记录,您的网格就不会显得跳跃,如果不是这种情况,至少您会在同一条记录上。


edit:下面是一些代码示例,即使数据集中存在删除/插入操作,也应将所选记录重新放置在正确的位置。请注意,为了简单起见,代码省略了禁用/启用控件,以及填充网格的记录较少时的特殊情况。

type
  TAccessDBGrid = class(TDBGrid);

procedure TForm1.Button1Click(Sender: TObject);
var
  BmSave, Bm: TBookmark;
  GridRow, TotalRow: Integer;
begin
  GridRow := TAccessDBGrid(DBGrid1).Row;
  TotalRow := TAccessDBGrid(DBGrid1).RowCount;
  BmSave := DBGrid1.DataSource.DataSet.GetBookmark;
  try

    // close dataset, open dataset...

    if DBGrid1.DataSource.DataSet.BookmarkValid(BmSave) then
      DBGrid1.DataSource.DataSet.GotoBookmark(BmSave);
    Dec(TotalRow);
    if GridRow < TotalRow div 2 then begin
      DBGrid1.DataSource.DataSet.MoveBy(TotalRow - GridRow);
      DBGrid1.DataSource.DataSet.MoveBy(GridRow - TotalRow);
    end else begin
      if dgTitles in DBGrid1.Options then
        Dec(GridRow);
      DBGrid1.DataSource.DataSet.MoveBy(-GridRow);
      DBGrid1.DataSource.DataSet.MoveBy(GridRow);
    end;
    Bm := DBGrid1.DataSource.DataSet.GetBookmark;
    try
      if (DBGrid1.DataSource.DataSet.BookmarkValid(Bm) and
          DBGrid1.DataSource.DataSet.BookmarkValid(BmSave)) and
          (DBGrid1.DataSource.DataSet.CompareBookmarks(Bm, BmSave) <> 0) then
        DBGrid1.DataSource.DataSet.GotoBookmark(BmSave);
    finally
      DBGrid1.DataSource.DataSet.FreeBookmark(Bm);
    end;
  finally
    DBGrid1.DataSource.DataSet.FreeBookmark(BmSave);
  end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi - 恢复 DBGrid 中的实际行 的相关文章

  • 如何使用引脚和选项卡像 Delphi IDE 一样进行拖动和停靠?

    我想让 拖放 和 停靠 在我的应用程序中像在 Delphi IDE 中一样工作 即能够在对象检查器 结构视图周围拖动并将它们停靠在合适的位置 我在将表单对接到 PageControl 方面取得了相当大的成功 但想知道是否有人知道如何让它与小
  • 如何使用Delphi 2010优化上传例程?

    My 尚未发布Delphi 2010 应用程序允许用户将他们的文件上传到我的服务器 现在我使用 HTTPS POST 发送文件 简化的 算法基本上是 将文件拆分为 片 每个片 256KB 对于每个切片 将其 POST 到服务器 IE 对于
  • 当存在变量空间分隔列时,在 python (numpy) 中加载数据集

    我有一个包含数字数据的大数据集 并且在其某些行中存在分隔列的可变空间 例如 4 5 6 7 8 9 2 3 4 当我使用这条线时 dataset numpy loadtxt dataset txt delimiter 我收到此错误 Valu
  • 使用 linq 将数据集列表

    我有一个DataSet我想转换DataSet into List
  • 如何使用Delphi在Win7防火墙中打开端口

    我想在 Windows 7 防火墙中打开一个端口 以便通过 Delphi 进行端口转发 但正如其他线程中所说 Windows 7 在防火墙中有多个配置文件 公共 私有 下一个代码仅向其中之一添加例外 Code procedure addPo
  • TVirtualStringTree 中的自动调整列大小

    攀登 TVirtualTreeView 的学习之山 我尝试创建一个自定义后代 以确保在调整控件大小时 最后一列的宽度完全填充控件的宽度 而不需要水平滚动条 我看到许多与 AutoFitColumns 相关的项目 一个方法和许多事件 但没有涵
  • ASP.NET 数据集与业务对象/ORM

    我正在考虑 ASP NET 应用程序的数据访问 来自一家使用大量带有客户端数据集的 Windows 应用程序的公司 自然而然地倾向于使用数据集方法来处理数据 我更热衷于业务对象方法 并且不喜欢在会话中缓存数据集然后应用更新的想法 有谁有任何
  • 为什么 memo.Lines 使用 TStrings 而不是 TStringList?

    为什么Memo Lines使用抽象类TStrings 为什么不使用TStringList反而 我应该将其转换为TStringList在使用它之前 TMemo Lines TListBox Items TComboBox Items ETC
  • 如何使用 Delphi XE2 IDE 搜索来搜索

    我一直使用搜索来在 庞大的 应用程序源中查找内容 因此搜索有效性对我来说非常重要 目前在 Delphi XE2 IDE 中我喜欢使用 在文件中查找 包括子目录 没有其他花哨的东西 只是一个文本关键字 这工作正常 但我真正想做的是扩展我现在正
  • 如何创建 Delphi Android 应用程序 APK 来包含文件

    如何将文件和 或包含 Android 应用程序 APK 文件的文件的文件夹包含在内 Delphi 运行过程会擦除 Assets 目录的内容 并且我放置在那里的文件 文件夹不包含在 APK 包中 我假设您必须手动将 System Startu
  • TensorFlow 数据集的函数 cache() 和 prefetch() 有何作用?

    我正在关注 TensorFlow图像分割 https www tensorflow org tutorials images segmentation教程 其中有以下几行 train dataset train cache shuffle
  • 使用Delphi Dll和一些问题

    我想使用Delphi制作的dll 它有这个功能 函数 CryptStr str Key AnsiString DecryptStr boolean AnsiString 标准调用 我将 Dll 复制到 bin debug 和应用程序根目录中
  • Delphi:MDI应用程序中的最大化子窗体

    如何最大化仅适合客户区而不适合整个父窗口的子窗口 我不希望子窗口在父窗口的主菜单或其他控件下消失 我有这个代码 procedure WMSIZE var Msg TMessage message WM SIZE procedure TFor
  • Delphi 有通用的“对象池”实现吗?

    我在寻找 Delphi 的数据库连接池实现时遇到了这个问题 对象池需要两个方法 get 从池中获取一个对象 如果池为空或者其大小尚未达到最大大小 这将创建一个新实例 此方法必须是线程安全的 以便两个线程不能同时获取一个对象同一时间 如果所有
  • 可以解析Delphi XMLDoc格式并构建在线帮助的工具

    API 文档的 XMLDoc 工具解释如下 http edn embarcadero com article 32770 http edn embarcadero com article 32770 是否有任何免费或商业工具可用于创建基于
  • Windows EventLog:它的操作速度有多快?

    我有一个服务应用程序 它通过 TCP 处理客户端请求并将任何事件写入 Windows EventLog 由于该应用程序预计会在短时间内为许多客户端和每个客户端的大量请求提供服务 假设每秒 1 到 50 个请求 因此我很想知道密集程度 CPU
  • 构建多线程 TCP/IP 服务器

    我想构建一个可供最多 100 个并发客户端使用的 TCP IP 服务器 但仍不确定如何开始 至少我需要服务器 监听客户端 并将它们全部存储在数组或列表中 对于每个客户端 它需要根据其客户端状态接收和发送数据 当有人连接或断开连接时 服务器应
  • 德尔福:idHttp+SSL

    请解释一下如何使用 SSL https 从服务器下载文件 我在互联网上没有找到合适的答案 每个人都说 TIdSSLIOHandlerSocket 但我只有 TIdSSLIOHandlerSocketOpenSSL 如果我使用 TIdSSLI
  • 如何获取特定名称的行索引号?

    如何确定与特定行名称对应的行索引号 我有一个行名称向量 我想使用它们来获取矩阵中相应行索引的向量 I tried row and as integer rownames matrix object 但似乎都不起作用 此外which 你可以看
  • 在 Pascal 中将文本文件中的字符串读入数组

    使用这个程序 我试图读取一个文件并将其随机打印到控制台 我想知道是否必须使用数组 例如 我可以将字符串分配到一个数组中 然后从数组中随机打印 但是 我不确定如何解决这个问题 另一个问题是 我当前的程序没有从我的文件中读取第一行 我有一个文本

随机推荐

  • java数学计算给定半径1.00的圆的坐标

    在我的一项作业中 我被要求编写一个程序来计算半径为 1 0 的圆上的点的 x y 坐标 以 0 1 为增量显示范围从 1 00 到负 1 00 的所有 x 值的 y 值输出 并使用以下命令整齐地显示输出printf 其中所有 x 值都垂直对
  • 如何直接进入函数而不进入参数的中间函数?

    在 Visual Studio 2013 或任何版本 中 我正在调试 C 项目 我希望能够绕过单步执行由于参数传递到感兴趣的函数而被调用的中间函数 我怎样才能绕过进入这些中间函数 不直接感兴趣 并直接进入我感兴趣的函数 例如 假设我有一个函
  • 如何在freemarker中自定义数字格式?

    我正在使用 freemarker 并尝试以这种格式显示数字 3 343 434 00例如 这很容易通过使用来解决 total string currency 假设 总数 是某个数字 但是 当我有负数时 它会像这样显示 343 34 而不是这
  • 比较 R 中的 svd 和 princomp

    我想要得到singular values of a matrix in R获取主成分 然后也使用 princomp x 来比较结果 我知道 princomp 会给出主要成分 Question 如何从 d u 和 v 中获取主成分 解决方案s
  • 使用Python组合所有视频的特征

    假设我有 20 个视频 它们具有相同的场景 尺寸和来自同一台相机 让我们假设这二十个视频中的一个有一个人走过 所有其他视频大多相同 除了微小的自然变化 例如风吹树叶等 我正在寻找一种将所有 20 个视频合并为 1 个视频的好方法 我所说的合
  • 尝试加载使用存储传递的数据

    我正在尝试获取正在传递的数据并将其加载到各种文本字段中 现在 我有一个 html 文件 其中包含以下内容 然后 我有一个 js 文件 其中包含我的整个布局以及所有文本字段等以及我的整个商店 到目前为止 我的商店尝试加载数据 但我不确定尝试从
  • 如何启动 ajax 推送网站(activemq 或 cometd 或其他)?

    我想启动一个使用 ajax 推送的应用程序 但是应该正确配置 Web 服务器 并且我不知道如何在服务器端组件上启动 我想从道场彗星然后读了一些博客说activeMQ是较旧的 也是 ajax 推送方面的旗舰载体 但也有另一个博客说它很难设置并
  • 使用 Provider 和模型类搜索/过滤 ListView

    我想通过在搜索字段中输入的文本来过滤列表视图 在线和本网站上有很多示例 但所有内容都过于简化 所有内容都在一个有状态的小部件中 和 或看起来有点混乱 可能不是构建事物的最佳方式 我有一个简单的应用程序 它使用 Provider 一个模型类
  • 如何在reactjs中显示多个标签?

    我制作了一张添加新用户卡 上面有一个加号 我制作了额外的卡片 在每张卡片上显示用户名 显示用户名的卡片使用以下方式显示 map 方法 现在 如果我将第 1 部分代码 见下文 插入到 map 功能后会显示多个添加新用户卡 我的最终目标是显示单
  • 当您使用内存覆盖前缀但所有操作数都是寄存器时会发生什么?

    当您使用内存覆盖前缀但所有操作数都是寄存器时会发生什么 那么 假设您编写了代码mov eax ebx or add eax ebx默认值为 32 位 但您使用 67h 覆盖 处理器如何处理这种情况 英特尔软件开发人员手册 第 2 卷 第 2
  • 如何在嵌套上下文中通过 __VA_OPT__ 扩展递归宏

    我读过了本文 这说明了如何 VA OPT 函数宏可用于递归扩展宏 我想实现类似的东西 不同之处在于宏是在嵌套上下文中扩展的 输入 NEST RECURSIVE A B C 应该产生 顺序无关 C B A 我的方法稍微概括了这篇文章 defi
  • 我们可以在 Route 53 AWS DNS 服务中创建多少个子域?

    在我的应用程序中 我为每个帐户提供一个子域 如 user domain com 因此 我计划使用 AWS Route 53 将子域路由到我的应用程序 Amazon Route 53 中的子域是否有最大限制 提前致谢 我给出了一个子域 例如u
  • pandas 数据框中的数据透视表

    我有一个要求 我试图计算值并将它们放入数据透视表中 这是我的数据框 Cola Colb Apple Rippened Orange Rippened Apple UnRippened Mango UnRippened 我希望输出是这样的 R
  • 使用谷歌地图 API 从 iPhone 进行反向地理编码纬度/经度

    我目前正在使用谷歌地图的反向地理编码 API 将从 iPhone 的 CoreLocation API 接收到的经 纬度转换为谷歌应用程序引擎服务器上的城市 州信息 这会被视为违反条款吗 我做了一些研究 但找不到这个问题的直接答案 现在 我
  • 合并重叠区间

    目前 我的间隔时间为 temp tuple 25 14 21 16 20 15 10 7 8 5 6 3 2 4 2 3 3 6 12 15 13 18 14 17 22 27 25 30 26 29 按下限升序排列 我的任务是合并重叠的间
  • 在 Jersey 1.19.1 上禁用 WADL 生成

    我在一个带有 Java Jboss 的 Web 项目中使用 Jersey 1 19 1 每次我从 Web 服务请求某些内容时 它都会在 server log 上显示此条目 ERROR STDERR com sun jersey server
  • Android 上未找到类异常

    我从网上得到了一些酸味 并导入到我的工作区 当我在模拟器上运行时 它会抛出 05 28 17 30 47 895 E AndroidRuntime 840 java lang RuntimeException Unable to insta
  • Yajra Laravel 数据表 - 合并列值

    我已将 Yajra Datatables 包含在我的 Laravel 项目中并且工作正常 问题是我需要合并 3 个列值并将它们显示为 1 并允许同时搜索 我怎么做 我能够使用渲染功能并在单列中显示数据 但那么如何搜索呢 Mysql 表示例
  • 使用 InnerJoin Firebird 删除语句

    我创建此 select 语句是为了查找要删除的重复行 我虽然只是将 SELECT TO DELETE 更改为它会删除行 但事实并非如此 这是选择语句 select FROM MYCARD T1 INNER JOIN SELECT IDCAR
  • Delphi - 恢复 DBGrid 中的实际行

    D6 prof 以前我们使用DBISAM 和DBISAMTable 它处理 RecNo 并且可以很好地进行修改 删除 编辑等 现在我们用 ElevateDB 替换 它不处理 RecNo 而且很多时候我们使用查询 而不是表 必须重新打开查询才