gpt4 book ai didi

delphi - DBGrid:如何防止选择一行?

转载 作者:行者123 更新时间:2023-12-03 15:54:04 25 4
gpt4 key购买 nike

我有一个条目网格,用户可以单击以对流程进行多项选择。根据第一个选定行的值,某些条目将无效。

我知道DBGrid.SelectedRows.CurrentRowSelected,但我找不到合适的地方来检查我的条件以将其设置为 True 或 False。

类似这样的事情:

var
bm: TBookmark;
CachedIdentity: String;
CanSelect: Boolean;
begin
with dgbSkypeConversations do
begin
if SelectedRows.Count > 0 then
begin
DataSource.DataSet.DisableControls;
bm := DataSource.DataSet.GetBookmark;
CachedIdentity := DataSource.DataSet.FieldByName('identity').AsString;
DataSource.DataSet.GotoBookmark(SelectedRows[0]);
CanSelect := DataSource.DataSet.FieldByName('identity').AsString <> CachedIdentity;
DataSource.DataSet.GotoBookmark(bm);
DataSource.DataSet.FreeBookmark(bm);
SelectedRows.CurrentRowSelected := CanSelect;
DataSource.DataSet.EnableControls;
end;
end
end;

我已经尝试了 Application.OnMessage 以及 DBGrid 和 Form 中的 OnMouseDown 事件,但它们不起作用,并且没有 TBookmarkList。 BeforeInsertItem 事件。我可以做什么或必须改变什么?

最佳答案

如果您查看 TCustomDBGrid.MouseDown 的源代码,您将看到它如何计算出 Mousedown 事件发生在哪个数据集行(如果有)上。您还将看到导致当前行的选择状态被切换的行:

  if ssCtrl in Shift then
CurrentRowSelected := not CurrentRowSelected

考虑到这一点,为网格设置一个 OnMouseUp 事件并在其中放置一个断点。

然后您应该注意到,由于网格的 MouseDown 事件中发生的情况,在调用 OnMouseUp 事件时,网格数据集的当前行已移动到单击的数据行(参见下面的注释)。因此,此时您可以检查当前行是否满足您希望允许用户选择它的条件,如果不满足则取消选择它。我认为这回答了您具体的“如何防止选择一行?”

作为一个用户,取消选择行为会让我有些恼火,因此您应该向用户提供一些关于取消选择该行的原因的指示。

注意:显然,网格的 Mousedown 将导致对数据集的 MoveBy 的调用,这意味着数据集的 OnScroll 事件已被解雇了。根据您想要执行的具体操作,OnScroll 事件可能是检查当前数据行是否满足您的选择标准的位置,如果不满足,则开始在那里取消选择它的过程。无论如何,数据集应该已经位于调用 DBGrid.MouseDown 事件的数据行上,这一事实应该可以让您省去在 MouseUp 中识别它的麻烦。

希望这足以让您继续前进......

关于delphi - DBGrid:如何防止选择一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36724468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com