【问题标题】:Delphi XE5 Firemonkey TStringGrid OnClick eventDelphi XE5 Firemonkey TStringGrid OnClick 事件
【发布时间】:2014-04-09 22:24:42
【问题描述】:

Android 上的 Delphi Firemonkey TStringGrid 有一个非常奇怪的问题。看起来 TStringGrid 上的事件在 Windows 和 android 平台上的触发方式不同。 例如:在 windows firemonkey 应用程序中,我有一个带有几列的字符串网格。 TStringGrid 设置为只读。 OnClick 事件我有以下代码:

TStringGrid(Sender).Cells[TStringGrid(Sender).ColumnIndex,TStringGrid(Sender).Selected] := 'result';

Android 应用程序具有完全相同的代码 OnClick 事件

TStringGrid(Sender).Cells[TStringGrid(Sender).ColumnIndex, TStringGrid(Sender).Selected] := 'result';

当我运行 Windows 应用程序并单击字符串网格单元格时,它会被选中,然后在单元格中写入“结果”。

点击前的窗口

点击后的窗口

当我运行 android 应用程序并单击(点击)时,会发生“结果”写入先前选择的单元格,然后我点击的那个单元格被选中。

点击前的安卓

点击后的安卓

我不确定这是 Firemonkey 中的错误还是预期的行为。有没有办法克服这个问题?

【问题讨论】:

  • 您知道 Embarcadero 论坛(delphi 的制造商)吗? forums.embarcadero.com/forum.jspa?forumID=522
  • 是的,我从 1999 年开始成为论坛成员。非常感谢您的建议,但您的评论无济于事。 Stackoverflow 拥有更多愿意提供帮助的可用用户。

标签: android delphi firemonkey delphi-xe5 tstringgrid


【解决方案1】:

TGrid 不是移动设备上受支持的控件,因此您应该避免使用它。最好的选择可能是具有自定义样式的 TListBox。

【讨论】:

  • 谢谢迈克。对于我现在在做什么,这是非常有用的信息,但我对这个事实不太满意。尽管不支持该控件,但您是否知道是什么导致了 android 和 windows 上的事件的不同行为?
  • 对不起,没有。我从来没有深入研究过台式机和移动设备之间差异的细节。您可以尝试追踪 FireMonkey 的来源,但这很可能是一段艰难的旅程。
【解决方案2】:

这可能是线程问题。但我不太确定您使用的是最好的事件处理程序。如果您尝试更新正在选择的单元格,那么我建议您处理 TStringGrid.OnSelChanged 事件。此事件在单元格选择发生更改后触发。

但请注意...它并不是严格通过鼠标点击(或手指点击)触发的。如果您在 Android 设备或桌面平台上连接了某种键盘,当您使用箭头键和其他方式时,它也会触发。我想你明白我的意思......但也许这正是你正在寻找的。​​p>

【讨论】:

  • 您好,非常感谢您的回复。不幸的是,我尝试使用 OnSelChanged,但它的行为再次不像我预期的那样。例如,如果选定的单元格是 [1, 1],并且我在单元格 [2, 2] 上单击/点击/任何内容,事件将被触发两次。首先它将在列更改时触发,而不是在行更改时触发。在那种情况下,我在单元格 [1, 2] 和 [2, 2] 中写入了“结果”。这很奇怪,但这就是它的工作原理。我对此进行了测试,它在 Windows 和 android 上的工作原理相同。
  • 您到底想完成什么?可能还有其他方法。处理鼠标事件(OnMouseUp、OnMouseDown)是可能的,但有点复杂,可能没有必要。
  • 这是一个安卓纸牌游戏的记分牌。我们可以以 yahtzee/yamb 等其他游戏为例。您可以掷骰子,根据您的策略,您可以选择在哪里写分数。当您单击单元格时,如果允许在该单元格中写入分数,则程序将计算并将您的分数写入选定的单元格。我不想用键盘输入这个。实际上最困扰我的(如果这不是错误的话)是windows上的事件和firemonkey框架上的android上的事件有时工作方式不同。是否有任何文档涵盖该主题?
  • 我认为没有任何文档。你看... FireMonkey 代码实际上是相同的(我之前看过它)。这可能与系统事件如何挂钩和/或线程有关。回到你的问题。 TStringGrid.OnClick 不是正确的事件。它甚至不会告诉您单击了哪个单元格。您需要一个 Cell 事件。我要做的是从 TStringGrid 派生一个自定义组件,该组件使用自定义的 TTextCell 类来处理单元格......并连接到该事件的 OnEnter 事件。代码不多……但需要对组件设计有一定的信心。
  • ...或者...想一想...您可以完全抛弃网格并使用 TGridLayout 并只使用 TEdits 和/或 TLabels 和/或任何其他花哨的控件你需要。这样您就可以完全控制所有事件。并且不需要自定义控件:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多